불변이다.
- 의존관계를 설정하는 부분과 시스템을 돌아가게하는 부분은 분리되어야 한다. (CleanCode)
- 변경 가능성을 최소화하라. (Effective Java)
- 수정자 주입을 사용하려면 setter 를 public 으로 열어야한다.
- 객체의 상태가 변경가능하면 문제가 생길 여지가 너무 많다.
- 생성자 주입은 빈이 등록되기위해 싱글톤 객체가 생성될 때 딱 한번만 주입하고 변경하지 않는다.
테스트의 편함
- 수정자 주입에서는 의존관계가 무엇이 있었는지 있긴 한지는 코드의 setter 를 까봐야한다.
- 또한 런타임에 에러가 나게 된다.
- 생성자 주입은 생성자의 매개변수로 주지 않으면 애초에 컴파일에러가 난다.
- 또, IDE 의 도움을 받으면 코드 작성시 매개변수를 볼 수 있다.
final
- 생성자 주입방식을 쓰면 final 을 쓸 수 있다.
- 필드에 final 을 쓰면 생성자나 필드 선언시에 초기화를 해야한다. 안그러면 컴파일에러낸다.
- 따라서 의존관계 주입 로직을 누락하는 실수를 방지할 수 있다.
앵간하면 생성자 주입을 쓰고, 특수한 상황에서는 setter(수정자) 주입을 쓰자.
필드 주입은 테스트하기 어려운 등 단점이 존재하여 Intellij 에서도 되도록 쓰지말라고 경고를 띄운다.
@RequiredArgsConstructor
롬복의 이 기능을 쓰면 final 이 붙은 필드로 생성자를 한개 만들어준다.
생성자가 하나만 있으면 @Autowired 가 자동으로 붙는 것을 이용할 수 있다.
생성자를 하나만 두고 @Autowired 를 생략하는 방법을 많이 쓰기 때문에,
롬복까지 이용하여 생성자를 하나 만드는 @RequiredArgsConstructor 어노테이션을 사용하면, 코드가 매우 깔끔해진다.
'spring' 카테고리의 다른 글
스프링 빈의 생명주기와 초기화 분리 (0) | 2021.03.20 |
---|---|
자동 주입시 빈이 2개 이상일 때 문제 해결 (0) | 2021.03.19 |
@Autowired (0) | 2021.03.18 |
@ComponentScan (0) | 2021.03.18 |
DTO 는 어떻게 써야하나 (0) | 2021.03.15 |