-
lombok : @Builder , @SuperBuilderSpring 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();
'Spring Boot 🍃' 카테고리의 다른 글
Persistence (0) 2023.12.02 실습 내용과 함께 읽어보는 간략한 사용자 정의 Annotation 작성을 정리해보고 싶었는데 (0) 2023.12.02 Mockito : ArgumentCaptor (0) 2023.12.01 Mockito (0) 2023.12.01 Spring Boot: 모듈 정보 (0) 2023.11.30