스프링(Spring)의 의존성 주입 방법 3가지
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. 결론
단점은 없고 장점만 가득한 생성자 주입을 사용합시다~
Author And Source
이 문제에 관하여(스프링(Spring)의 의존성 주입 방법 3가지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mincho920/Spring의-의존성-주입-방법-3가지저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)