amplitude.init("2e2e5a386856efdf3237cf254a9d14d9"

[개념 콕] QueryDSL

내일배움캠프 수료생이 개발에 꼭 필요한 핵심 개념만 콕 집어 드립니다.
May 31, 2024
[개념 콕] QueryDSL
✍🏼
개발을 시작하시는 여러분, 정보가 너무 많고 배워야 할 것도 산더미라 어디서부터 시작해야 할지 막막하신가요? 내일배움캠프 수료생들이 4개월 동안 배운 엄선된 핵심 개념을 직접 정리해서 알려 드립니다. 공부하다 막히거나 헷갈리는 개념이 있다면 개념 콕으로 정리해보세요.
 

QueryDSL

QueryDSL이란?

DSL은 Domain Specific Language의 약어로, 특정 영역에 특화된 언어를 의미합니다. 즉, QueryDSL은 데이터베이스 쿼리 작성을 위해 특정 도메인에 맞게 설계된 언어입니다.
 
 

QueryDSL의 목적

QueryDSL의 주요 목적은 JPQL(Java Persistence Query Language) 쿼리를 생성하는 것입니다. 이를 통해 데이터베이스와의 상호작용을 타입 안전하고 효율적으로 처리할 수 있습니다.
 
 

QueryDSL의 특징

  • 타입 안전성 쿼리를 작성할 때 타입 안전성을 보장하여 컴파일 타임에 오류를 검출할 수 있습니다.
  • 자동 생성된 Q 클래스 각 엔티티에 대한 Q 클래스가 자동 생성되어, 쿼리 작성 시 이를 활용할 수 있습니다.
  • 코드 가독성 SQL 쿼리를 문자열로 작성하는 대신, Java 코드로 쿼리를 작성할 수 있어 코드의 가독성이 좋습니다.
  • 동적 쿼리 작성 용이 쿼리 작성 시 동적 조건을 추가하거나 변경할 때 편리합니다. 이를 활용해 복잡한 비즈니스 로직을 쉽게 구현할 수 있습니다.
  • 높은 추상화 수준 데이터베이스의 구현 세부 사항을 직접 다룰 필요가 없기 때문에 더 높은 수준의 쿼리를 작성할 수 있습니다.
  • 테스트 용이 쿼리가 Java 코드로 작성되므로 테스트 코드 작성이 쉽습니다.
  • 성능 쿼리DSL 사용 시 조인 등 복잡한 쿼리의 최적화가 가능합니다. 또한 쿼리 객체를 재사용할 수 있기 때문에 성능 상의 이점이 있습니다.
 
 

QueryDSL 사용법

1) 프로젝트 설정
Gradle(Java 프로젝트 빌드 도구) 설정 파일에 QueryDSL 관련 라이브러리를 의존성으로 추가합니다.
dependencies { implementation 'com.querydsl:querydsl-jpa' annotationProcessor 'com.querydsl:querydsl-apt:jpa' }
 
2) 엔티티 클래스 생성
JPA를 사용하여 데이터베이스 테이블과 매핑되는 Java 클래스(엔티티)를 생성합니다. 아래 예시 코드를 참고해주세요.
@Entity public class Member { @Id @GeneratedValue private Long id; private String name; }
 
3) Q 클래스 생성
QueryDSL에서 사용되는 Q 클래스는 엔티티 클래스를 기반으로 자동 생성됩니다.
Gradle 빌드를 실행하면 지정된 디렉토리 build/generated/sources/annotationProcessor/java/main에 Q 클래스가 생성됩니다.
 
4) 쿼리DSL을 사용한 리포지토리 작성
JPAQueryFactory를 사용하여 쿼리를 작성합니다. 이를 통해 복잡한 쿼리를 Java 코드로 간결하고 가독성 있게 표현할 수 있습니다.
import com.querydsl.jpa.impl.JPAQueryFactory; import static com.myapp.domain.QMember.member; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class MemberRepository { @PersistenceContext private final EntityManager em; private final JPAQueryFactory queryFactory; @Autowired public MemberRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFactory(em); } public List<Member> findMembers(String name) { return queryFactory.selectFrom(member) .where(member.name.eq(name)) .fetch(); } }
 
 

JPA, SQL, QueryDSL 비교

JPA, SQL, QueryDSL 각각의 기술, 특징, 장점, 단점, 예시 코드를 비교하고 프로젝트의 특성에 맞는 기술을 선택해보세요.
 

기술, 특징, 장단점

기술
JPA (Spring Data JPA)
SQL
QueryDSL
특징
간단한 CRUD 쉽게 처리 가능
데이터베이스에서 직접 쿼리를 작성하여 실행
자바 코드로 쿼리 작성
장점
1. 빠른 개발 속도 2. 리포지토리 인터페이스를 통해 자동으로 쿼리 생성
모든 SQL 기능을 활용할 수 있어서 복잡한 쿼리 작성에 유리
1. 타입 안전성 2. 코드 가독성 3. 동적 쿼리 작성이 용이
단점
1. 복잡한 쿼리 작성이 어려움 2. 동적 쿼리 작성에 제한적
쿼리 문자열로 작성해야 하므로 타입 안전성이 없고, 유지보수가 어려움
1. 초기 설정이 필요 2. 가파른 러닝 커브
이를 코드로 비교해보면 아래와 같습니다.
 
1) JPA
public interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findByName(String name); }
 
2) SQL
public List<Member> findByName(String name) { String sql = "SELECT * FROM member WHERE name = ?"; return jdbcTemplate.query(sql, new Object[]{name}, new MemberRowMapper()); }
 
3) QueryDSL
public List<Member> findMembers(String name) { return queryFactory.selectFrom(member) .where(member.name.eq(name)) .fetch(); }
 
QueryDSL은 타입 안전한 쿼리 작성을 통해 코드의 가독성과 유지보수성을 높이며, 동적 쿼리를 유연하게 작성할 수 있는 강력한 도구입니다. JPA와 SQL에 비해 더 높은 추상화 수준을 제공하며, 복잡한 비즈니스 로직을 더 쉽게 구현할 수 있습니다.
 
 
 

내일배움캠프는 개발에 필요한 핵심만 배웁니다

지금까지 꼭 필요한 개발 지식에 대해 알아보았습니다. 내일배움캠프에서는 전문가들이 선별한 핵심 개발 지식으로 개발 공부도, 취업도 보다 효율적으로 할 수 있는데요. 국내 유수의 IT기업 출신 튜터님들과 실습 위주의 독보적인 커리큘럼으로 개발자 취업을 체계적으로 준비해보세요. 내일배움캠프 4개월, 여러분 인생의 가장 큰 터닝 포인트입니다.
 
 
 
CREDIT
글 | 박상신 내일배움캠프 수료생 편집 | 정효재 팀스파르타 에디터
 
 

취업 준비, 어디서부터 시작해야 할지 모르겠다면?

 
🧐비전공자인데 IT 업계 취업할 수 있을까?
😟프로젝트 경험이 부족한데, 어떻게 준비해야 할까?
🥺IT 기업으로 이직하고 싶은데 뭐부터 시작해야 할까?
 
이런 고민을 하고 있다면, 내일배움캠프의 IT 취업 컨설팅을 받아보세요.
취업 코칭 전문가들이 여러분의 고민을 해결해 드립니다.
 
다음 링크에 이메일을 입력하시면 메일로 1:1 커리어 상담권과 취준 자료집을 보내드릴게요.
 
 
 
Share article
Subscribe to our newsletter
RSSPowered by inblog