본문 바로가기
Java/Library

[Lombok] @AllArgsConstructor와 @RequiredArgsConstructor 차이점을 알아보자

by Lee David 2022. 8. 7.
반응형

Lombok의 사용을 점점 지양하는 추세이지만 아직까지 의존성 주입하는데 코드가 깔끔하게 정리되는데 유용하게 사용되는 두개의 어노테이션을 비교해 보겠습니다.

AllArgsConstructor
@Service
@AllArgsConstructor
public class A {
    private String a; // 생성자 exception이 발생한다.
    private String b; // 생성자 exception이 발생한다.
    private Service service;
}

위 상황에서 A class 내부에서 사용할 변수 a로 인해 빌드 에러가 발생한다.

"Parameter 1 of constructor in '...' required a bean of type 'java.lang.String' that could not be found."

이유인즉 AllArgsConstructor는 메소드를 제외한 모든 필드의 값을 의존성을 주입 하는데 이때 String이 의존성 주입 할 수 있도록 어노테이션 혹은 bean으로 등록되지 않았다는 메시지이다.

그럼 해결 방법은?

해결 방법은 제목에 나와있는 RequiredArgsConstructor를 사용하여 쉽게 해결 할 수 있다.

@Service
@RequiredArgsConstructor
public class A {
    private String a; 
    private String b; 
    private Service service; // 사용시 null이 확인된다.
}

더이상 String 변수 때문에 스트레스를 받지 않아도 됩니다.

하지만 Service class가 어노테이션(@Service) 등으로 등록되어 있다고 가정 할 때에 왜 null로 메모리에 등록될까요?

이유는 RequiredArgsConstructor를 사용하려면 이미 어노테이션 or bean으로 등록한 클래스는 final로 선언해주어야만 의존성 주입이 가능합니다..

...
@RequiredArgsConstructor
public class A {
    ...
    private final Service service; // 의존성 주입 성공!
}

jpa를 사용할 때에 가장 기피해야하는 라이브러리 1순위가 @Data, @ToString 과 같은 entity에 선언되는 어노테이션들이지만 의존성을 주입하는데 편리한 어노테이션이 제공되기 전까지는 lombok이 많이 사용되지 않을까 싶습니다.

반응형

'Java > Library' 카테고리의 다른 글

[String] Array String으로 변환하기  (0) 2022.03.18
lombok #2 [Lazy Getter]  (0) 2020.07.03
lombok #1 [@Data, @NonNull, @*ArgsContructor, @Builder]  (0) 2020.07.02