lombok : @Builder , @SuperBuilder

김아무개·2023년 5월 17일
1

Spring Boot 🍃

목록 보기
12/95

강의 실습 중에

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

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

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

이 때 @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();
profile
Hello velog! 

0개의 댓글