ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] @Builder 와 @NoArgsConstructor, @AllArgsConstructor
    TIL(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를 사용하기 위해서는

    1. 명시적 생성자가 없어야 한다.
    2. 명시적 생성자 혹은 기본생성자(@NoArgsConstructor)가 있다면 @AllArgsConstructor 혹은 모든 멤버변수를 인자로 받는 생성자의 생성은 필수적이다!

     

    따라서 모든필드를 매개변수로 받는 생성자를 생성해주니 오류가 해결되었다. 오늘도 하나 배웠다!

Designed by Tistory.