개발일지/스프링

@Builder 상속하기

티에리앙리 2022. 8. 24. 22:45

 

Item 클래스를 상속받은 Book 클래스가 있다

Book 클래스에서 Builder를 사용하면 Book 클래스에 있는 값을 builder로 정의할 수 있는데

상속할 Item 클래스는 추가적인 작업이 필요하다.

 

우선 Book 클래스와 Item클래스를 살펴보자

@Entity
@DiscriminatorValue("B") // 싱글 테이블이기 때문에 db에 저장할 때 구분해야한다.
@Getter
public class Book extends Item{

    private String author;
    private String isbn;
}
@Entity
// 상속관계 매핑은 상속관계 전략을 지정해야한다. 이 전략을 부모클래스에 입력해야한다.
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 싱글테이블 전략(한 테이블에 다 넣겠다) - ppt의 회원 테이블 분석에 있는 ITEM 테이블 참고
@DiscriminatorColumn(name = "dtype") // 싱글 테이블이기 때문에 db에 저장할 때 구분해야한다.
@Getter
public abstract class Item {    // 구현체를 가지고할거라서 Item은 추상클래스로 만든다

    @Id @GeneratedValue
    @Column(name = "item_id")
    private Long id;

    private String name;
    private int price;
    private int stockQuantity;
    
    // ...
    
}

이때

Book 클래스 builder로 Item의 값을 사용하고 싶으면

상속받아야한다.

//@BatchSize(size = 100)
@Entity
// 상속관계 매핑은 상속관계 전략을 지정해야한다. 이 전략을 부모클래스에 입력해야한다.
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 싱글테이블 전략(한 테이블에 다 넣겠다) - ppt의 회원 테이블 분석에 있는 ITEM 테이블 참고
@DiscriminatorColumn(name = "dtype") // 싱글 테이블이기 때문에 db에 저장할 때 구분해야한다.
@Getter
@NoArgsConstructor
@AllArgsConstructor
public abstract class Item {    // 구현체를 가지고할거라서 Item은 추상클래스로 만든다

    @Id @GeneratedValue
    @Column(name = "item_id")
    private Long id;

    private String name;
    private int price;
    private int stockQuantity;

    @ManyToMany(mappedBy = "items")
    private List<Category> categories = new ArrayList<>();


    public Item(String name, int price, int stockQuantity){
        this.name = name;
        this.price = price;
        this.stockQuantity = stockQuantity;
    }

	// ...
}

즉, @Builder를 클래스에 선언하지 않고 생성자에 선언하고

super로 부모클래스에 값을 준다.

public class Book extends Item{

    private String author;
    private String isbn;

    @Builder
    public Book(String name, int price, int stockQuantity, String author, String isbn){
        super(name, price, stockQuantity);
        this.author = author;
        this.isbn = isbn;
    }
}

 

그러면 원하는 곳에서 Book.builder를 사용할 수 있다.

Book book = Book.builder()
        .name(form.getName())
        .price(form.getPrice())
        .stockQuantity(form.getStockQuantity())
        .author(form.getAuthor())
        .isbn(form.getIsbn())
        .build();