인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

믿음직님의 프로필 이미지
믿음직

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

inheritanceType.JOINED에 대한 고찰

작성

·

535

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.
 
안녕하세요!
 
먼저 좋은 강의 선보여주셔서 감사합니다.
강의를 듣고 토이 프로젝트를 진행하며 겪은 문제점에 대해 해법이 잘 떠오르지 않아 질문 드립니다.
 
현재 엔티티는 아래와 같이 설계 하였습니다.
 
@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. 리포지토리를 각각 따로 만들기

감사합니다.

 

믿음직님의 프로필 이미지
믿음직

작성한 질문수

질문하기