반응형
쇼핑몰 작업을 하는 도중 상품 등록에서 builder 패턴에 어려움을 겪었다.
package GoodPang.goodPang.domain.item;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Entity
@DiscriminatorValue("A")
@Getter
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class Album extends Item{
private String artist;
private String etc;
}
package GoodPang.goodPang.domain.item;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Entity
@DiscriminatorValue("B")
@Getter
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class Book extends Item{
private String author;
private String isbn;
}
현재 이런 식으로 , Item이 존재하고, 여러 상품들이 Item을 상속받아서, 자신만의 정보를 추가를 가지고 있는 구조이다.
여기에서 Book에서 buidler와 Item에서 Builder를 모두 가지게 되는데,
처음에는 그냥 @Build만 붙였는데, 오류가 발생했다.
그래서 Book에 @Builder(builderMethodName = "BookBuilder") 처럼 이름을 만들어 보았는데
이 경우에는 book의 성질만 가지게 되었다.
따라서 찾아보니다 @Superbuilder를 사용하면 해결할 수 있는 문제였다.
부모와 자식 클래스에 모두 @superbuilder를 붙이면, 빌더 패턴을 유지하면서 상속관계를 유지할 수 있게 되었다.
++
package GoodPang.goodPang.domain.base;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;
@MappedSuperclass //부모 클래스를 테이블과 매핑하지 않는다 -> 자식이 명시할 필요 x-> 엔티티가 x -> 테이블 생성 x
//해당 클래스를 상속하는 엔티티는 칼럼 정보만 제공한다.
@EntityListeners(AuditingEntityListener.class) //변경감지
@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public abstract class BaseEntity {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedBy
private LocalDateTime updatedAt;
}
나는 모든 엔티티에 baseEntity를 상속받아서, 생성되는 시간을 가지게 한다.
결국 Item 도 baseEntity를 상속 받기 때문에, baseentity에도 @SuperBuilder를 추가해주었다.
원래는 어차피 baseEntity는 엔티티로 사용하지 않기에, 따로 기본생성자 같은 것은 추가하지 않았지만,
@superEntity를 추가하면서, 생성자들을 추가해 주었다.
반응형
'프로젝트' 카테고리의 다른 글
[트러블 슈팅] cascade의 위험성.. (0) | 2025.01.11 |
---|---|
[트러블 슈팅] 복잡한 연관관계에서의 삭제 (0) | 2025.01.11 |
[트러블 슈팅] git pull fatal: Could not read from remote repository. (0) | 2025.01.03 |
[트러블 슈팅] 일대일 관계에서 save 순서 및 외래키 관리 org.hibernate.TransientObjectException: persistent instance references an unsaved transient instance of (1) | 2025.01.02 |
@Eembbed, @Embeddable 이 무엇일까? (0) | 2024.06.14 |