작성
·
535
0
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public abstract class Catalog extends BaseEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer price;
private Integer stockQuantity;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id")
private Category category;
}
@Entity
@DiscriminatorValue(value = "SUPPLEMENT")
public class Supplement extends Catalog {
private Integer capacity; // 용량
}
@Entity
@DiscriminatorValue(value = "SPORT_WEAR")
public class SportWear extends Catalog {
private SportWearSizeEnum size; // 사이즈
}
위와 같이 설계 되었을 때 컨트롤러와 서비스를 구축하는데 어떻게 접근해야 할지 고민입니다.
제가 생각해본 해결법은 총 2가지 였습니다.
1. 각 서브 엔티티마다 컨트롤러 서비스 리파지토리를 새로 만든다.
- 이 방법은 테이블이 생길때 마다 컨트롤러가 추가되며 도메인에 의존적인 것이 아닌 데이터베이스에 의존적인 설계라 생각이 들어 가장 쉬운 설계 였지만 마음에 들지 않았습니다.
2. 자바 제네릭 사용
- 자바의 제네릭을 사용하여 CatalogService를 주입받을 때 CatalogService<SportWear> 의 형식으로 사용해보기로 하였습니다.
하지만 이 방식 또한 카탈로그에 해당하는 테이블이 추가될 때마다 컨트롤러에 CatalogService<Others>의 형식으로 코드가 추가된다는 점이 마음에 들지 않았습니다.
그래서 제가 생각한 마지막 방법은 인터페이스를 사용하는 방식입니다. 이 방식은 부족한 제 지식으로 인해 아직 명확한 설계법은 고안해내지 못한 상태입니다.
또한, 테이블 마다 받게 되는 Request, Response, DTO가 각각 다른 상황에서 어떻게 하면 유연한 설계 방식으로 가져가야할지 많은 고민이 있습니다.
inheritanceType.JOINED 을 사용하실 때 어떤 방식으로 Controller, Service, Repository를 설계하시는지 궁금합니다.
답변 1
2
안녕하세요. 믿음직님
실제로 상속을 이용한 방법을 실무에서는 많이 사용하지 않고 꼭 필요한 곳에 부분적으로 사용합니다.
사용한다면 2가지 방법으로 처리가 필요합니다.
1. instance of를 통해서 다운 케스팅 처리
2. 리포지토리를 각각 따로 만들기
감사합니다.