프로젝트

[트러블 슈팅] 상속관계에서의 builder 패턴

매일_공부 2025. 1. 3. 17:21
반응형

쇼핑몰 작업을 하는 도중 상품 등록에서 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를 추가하면서, 생성자들을 추가해 주었다.

반응형