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

GPK님의 프로필 이미지
GPK

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

상속관계 매핑시

작성

·

483

0

Item, Album, Book, Movie entity 설계시

Item에서
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "item_type")
와 같이 Join 방식으로 구현했을 때

1) Item Table에는 item_type 필드가 생기게 되는데,
   dtype 필드를 Item class나 child class들에서 entity의 method를 통해 Get할 수 있는 방법은 없나요?


   SpringDataJPA의 ItemRepository.findAll로 받은 List<Item>에 대해서
   해당 객체의 실제 type이 뭔지 알고 싶은 경우, 일일히 instanceof로 체크해서 해야하는데,
   getItemType 같은 메소드를 만들수 있으면 편리할 것 같은데 방법이 업는지요?

2) SpringDataJpa의 ItemRepository로 findAll을 해보니, 하위 모든 table을 join해서 검색하게 되던데요,
   어떻게 보면 당연한 동작이긴 한데,
   실질Item 객체보다는 단순히 전체 Item이 몇개이고 그 리스트를 얻고 싶을 때는 비효율적인 것처럼 느껴지기도 합니다.
   이런 경우 그냥 Item table만 가지고 조회하는 query를 직접 짜는 게 더 바람직 한가요? DTO를 하나 만들고 Item table만으로 query를 날린다던지...

답변 2

0

GPK님의 프로필 이미지
GPK
질문자

답변 감사드립니다.

알려주신 방식으로 하니 

(1) Album, Book등을 처음 생성하고 영속화시키면서 리턴된 영속화된 instance로 getDtype을 해보니 null이 나오네요.

(2) EntityManager를 clear하고 다시 조회하면 dtype값이 정상적으로 나오네요.

(1)에서 null 나오는게 큰 단점이네요. 

저 상황에서 instance의 dtype을 직접 설정해주는 것은 나쁜 방법 같고, 
어쩔 수 없는 상황인 것 같습니다만
혹시 이것도 바람직한 해결 방법이 있을까요?

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. GPK님^^

다음과 같이 읽기 전용으로 선언하면 사용할 수 있습니다.

@Column(insertable = false, updatable = false) //읽기 전용으로 선언

private String dtype;

2번은 성능까지 고려하면, 한 테이블에 설계하는 전략이 더 나은 선택일 수 있습니다.

JOIN 전략을 사용하면, 우선 DTO로 조회하고, 그래도 원하는 결과가 안나오면, 부분적으로 nativeQuery를 사용하시면 됩니다^^

감사합니다.

GPK님의 프로필 이미지
GPK

작성한 질문수

질문하기