스프링(Spring)의 의존성 주입 방법 3가지

4469 단어 SpringSpring

1. 생성자 주입

class SomeController {
	private final SomeRepository someRepository;
    
    @Autowired
    public SomeController(SomeRepository someRepository) {
    	this.someRepository = someRepository;
    }
}
  • 클래스 생성자에 @Autowired 어노테이션을 사용해서 의존성을 주입합니다
  • 필드에 final을 붙일 수 있다는 장점이 있습니다 (이것이 왜 장점이 되는지는 후술하겠습니다)
  • 단일 생성자인 경우에는 @Autowired를 생략하는 것도 가능합니다

2. 필드 주입

class SomeController {
	@Autowired
    private final SomeRepository someRepository;
}
  • 필드에 @Autowired 어노테이션을 사용해서 의존성을 주입합니다

3. 수정자 주입

class SomeController {
    private final SomeRepository someRepository;
    
    @Autowired
    public void setSomeRepository(SomeRepository someRepository) {
    	this.someRepository = someRepository;
    }
}
  • setter 메서드에 @Autowired 어노테이션을 사용해서 의존성을 주입합니다

4. 생성자 주입을 사용해야 하는 이유

Spring Framework에서 공식적으로 권장하고 있는 방식은 생성자 주입입니다. 그것도 매우 강력하게!

  • 실제로 인텔리제이에서 필드 주입을 사용하면 다음과 같은 경고 메세지가 등장합니다
  • 그렇다면 왜 필드 주입, 수정자 주입은 지양해야하고 생성자 주입을 사용해야 하는 것일까요?

불변

  • 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없습니다

    • 수정자 주입을 사용하면 수정자를 public으로 열어두어야 합니다

    • 변경하면 안되는 메서드를 열어두는 것은 좋은 설계라고 보기 힘듭니다

  • 또한 생성자 주입을 사용하면 final을 필드에 붙일 수 있게 됩니다

    • 이 경우 자바 컴파일러가 생성자에서 이를 초기화하지 않는 경우 경고 메세지를 날려줍니다

    • 혹시라도 실행할 경우, 오류를 컴파일 시점에서 잡아낼 수 있습니다.

  • @RequiredArgsConstructor를 사용하면 fianl이 붙은 필드들에 대한 자동 생성자 주입 편의성을 제공받을 수 있습니다^^


누락

  • 프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우,

    • 필드 주입 방식은 생성 시점에 의존성 주입할 수 있는 방법이 없습니다. 무조건 클래스 내부에서 구현을 가져가야 하는 것입니다

    • 수정자 주입 방식은 NullPointerException이 터져버릴 수도 있습니다. 객체 생성 시점에 어떤 의존관계 주입을 해줘야 하는지가 드러나지 않기 때문입니다

  • 생성자 주입을 사용하면 컴파일 시점에 이 누락 오류를 잡아낼 수 있습니다.


순환참조 감지

https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/
이 블로그에서 정말 기가막히게 명쾌한 예시와 함께 설명을 해주고 계십니다.
결론만 말씀드리면, 생성자 주입은 컴파일 시점에 객체의 순환참조까지 감지할 수 있다는 것!


5. 결론

단점은 없고 장점만 가득한 생성자 주입을 사용합시다~

좋은 웹페이지 즐겨찾기