Today
-
Yesterday
-
Total
-
  • lombok : @Builder , @SuperBuilder
    Spring Boot 🍃 2023. 12. 1. 00:01

    강의 실습 중에

    도메인 패키지의 엔티티 파일들에서

    공통으로 사용되는 메타 필드를

    하나의 파일로 분리해서 상속받아 사용하는 부분이 있었는데,

    이 때 @Builder 어노테이션 사용 시

    엔티티를 builder()로 호출해서 사용할 때

    상속하는 엔티티의 필드를 사용할 수 없는 문제가 있었다.


    검색해보니 @Builder는 해당 어노테이션이 붙은 클래스에 있는 필드만 사용할 수 있게 해주고, 해당 클래스의 부모 클래스의 필드는 무시된다고 한다.

    부모 자식 클래스에 속한 모든 필드에 대해서

    builder()를 적용하려면

    @SuperBuilder 어노테이션 사용시 가능해진다고 한다.


    @Builder

    각 필드에 대한 Setter 메서드를 포함하는 빌더 클래스를 생성하도록 Lombok에 알려주는 어노테이션이다.

    이 어노테이션을 이용해서 복잡한 객체를 생성하거나, 불변 객체를 더 쉽게 만들 수 있다고 한다.

    하지만, 상속 관계에 있는 클래스에서 사용할 경우

    이 어노테이션이 선언 된 클래스의 필드에 한해서만 빌더 메서드를 생성하고 상위 클래스의 필드는 무시된다고 한다니 주의해서 사용!

    사용 예시

    AccountUser 클래스

    @Getter
    @Setter
    @Builder
    @Entity
    @EntityListeners(AuditingEntityListener.class)
    public class AccountUser {
    
        private String name;
        
        @CreatedDate
        private LocalDateTime createdAt;
        @LastModifiedDate
        private LocalDateTime updatedAt;
    
    }

    AccountUser 클래스 사용

    AccountUser.builder()
               .name("zhyun")
               .createdAt(LocalDateTime.now())
               .build();

    @SuperBuilder

    자식 객체가 부모 객체의 필드를 builder 패턴으로 사용 할 수 있게 해준다. 보고 배운 블로그 : jinseobbae.github

    아 이때 사용된 super가 클래스 상속 받았을때 메서드 오버라이드하면 생기는 super랑 비슷한 의미라고 생각하면 더 잘 기억될 것 같다 🙊

    사용 예시

    AccountUser 클래스

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @Entity
    public class AccountUser extends CommonEntity {
    
        private String name;
    
    }

    CommonEntity 클래스

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @MappedSuperclass
    @EntityListeners(AuditingEntityListener.class)
    public class CommonEntity {
    
        @CreatedDate
        private LocalDateTime createdAt;
        @LastModifiedDate
        private LocalDateTime updatedAt;
    
    }

    AccountUser 클래스 사용

    AccountUser.builder()
               .name("zhyun")
               .createdAt(LocalDateTime.now())
               .build();

Designed by Tistory / Custom by 얼거스