Spring Data JPA가 제공하는 기본적인 CRUD method 및 query method 기능을 사용할 수 있다. 이번 miniproject할 때, 다양한 조건별로 조회하기 위해서 아래와 같은 JPA로직을 구현했었다.
public interface PostRepository extends JpaRepository<Post, Long> {
// 시간순 정렬
List<Post> findAllByOrderByCreatedAtDesc();
List<Post> findPostsByTagOrderByCreatedAtDesc(String tag);
List<Post> findPostsByAccount_AccountTeamOrderByCreatedAtDesc(String accountTeam);
List<Post> findPostsByAccount_AccountTeamAndTagOrderByCreatedAtDesc(String accountTeam, String tag);
// 좋아요 정렬
List<Post> findAllByOrderByPostLikeCountDescCreatedAtDesc();
List<Post> findPostsByTagOrderByPostLikeCountDescCreatedAtDesc(String tag);
List<Post> findPostsByAccount_AccountTeamOrderByPostLikeCountDescCreatedAtDesc(String accountTeam);
List<Post> findPostsByAccount_AccountTeamAndTagOrderByPostLikeCountDescCreatedAtDesc(String accountTeam, String tag);
List<Post> findPostsByAccount(Account account);
}
단순 조건 별 조회임에도 불구하고 매서드 명이 너무 길고, 파라미터가 너무 많다.
다른 추가적인 조건절이 있다면 더 복잡해질 것이다! 간단한 로직이라면 크게 상관없지만, 복잡한 로직의 경우 쿼리 문자열이 상당히 길어진다. 원하는 조건의 데이터를 수집하기 위해서는 JPQL작성이 필수적이다. 문자열에 오타나 문법적인 오류가 존재하는 경우에 정적쿼리는 application loading시점에 이를 알 수 있으나, 그 외에는 매소드가 실행될 때 알 수 있다.
JPQL을 직접 작성하는 문제를 어느정도 해소해 주는 spring framework가 바로 QueryDsl
이다. QueryDsl은 정적 타입을 사용해서 SQL 등의 쿼리를 생성해 주는 프레임워크이다.