-
[TIL] @Builder 와 @NoArgsConstructor, @AllArgsConstructorTIL(Today I Learned) 2023. 2. 14. 17:15
*20230214의 회고
오늘 페이징 처리를 하기 위해 Page<Entity> 로 받아온 것을 Page<Dto> 로 변환해야 하는 경우가 생겼다. 따라서 빌더패턴을 이용하여 로직을 작성하던 중 오류가 발생하는 것을 겪었다.
@Getter 어노테이션이 있어서 값은 분명 다 받아올 수 있을텐데, 왜 값을 인식을 못하는걸까... 정말 난감했다.
그렇게 열심히 구글링을 해본 결과, @Builder 와 @NoArgsConstructor 를 함께 사용하려면 꼭! @AllArgsConstructor 가 함께 있거나 직접 모든 멤버변수를 인자로 받는 생성자를 직접 생성해주어야 한다고 한다!!!!!!! 또한 @Builder 를 사용할 때 @NoArgsConstructor 뿐만 아니라 손수 만든 다른 생성자가 있다면, 그 때도 모든 필드를 갖는 생성자가 필요하다고 한다.
아래는 Lombok의 공식사이트에서 @Builder 에 대해 설명된 부분을 일부 발췌한 것이다.
더보기Finally, applying @Builder to a class is as if you added @AllArgsConstructor(access = AccessLevel.PACKAGE) to the class and applied the @Builder annotation to this all-args-constructor. This only works if you haven't written any explicit constructors yourself.
어떠한 명시적 생성자가 없을 경우에만 클래스에 @Builder 를 붙였을 때 "@AllArgsConstructor를 사용" 혹은 "모든 필드를 갖는 생성자위에 @Builder를 붙인것"과 같다고 한다. 그렇기에 나는 GiftCard 객체를 매개변수로 받는 명시적 생성자도 가지고 있고, 어떻게 보면 @NoArgsConstructor로 인해 명시적으로 매개변수를 갖지 않는 기본생성자를 갖고 있는 것과 마찬가지였기 때문에 따로 모든 필드를 매개변수로 받는 생성자를 만들어줘야 했다.
결론적으로 말하자면, @Builder를 사용하기 위해서는
- 명시적 생성자가 없어야 한다.
- 명시적 생성자 혹은 기본생성자(@NoArgsConstructor)가 있다면 @AllArgsConstructor 혹은 모든 멤버변수를 인자로 받는 생성자의 생성은 필수적이다!
따라서 모든필드를 매개변수로 받는 생성자를 생성해주니 오류가 해결되었다. 오늘도 하나 배웠다!
'TIL(Today I Learned)' 카테고리의 다른 글
[TIL] 카테고리 별 기프트 카드 조회 컨트롤러 수정하기 (0) 2023.02.16 [TIL] Spring Boot 의 Ambiguous handler methods mapped for 에러 (2) 2023.02.15 [TIL] Builder 패턴 사용하기 (0) 2023.02.13 [TIL] Controller 에서 Entity 를 그냥 반환하면 안되는 이유 2가지 (0) 2023.01.30 [TIL] 엔티티와 테이블의 차이 (0) 2023.01.26