class SomeController {
private final SomeRepository someRepository;
@Autowired
public SomeController(SomeRepository someRepository) {
this.someRepository = someRepository;
}
}
class SomeController {
@Autowired
private final SomeRepository someRepository;
}
class SomeController {
private final SomeRepository someRepository;
@Autowired
public void setSomeRepository(SomeRepository someRepository) {
this.someRepository = someRepository;
}
}
Spring Framework에서 공식적으로 권장하고 있는 방식은 생성자 주입입니다. 그것도 매우 강력하게!
대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없습니다
수정자 주입을 사용하면 수정자를 public으로 열어두어야 합니다
변경하면 안되는 메서드를 열어두는 것은 좋은 설계라고 보기 힘듭니다
또한 생성자 주입을 사용하면 final을 필드에 붙일 수 있게 됩니다
이 경우 자바 컴파일러가 생성자에서 이를 초기화하지 않는 경우 경고 메세지를 날려줍니다
혹시라도 실행할 경우, 오류를 컴파일 시점에서 잡아낼 수 있습니다.
@RequiredArgsConstructor를 사용하면 fianl이 붙은 필드들에 대한 자동 생성자 주입 편의성을 제공받을 수 있습니다^^
프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우,
필드 주입 방식은 생성 시점에 의존성 주입할 수 있는 방법이 없습니다. 무조건 클래스 내부에서 구현을 가져가야 하는 것입니다
수정자 주입 방식은 NullPointerException이 터져버릴 수도 있습니다. 객체 생성 시점에 어떤 의존관계 주입을 해줘야 하는지가 드러나지 않기 때문입니다
생성자 주입을 사용하면 컴파일 시점에 이 누락 오류를 잡아낼 수 있습니다.
https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/
이 블로그에서 정말 기가막히게 명쾌한 예시와 함께 설명을 해주고 계십니다.
결론만 말씀드리면, 생성자 주입은 컴파일 시점에 객체의 순환참조까지 감지할 수 있다는 것!
단점은 없고 장점만 가득한 생성자 주입을 사용합시다~