강의 실습 중에
도메인 패키지의 엔티티 파일들에서
공통으로 사용되는 메타 필드를
하나의 파일로 분리해서 상속받아 사용하는 부분이 있었는데,
이 때 @Builder 어노테이션 사용 시
엔티티를 builder()로 호출해서 사용할 때
상속하는 엔티티의 필드를 사용할 수 없는 문제가 있었다.
검색해보니 @Builder
는 해당 어노테이션이 붙은 클래스에 있는 필드만 사용할 수 있게 해주고,
해당 클래스의 부모 클래스의 필드는 무시된다고 한다.
부모 자식 클래스에 속한 모든 필드에 대해서
builder()를 적용하려면
@SuperBuilder
어노테이션 사용시 가능해진다고 한다.
각 필드에 대한 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();
자식 객체가 부모 객체의 필드를 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();