[DEV] 기록

Lombok) 상속받는 부모 클래스 필드도 빌더 패턴을 적용하고 싶을 경우

꾸준함. 2020. 8. 7. 09:29

개발을 진행하다가 Lombok @Builder 어노테이션을 사용하여 부모 클래스 필드 값을 세팅했는데도 불구하고 로그를 찍어보면 부모 클래스 필드가 전부 null 인 문제점이 발생했습니다.
간단하게 예시를 들자면 아래와 같습니다.

Parent.class

@Builder public class Parent { protected String a; protected String b; }

Child.class

@Builder public class Child extends Parent { private String c; private String d; private String e; }

Controller.class

@Slf4j @RestController public class Controller { @ApiOperation(value = "예시 샘플") @PostMapping(value = {"/example"}) public Child example() { return Child.builder() .a("a") .b("b") .c("c") .d("d") .e("e") .build(); } }

예상되는 Output (Expected Output)

{ "a": "a", "b": "b", "c": "c", "d": "d", "e": "e" }

실제 Output (Actual Output)

{ "a": null, "b": null, "c": "c", "d": "d", "e": "e" }


위 예시처럼 부모 클래스의 필드는 기존의 @Builder 어노테이션으로 설정을 할 수 없기 때문에 stackoverflow를 검색하던 와중 @SuperBuilder 어노테이션을 발견했습니다.
답변에 의하자면 lombok 1.18.2 버전부터 @SuperBuilder라는 어노테이션을 사용할 수 있고 해당 어노테이션은 딱 제가 원하는대로 작동했습니다.
위 Parent.class 와 Child.class에서 @Builder를 @SuperBuilder로 바꿔준다면 실제 Output 과 동일한 결과가 나옵니다!

출처) https://stackoverflow.com/questions/44948858/lombok-builder-on-a-class-that-extends-another-class

반응형