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

kkh님의 프로필 이미지

작성한 질문수

실전! Querydsl

동적 쿼리와 성능 최적화 조회 - Where절 파라미터 사용

상속 구조에서 querydsl 조회하기

21.09.16 23:10 작성

·

916

0

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

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.w2tomwsznga7)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://docs.google.com/document/d/1xCQKit-1V6l6ObeCe49St33RHPzLF_P_c3o7aSDTKs0/edit#heading=h.7dhnp46ven0v)

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

[질문 내용]
여기에 질문 내용을 남겨주세요.
 
이전 강의 에서 Entity에서 Iteam을 Book , Movie, Ablum으로 상속하는 구조를 가지고 있습니다. 이럴 경우 querydsl로 조회 할 때 dtype을 where 절에서 사용할 수 있는지 궁금합니다. 만약 사용할 수 없다면 실무에 적용할 수 있는 다른 좋은 방법이 있는지 궁금합니다.
 

답변 2

1

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

2021. 09. 18. 20:38

안녕하세요. kkh님

JPQL 쿼리를 작성할 때 from에 자식 타입을 넣으시면 원하시는 결과를 얻을 수 있습니다.

(이게 정석 방법입니다.)

만약 dtype이 꼭 필요하다면 dtype을 필드를 만들고 읽기 전용(insert=false, update=false)으로 JPA @Column 컬럼 매핑하시면 됩니다.

감사합니다.

0

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

2021. 09. 20. 10:53

답변 감사합니다.

위와 같이 상속을 사용해서 Entity 를 구성하는 경우 실무에서는 querydsl로 Item, Book, Ablum, Movie Entity의 비즈니스 로직을 작성할 때는 아래 와 같은 방법으로 repository와 service를 구현할 수 있다고 생각합니다.

실무에서는 어떤 방식을 주로 사용하는지 궁금합니다. 만약 3가지 모두 틀린 경우에는 어떤 방식이 가장 좋은 방식인지 궁금합니다.

경험 많으신 김영한 님께서 번호만 선택 해주신다면 많은 도움이 될거 같습니다 ㅜㅜ.

1. Item, Book, Ablum, Movie각각 repository를 따로 두고 service도 따로 둔다.

public interface ItemRepository extends JpaRepository<Item, Long>, ItemQuerydslRepository{ 
    // .. 
}

public interface MovieRepository extends JpaRepository<Movie, Long>, MovieQuerydslRepository { 
    // .. 
}

// ...

public class ItemService { 
    // .. 
}

public class MovieService { 
    // .. 
}
//...

2. Item, Book, Ablum, Movie 를 모두 다른 repository로 두고 service에서 map/factory객체에 repository bean을 저장해서 사용한다.

public interface Repository {}

public interface ItemRepository extends JpaRepository<Item, Long>, ItemQuerydslRepository, Repository { 
    // .. 
}

public interface MovieRepository extends JpaRepository<Movie, Long>, MovieQuerydslRepository, Repository  { 
    // .. 
}

// ...

@RequireArgumentrs
public class ItemService { 
       private final RepositoryFactory repositoryFactory;
}

@RequireArgumentrs
public class RepositoryFactory {
     private final ItemRepository itemRepository;
     private final MovieRepository  movieRepository ;
// ....

    public Repository getObj(ItemType type) {
          if (type == MOVIE) return movieRepository ;
          // ,.,.. codes
          return itemRepository;
    }
}

3. Item, Book, Ablum, Movie의 querydsl interface와 Impl class를 따로 두고 하나의 repository interface에 모두 상속하는 구조를 가진다. -> service도 1개만 사용

public interface ItemRepository extends JpaRepository<Item, Long>, ItemQuerydslRepository, MovieQuerydslRepository{ 
    // .. 
}

@RequireArgumentrs
public class ItemService { 
       private final RepositoryFactory repositoryFactory;
}

좋은 코드를 작성하기 위해서 위 3가지 중 어떤걸 선택하는게 가장 적절한지 궁금합니다....

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

2021. 09. 22. 19:03

이 경우 상황에 따라서 1,3번을 선택해야 합니다.

애플리케이션이 단순하고 대부분 공통 로직이면 3번을 선택하고, 애플리케이션이 복잡하고, 비즈니스 로직이 상황별로 다르다면 1번을 선택하면 됩니다.

2번은 크게 장점이 없을 듯 합니다.

도움이 되셨길 바래요^^

kkh님의 프로필 이미지

작성한 질문수

질문하기