class OwnerController {
private OwnerRepository repository = new OwnerRepository();
이와 같은 경우는 의존성에 대한 제어권이 사용하는 클래스 , 즉 내가 사용할 의존성을 내가 만들었다 할 수 있다.
class OwnerController {
private OwnerRepository repo;
public OwnerController(OwnerRepository repo) {
this.repo = repo;
}
}
class OwnerControllerTest {
@Test
public void create() {
OwnerRepository repo = new OwnerRepository();
OwnerController controller = new OwnerController(repo);
}
}
여기서 객체를 생성해 주는 역할을 하는 것이 IoC Container이다.
위와 같은 경우는 개발자가 직접 테스트에서 IoC Container에 객체 의존관계를 외부에서 직접 주입한 경우이고 spring에서 @Autowired 어노테이션을 활용하면 연관된 객체를 IoC Container에 찾아서 넣어준다.
의존성 주입(DI)에는 위처럼 생성자를 이용한 방법과 Filed 변수에 주입하는 하는 법 setter 메소드를 이용하여 주입하는 방법이 있다.
@Autowired
private OwnerService OService;
private OwnerService OService;
@Autowired
public void setOService(OwnerService OService){
this.OService = OService;
}
setter 주입 방법은 주입 받으려는 빈의 생성자를 호출하여 빈을 찾거나 빈 팩토리에 등록 후 생성자 인자를 사용하는 빈을 찾아 생성하고 주입하려는 빈 객체의 수정자를 호출하여 주입한다.
필드 주입과 setter 주입 방법은 런타임에서 의존성을 주입하기 때문에 의존성을 주입하지 않아도 객체가 생성될 수 있다.
스프링에서는 필드주입과 , setter 주입 보다는 생성자 주입을 권고하는데 그 이유로는
1-2 IoC Container
: 객체를 생성, 관리, 의존성에 관련된 일을 해주는 컨테이너
** TDD
DI , Depndency Injection : 의존성 주입
각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결
스프링의 DI가 의존성 주입이라면 AOP는 코드 주입
주요 기능과 핵심 기능 구현을 위한 부가적인 기능 구현을 분리하여 각각의 관점별로 묶어서 개발하는 형식