@Autowired
는 필드 주입이고, @RequiredArgsConstructor
는 생성자 주입(Constructor Injection) 입니다.@RequiredArgsConstructor
는 Lombok
에서 제공하는 어노테이션 입니다.
결론적으로 생성자 주입을 권장합니다. 인텔리제이에서 코드를 작성하다보면 @Autowired
를 사용하면 아래와 같은 경고를
알려줍니다.
경고
Field injection is not recommended
Inspection info: Spring Team recommends: “Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies”.
뭐.. 추천하지 않고 생성자 주입방식을 쓰라고 하는거 같네요.
생성자 주입으로 코드를 작성하면 아래와 같은 장점이 있습니다.
- 순환 참조 방지
- 테스트 코드 작성 용이
- 코드 악취 제거
- 객체 변이 방지
필드 주입방식을 쓰면 아래와 같은 단점이 있습니다.
- 단일 책임의 원칙 위반
- 숨은 의존성 제공
- 의존성을 가진 클랙스를 곧바로 인스턴스화 할 수 없음
- final을 선언할 수 없기 때문에 객체가 변할 수 있음
Lombok
를 쓰면 아래와 같이 간단하게 처리 할 수 있습니다.
|
|
만약 Lombok
을 사용하지 않으면 아래와 같이 처리해야 합니다. 아래와 같이 생성자가 1개인 경우는 @Autowired
를 생략해도 됩니다.
|
|