일반적인 제어권: "내가 사용할 의존성은 내가 만든다"
class OwnerController{
private OwnerRepository repository= new OwnerRepository();
} // OwnerContoller가 사용할 의존성을 스스로 만들어서 사용하고 있음. 즉, 제어권이 OwnerController 본인한테 있음
=> 의존성 제어권의 역전
class OwnerController{
private OwnerRepository repo;
public OwnerController(OwnerRepository repo){
this.repo= repo; //의존성 관리를 외부에 넘긴다(Dependency Injection(의존성 주입) -> Ioc의 일종)
}
}
class OwnerControllerTest{
@Test
public void create(){
OwnerRepository repo= new OwnerRepository(); //OwnerRepository 타입의 repo repo 객체를 만들고
OwnerController controller= new OwnerController(repo); //OwnerController의 객체를 만드는 생성자 메서드에 넘겨줌으로써 OwnerController 객체가 만들어진다.
}
}
즉, OwnerControllerTest가 OwnerController에 있는 repo 객체의 의존성을 주입해준 것이다.(Ioc)
이와 같이, 스프링의 IoC 컨테이너가 객체를 빈으로 등록하고, 관리하는 역할을 한다.
빈(Bean)을 만들고 ,빈들 사이의 의존성을 엮어주고, 빈들을 제공해준다
빈 설정(ApplcationContext에 있는 빈 조회하기)
스프링 IoC 컨테이너가 관리하는 객체. 빈들만 의존성 주입을 해줌
등록하는 방법(To IoC Container)
Component Scanning(해당 어노테이션이 붙어있는 모든 클래스를 찾아 그 클래스의 인스턴스를 빈으로 등록)
빈으로 직접 등록
@Configuration //빈 설정 파일
public class SampleConfig{
@Bean
public SampleController sampleController(){
return new SampleController();
}
}// SampleController를 직접 빈으로 등록
의존성 주입받는 방법
필요한 의존성 주입받는 방법
@Autowired와 @Inject를 붙이는 곳
필드
@Autowired
private OwnerRepository owners;
생성자(스프링 4.3부터 클래스에 생성자가 단 하나이고, 생성자로 주입받는 매개변수가 빈으로 등록되어 있다면, 해당 빈을 자동으로 주입 해줌)
@Autowired
public OwnerController(OwnerRepository clinicService){
this.owners=clinicService;
}
setter
@Autowired
public void setOwner(OwnerRepository owners){
this.owners= owners;
}
생성자를 사용하는 방법을 권장(필수적으로 사용 해야 하는 레퍼런스 없이는 해당 인스턴스를 만들 수 없도록 강제함)