객체의 의존성

 한 객체가 다른 객체를 참조(사용)하고 있다면, 객체 사이에 의존성이 존재하게 된다.

 

A가 B를 사용한다.

A가 B에 의존한다.

 

 위와 같은 상황은 다음과 같이 말할 수 있다.

 

B의 변화가 A에 영향을 준다. 

 

 객체 사이의 의존성은 실제 코드로 살펴보면 다음과 같은 형태로 나타난다.

 

이처럼 하나의 객체가 다른 객체를 직접 생성하여 가지고있다면 객체 사이에 강한 결합이 존재하게 된다. 위 코드에서 repository의 다른 구현을 테스트하고자 한다면 객체 생성 부분의 코드를 수정하여야 한다. 또한, 변경사항이 생길때마다 기존의 코드를 수정하여야 할 것이다. 이런 상황을 피하기 위해 의존성 주입 패턴을 적용시킬 수 있다.

 

 

 

의존성 주입(Dependency Injection)

의존성 주입(DI)이란 디자인 패턴 용어로, 하나의 객체가 다른 객체에 의존성을 제공하는 패턴이다. 의존성 주입 패턴에서는 사용하고자 하는 객체의 실제 구현체를 나중에 할당하는 것으로 미룰 수 있으며, 이를 통해 같은 코드를 여러 가지 구현에 사용할 수 있다. 의존성 주입을 사용하면 객체간의 결합이 느슨해지고 객체들을 독립적으로 분리할 수 있어 유지보수성이 좋아진다. 의존성 주입 패턴을 적용하여 보다 일반적인 의미로 쓰이는 IoC(Inverse of Control, 역제어)를 구현할 수 있다.

 

Controller를 사용하는 쪽에서 repository를 생성하여 넣어준다.

 

 

Spring에서의 DI

Spring Framework의 Container를 통해 DI를 쉽게 사용할 수 있다. Container는 응용 프로그램을 구성하는 bean이라는 객체를 관리하며 필요한 객체를 찾아 알아서 주입해준다. 간단한 사용 예시는 다음과 같다.

 

1. 객체를 사용하는 쪽 (@Autowired)

 사용할 객체의 field에 @Autowired 어노테이션을 표기하여 의존성 주입을 사용할것임을 명시한다. 

 

2. 의존성 주입을 수행하는 쪽(@SpyBean)

 의존성 주입을 수행하는 쪽(예시에서는 test 함수)에서는 @SpyBrean 어노테이션에 어떤 구현 클래스를 사용할것인지 명시하여 다음과 같이 선언한다.

 

위 코드를 실행할 경우, 실행 단계에 spring이 해당하는 클래스의 bean을 찾아 1번의 @Autowired 변수에 할당해주며 프로그램이 동작하게 된다.

 

 


인터페이스를 사용해서 실제 구현은 나중에 넘겨주는 패턴까지는 이해했는데

spring에서 동작시키려니까 혼란스럽다.. 미래의 내가 이해하길 바래

'개발노트' 카테고리의 다른 글

Lombok, Builder Pattern  (0) 2020.03.24
REST API  (0) 2020.03.19
[Spring] 가짜 객체(Mock Object)  (0) 2020.03.18
Test Driven Development 실습  (0) 2020.03.12
[Spring Boot] Spring Boot 시작하기  (0) 2020.03.11

+ Recent posts