본문 바로가기
spring

[백기선_Spring]DI

by devebucks 2020. 7. 27.
728x90

공부할 때 본 강의

https://www.youtube.com/watch?v=IVzYerodIyg&list=PLfI752FpVCS8_5t29DWnsrL9NudvKDAKY&index=8

 

Dependency Injection = 의존성 주입

의존성을 주입받는 방법 = 서로 다른 객체가 서로 참조하는 방법

 

의존성 주입에 사용되는 어노테이션

@Autowired

- 생성자, 필드, Setter에 모두 사용이 가능합니다.

@Inject

 

의존성 주입 방법은 3가지가 있다고 합니다.

1. 필드에 의존성을 주입한다. 

-@Autowired를 붙여줘야 합니다.

- 주입받을 객체는 Bean으로 등록이 되어 있어야 합니다.

- 각 객체가 서로 인스턴스를 만든 다음에 의존성을 주입할 수 있으므로, 상호참조하는 문제를 해결할 수 있다.

 

2. Setter로 의존성을 주입받는다.

- 주입받을 객체는 Bean으로 등록이 되어 있어야 합니다.

- 각 객체가 서로 인스턴스를 만든 다음에 의존성을 주입할 수 있으므로, 상호참조하는 문제를 해결할 수 있다.

 

3. 생성자에 의존성을 주입한다.

- 상호참조 해결 안됨.  

- Spring 4.3버전 이상부터는 클래스에 생성자가 하나뿐이고, 생성자가 참조하는 객체가 빈으로 등록이 되어 있다면, @Autowired어노테이션 없이 의존성을 주입받을 수 있다고 합니다.

 

추천되는 방법은?

생성자로 주입하는 방식이 추천되는 방식이라고 합니다.

주입받는 객체가 필요로하는 의존성 객체가 있어야만 한다는 강제성이 생기기 때문입니다. 필드와 setter를 이용해서 의존성을 주입하게 될 경우, 주입받는 객체는 의존성 객체가 없이도 생성자를 만들 수 있기 때문에 의존성에 문제가 생겨도 애플리케이션은 동작할 수 있습니다. 

과제.

OwnerController에 PetRepository주입하기

public interface PetRepository extends Repository<Pet, Integer>{
...
}

 

//1. 생성자로 주입받는 법
@Controller
class OwnerController{
   private final PetRepository petRepository;

   public void OwnerController(PetRepository pet){
      this.petRepository = pet;
   }
}
//2. 필드로 주입받는 법.
@Controller
class OwnerController{
   @Autowired
   private PetRepository petRepository; //final을 안쓰는 이유는 final을 사용하면 인스턴스를 초기화 해주는 값이 반드시 필요한데, 여기선 petRepository에 대해서 초기화가 필요가 없어서 그렇다.
}
//3. Setter로 주입받는 법.
@Controller
class OwnerController{
   private PetRepository petRepository;
   @Autowired
   public void setPetRepository(PetRepository petRepository){
      this.petRepository = petRepository;
   }
}
728x90

댓글