개발일지/스프링
@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();