Skip to content

Querydsl과 JPA data를 혼용 시, 한 테이블에 repository를 2개를 만들어야 하는 문제

F i n n edited this page Dec 12, 2022 · 3 revisions

※우리 서비스에서 Post entity를 예시로 듬

1. 도입 이유 & 문제상황

-1. JPA data의 경우 인터페이스 PostRepository를 만들어, JpaRepository를 상속 받는 구조로 만듬.
-2. 그러나, Querydsl이나 JPQL사용 시, interface가 아닌 실제 구현 부가 존재 하여야 함.
즉, Query문을 구현하는 Class가 존재 하여야 하므로, PostRepository가 아닌 PostRepository2라던가 PostQueryRepository등으로 새로운 Class를 만들어야 함.
-3. 한 entity에 여러개의 repository가 매핑이 되어 있으면, query를 작성하는 사람의 경우에는 혼동이 오지 않지만, Service 단에서 구현해 놓은 코드를 가져다 쓰는 사람의 입장에선 혼동이 올 수 있음. 또한 자바의 객체지향의 관점에서도 설계적으로 부적절하다는 판단을 함.

2. 해결 방안 및 의견 결정

이 문제를 해결하기 위해, PostRepository를 JpaRepository이외에 PostRepositoryCustom이라는 인터페이스를 이중 상속 받게 한 뒤, 이를 PostRepositoryImpl이라는 구현 클래스를 만들어 해결 함.
Java언어는 클래스의 경우 상속을 1개만 받을 수 있는 제한이 있지만, 인터페이스의 경우에는 여러 개의 상속이 가능하다는 점을 이용하여 해결하였음.
image

3. 결과 반영

image image image

PostService 단에서 Post Entity 즉, Post table과 관련된 모든 Repository는 PostRepository로 통일 되어, 코드의 계층구조가 깔끔해졌다.