Blog/Spring

스프링 프레임워크 입문 - 의존성 주입(Dependency Injection)

chaniii 2020. 4. 19. 20:41

 

  • 의존성 주입 (Dependency Injection)

필요한 의존성을 어떻게 받아올 것인가?

스프링에서 제공하는 다양한 의존성 주입 방법에 대해 알아본다.

 

@AutoWired (생성자 대신)

강의에서는 생성자 대신에 오토 와이어드로 바꾸고 빌드했더니 css가 깨졌는데 메이븐 패키지를 해주면 해결됨

 

여기서 스프링 버전 4.3 이상부터는 생성자에 오토와이어드 애노테이션을 생략할 수 있다.

 

아니면 setter에 @AutoWired 붙이는 방법

이러면 스프링 ioc 컨테이너가 이 인스터스를 만들고 세터를 통해서 ioc 컨테이너에 들어있는 빈 중에 오너 리파지토리 타입을 찾아서 넣어준다. 

 

 

@AutoWired / @Inject를 어디에 붙이나?

  1. 생성자

  2. 필드 (위에 애노테이션)

  3. 세터

 

이 중에서 스프링 프레임워크 레퍼런스에서는 생성자를 권장한다.

생성자를 사용하는 방법이 좋은 이유?

필수적으로 사용해야 하는 레퍼런스 없이는 이 인스턴스를 만들지 못하도록 강제할 수 있다.

전의 강의해서 말했던 것과 같이 없으면 동작할 수 없는 객체가 있을 시 생성자를 이용하면 반드시 있도록 만들어주기 때문

필드나 세터 인젝션은 의존성 없이도(반드시 필요한 객체 없이도) OwnerController 인스턴스를 만들 수 있음, 이는 장점이 될 수도 단점이 될 수도 있음. 

생성자를 이용한 방법은 순환 참조일 때(a가 b를 참조하고 b가 a를 참조할 때) 인스턴스를 만들 수 없음, 멈춤(애플리케이션 오류)

이럴 경우 세터나 필드 인젝션을 사용하면 일단 인스턴스를 만들고 그 다음에 서로 인스턴스를 주입해 줄 수 있음, 만들 수 있음

그러나 이런 경우 아니면 생성자가 권장

 

과제 : OwnerController에 PetRepository 주입하기

 

1. 필드 방법

@AutoWired
private PetRepository petRepository; // final이면 오류임, 필드 인젝션할 때 인스턴스를 무조건 일단 만들고 주입 나중에 받는 거라서

 

2. 생성자 방법

private final PetRepository petRepository; // 여기서는 파이널이 가능한 이유는 생성자로 처음 만들 때 동시에 주입하므로

public OwnerContorller(OnwerRepository clinicService, PetRepository petRepository){

    this.owners = clinicService
    this.petRepoistory = petRepository;

}

 

3. 세터 방법

@AutoWired
public void setPetRepository(PetRepository petRepository){

    this.petRepoistory = petRepository;

}