Querydsl 적용

김동영·2024년 5월 28일
1

정적 타입을 이용해서 SQL 등 쿼리를 생성해주는 프레임워크
JPA 의 쿼리메소드의 한계로 인해 JPQL 을 작성하게 될 경우(예. Limit 구문), 문법 오류 외에는 런타임에서 오류가 발생하는 문제가 있음.
Querydsl 을 통해 코드로 SQL 을 작성하고 이를 컴파일 과정에서 검증할 수 있다.

1. 적용 절차

1. 디펜던시 추가

ext {
    querydslVersion = '5.0.0'
}

dependencies {

    // queryDSL 설정
    implementation "com.querydsl:querydsl-jpa:${querydslVersion}"
    annotationProcessor "com.querydsl:querydsl-apt:${querydslVersion}:jpa" // querydsl JPAAnnotationProcessor 사용 지정
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"

}

2. (Optinal) 인터페이스 생성

public interface ProjectRepositoryCustom {

  /**
   * Find by member no limit
   *
   * @param memberNo {@link Project#getMemberNo()}
   * @param limit limit
   * @return {@link Project}
   */
  Optional<List<Project>> findByMemberNoLimit(Long memberNo, int limit);

}

3. 구현체 작성

public class ProjectRepositoryImpl extends QuerydslRepositorySupport implements ProjectRepositoryCustom {

  public ProjectRepositoryImpl() {
    // QuerydslRepositorySupport 를 통해 QueryFactory 생성없이 사용가능
    // Querydsl 에 사용될 엔티티를 생성자로 추가
    super(Project.class);
  }

  @Override
  public Optional<List<Project>> findByMemberNoLimit(Long memberNo, int limit) {
    var projects = QProject.project;

    var projectList = from(projects)
        .where(projects.memberNo.eq(memberNo))
        .limit(limit)
        .fetch();
    return Optional.ofNullable(projectList);
  }
}

4. 실사용 예시

실 사용 시, JPA 와 같이 사용하기 위해 아래와 같이 인터페이스로 사용할 수 있습니다.

// ProjectRepositoryCustom 인터페이스
public interface ProjectRepository extends JpaRepository<Project, Long>, ProjectRepositoryCustom {}
// Querydsl 을 적용할 인터페이스 구체화
public class ProjectRepositoryImpl extends QuerydslRepositorySupport implements ProjectRepositoryCustom {}

99. 참고

1. QuerydslRepositorySupport

Querydsl 을 쉽게 사용할 수 있게 해주는 추상클래스
대상 엔티티를 인자로 생성하여 사용할 수 있다.

// 적용 예시
public class MyEntityRepositoryImpl extends QuerydslRepositorySupport {

  public MyEntityRepositoryImpl() {
    super(MyEntity.class);
  }
  ...
}
profile
k8s, 프레임워크와 함께하는 백엔드 개발자입니다.

0개의 댓글