둘 다 의존 관계의 주입(DI)을 위해 사용되는 필드이다.
그렇다면 이 둘의 차이점은 과연 무엇일까?
@RequiredArgsConstructor는 롬복(Lombok) 라이브러리에서 제공하는 어노테이션이다.
해당 어노테이션은 final 필드나 @NonNull 필드에 대해 자동으로 생성자를 생성해 주고,
스프링과 함께 사용할 경우 생성자를 통해 의존성 주입을 할 수 있습니다.
사용 예
@Service
@RequiredArgsConstructor
public class MyService {
private final MyRepository myRepository;
// 롬복이 생성자를 자동으로 생성
// public MyService(MyRepository myRepository) {
// this.myRepository = myRepository;
// }
// ...
}
@RequiredArgsConstructor는 생성자 주입을 명시적으로 사용하여 불변성(immutability)을 보장하고
의존성 주입에 필요한 코드를 자동으로 생성해 주므로 코드가 간결해진다.
Autowired는 필드, 세터, 생성자 주입 모두 붙일 수 있다.
다음은 생성자 주입을 @Autowired로 대체한 코드임
@Service
public class MyService {
private final MyRepository myRepository;
@Autowired
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
// ...
}
@Autowired는 Bean 주입시마다 달아줘야하지만,
@RequiredArgsConstructor는 해당 클래스에 달고 private final로 Bean을 주입하면 되서 코드가 깔끔해지고 가독성이 높다고 느낀다.
이런 이유에서 최근에는 @RequiredConstructor을 사용하는 추세라고 함