[TIL] QueryDSL 개념과 기능

김재진·2026년 2월 23일

내일배움캠프

목록 보기
51/70

1. QueryDSL의 개념

  • QueryDSL은 JPQL의 한계를 넘어서 타입 안전하게 작성하기 위한 라이브러리다.
    • JPQL의 한계 : 문자열 기반으로 자동완성, 리팩토링 불가 / 컴파일 시 검증 불가 / 가독성 저하
  • QueryDSL의 장점
    • 타입 안정성 : 자바 코드로 쿼리를 작성하므로 컴파일 시점에서 문법 오류나 오타를 발견 가능
    • 동적 쿼리 작성 용이 : 조건에 따라 동적으로 변하는 쿼리를 깔끔하고 직관적으로 작성 가능
    • 가독성과 재사용성 : 복잡한 쿼리를 자바 코드로 구조화하여 가독성이 높고, 특정 조건을 메서드로 추출하여 재사용 할 수 있음
  • Q타입 클래스 : 엔티티 클래스를 기반으로 Q로 시작하는 쿼리용 클래스, 이를 통해 엔티티의 필드를 메서드 체이닝 방식으로 안전하게 참조할 수 있음

2. QueryDSL 검색 기능

  • 기본 구조 이해(QueryDSL 구조)
queryFactory
    .select(조회대상)
    .from(대상엔티티)
    .where(조건)
    .orderBy(정렬)
    .fetch();

  • 기본 검색 쿼리 메서드
메서드의미예시
eq()같다user.roleEnum.eq(UserRoleEnum.ADMIN)
ne()다르다user.username.ne("관리자")
gt()초과user.id.gt(1)
goe()이상user.id.goe(3)
contains()포함user.email.contains("gmail")
endsWith()끝남user.email.endsWith(".com")

  • 정렬
    offset() = 시작위치 , 몇 번째 부터 검색을 시작할지 정한다 (기본값 = 0)
    limit() = 개수, 최대로 불러올 개수를 정한다

3. 다양한 검색 예제

문자열 검색

목표: “여행” 키워드가 포함된 게시글(Post) 조회

List<Post> result = queryFactory
    .selectFrom(post)
    .where(post.content.contains("여행")) // 실제 SQL의 LIKE '%keyword%'와 동일하게 동작한다.
    .fetch();

결과 예시

후쿠오카 여행 후기  (작성자: 앨리스)

논리 조합

목표: ADMIN 사용자 또는 이름에 “밥”이 포함된 사용자 조회

List<User> result = queryFactory
    .selectFrom(user)
    .where(
           user.roleEnum.eq(UserRoleEnum.ADMIN)
             .or(user.username.contains("밥"))
    )
    .fetch();

결과 예시

관리자 (ADMIN)
밥 (NORMAL)

조인 검색

목표: “앨리스”가 작성한 게시글(Post) 조회

List<Post> result = queryFactory
    .selectFrom(post)
    .join(post.user, user) // 실제 SQL의 INNER JOIN과 동일하게 동작한다.
    .where(user.username.eq("앨리스"))
    .fetch();

결과 예시

후쿠오카 여행 후기
조호바루 맛집 탐방
싱가포르 출퇴근 일상

Fetch Join

목표: 게시글과 작성자 정보를 한 번에 로딩

List<Post> result = queryFactory
    .selectFrom(post)
    .join(post.user, user).fetchJoin()
    .fetch();
  • fetchJoin()은 N+1 문제를 방지하며, Post 조회 시 User까지 한 번에 조회합니다.
profile
개발공부 처음해보는 사람

0개의 댓글