다양한 의존관계 주입에 대해서 정리하자 !
김영한 선생님의 강의 내용을 토대로 공부한 내용을 정리했습니다.
1. 생성자 주입
- 생성자를 통해서 의존관계를 주입하는 방법이다.
- 생성자 호출 시점에 딱 1번 주입되는 것이 보장된다.
@Component
public class Student{
// final로 선언해서 값세팅을 강제한다.
// 값 설정하지 않을 경우 compile 오류!
private final Book book;
public Student(Book book){
this.book = book;
}
}
2. 수정자 주입
- setter를 통해서 의존관계를 주입하는 방법이다.
- 의존관계의 선택, 변경이 필요한 경우 사용한다.
@Component
public class Student{
private Book book;
@Autowired
public void setBook(Book book){
this.book = book;
}
public Student(Book book){
this.book = book;
}
}
3.필드 주입
- 코드가 간결해서 많이 사용했지만, 현재는 권장하지 않는다.
- 만약 변경하고 싶을 경우 변경할 방법이 없다. 이를 위한 추가적인 코드가 더 많이 사용된다.
- DI 프레임워크가 없으면 사용할 수가 없다.
- 애플리케이션과 상관없는 테스트 코드에서만 사용하자.
@Component
public class Student{
@Autowired
private Book book;
}
4. 일반 메서드 주입
- 아무 메서드에서 사용가능 하다.
- 일반적으로 잘 사용하지 않는다.
@Component
public class Student{
private Book book;
@Autowired
public void init(Book book){
this.book = book;
}
}
이 중에서 가장 유용한 방법은 생성자 주입 방법이다.
final 로 선언함으로써 컴파일 단계에서 명확하게 의존관계를 확인할 수 있다.
또한, 생성자에서만 값을 세팅할 수 있다는 장점이 있다.
수정자 주입을 포함해서 나머지 주입방식은 모두 생성자 이후에 호출되므로, 필드에 final 키워드를 사용할 수 없다.
생성자 주입을 항상 사용하고, 가끔 옵션이 필요한 경우에만 수정자 주입을 사용하도록 하자.
출처 : 인프런 김영한 - 스프링 핵심 원리 기본편