반응형
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 |