객체가 사용(의존)할 파라미터를 외부에서 선언하고, 이를 주입받아서 사용하는 방법!
응집도를 높이고, 결합도를 낮출 수 있다.
1. 유지보수가 용이하다.
2. 재사용성이 높은 코드가 된다.
3. 기능이 분리되어 가독성이 높아진다.
public class User {
private String email;
private String password;
@Autowired
public User(String email, String password){
this.email = email;
this.password = password;
}
}
public class User {
private String email;
private String password;
@Autowired
public void setEmail(String email){
this.email = email;
}
@Autowired
public void setPassword(String password){
this.password = password;
}
}
public class User {
@Autowired
private String email;
@Autowired
private String password;
}
결론적으로 말하면, 생성자 주입이 가장 안전하다.
1. NullPointerException을 사전 방지하여 Database를 보호가능
2. final로 필드를 선언하여 활용 - 데이터를 보호할 수 있다.
3. 코드를 조금 더 간결하게 만들기 위한 Lombok 어노테이션을 활용할 수 있다.
4. 단위 테스트 코드를 작성하기 편리하다.
5. 객체 생성 시점에서 미리 순환 참조를 발견하고 방지할 수 있다. (스프링/스프링부트에서 해당 됨)
참고한 글 :
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/
https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/