728x90
320x100
QueryDSL?
QueryDSL은 데이터베이스 쿼리를 생성하기 위한 자바 라이브러리로, JPQL(Java Persistence Query Language)을 보다 유연하게 사용할 수 있도록 도와준다.
주로 JPA(Java Persistence API)와 함께 사용되며, 런타임 시점에 유효성 검사가 가능하며, IDE의 자동완성 기능을 지원하여 쿼리 작성 시 오타 등을 방지하는 등의 장점이 있다.
기능 및 장점
- 타입 안정성(Type Safety)
- Java 코드로 쿼리 작성 -> 컴파일 시점에서 타입 안정성 제공
- 오타나 잘못된 속성명을 사용할 경우 컴파일 오류로 잡아낼 수 있어 개발 단계에 도움을 줄 수 있다.
- Entity 클래스와 QueryDSL의 연동
- 엔티티 클래스를 기반으로 쿼리 작성 가능
- -> 데이터베이스 테이블과 일대일 매핑되는 엔티티 클래스를 사용하여 쿼리를 작성할 수 있음.
- 동적 쿼리 생성
- 검색 조건이나 정렬 조건에 따라 쿼리를 동적으로 생성할 수 있다.
- 즉, 조건에 따라 쿼리가 변하는 경우에도 유연한 작성 가능
- ex) https://chaeyami.tistory.com/258
- JPQL 대체
- JPQL : 문자열로 쿼리 작성 -> 오타가 발생할 가능성이 있고, IDE의 지원을 받을 수 없는 단점
- QueryDSL : 자바 코드로 쿼리 작성 -> IDE의 지원 + 오타 방지
- 집계 함수 및 서브쿼리 지원
- 집계 함수나 서브쿼리 등 고급 쿼리 작성 지원
- 복잡한 쿼리문 작성에 용이
가령, 스프링부트 JPA를 사용해 사용자(User) 엔티티를 조회하는 서비스 메서드를 구현하는 경우
이를 JPQL을 사용해 구현하면 다음과 같다.
@Repository
public class UserRepository {
@PersistenceContext
private EntityManager entityManager;
public List<User> findByUsername(String username) {
String jpql = "SELECT u FROM User u WHERE u.username = :username";
return entityManager.createQuery(jpql, User.class)
.setParameter("username", username)
.getResultList();
}
}
이렇게 문자열로 쿼리문을 작성해야 한다. 오타의 위험성은 물론이고, 컴파일 시점에 검증할 수 없기 때문에 쿼리 오류가 런타임 에러로 뜰 수 있다. 그럼 뭐가 잘못됐는지 찾기 위해 또 많은 시간을 써야 한다.
그리고 이를 QueryDSL 을 사용해 구현하게 되면
@Repository
public class UserRepository {
private final JPAQueryFactory queryFactory;
public UserRepository(EntityManager entityManager) {
this.queryFactory = new JPAQueryFactory(entityManager);
}
public List<User> findByUsername(String username) {
return queryFactory
.selectFrom(QUser.user)
.where(QUser.user.username.eq(username))
.fetch();
}
}
유의점
- N+1 문제
- 연관된 엔티티를 조회할 때 즉시 로딩(Eager Loading)이 아닌 지연 로딩(Lazy Loading)으로 설정해야 한다.
- 쿼리 성능 최적화
- QueryDSL을 사용해 복잡한 쿼리를 작성할 땐 성능을 고려해 작성해야 한다.
- 불필요한 조인이나 검색 조건 없는 쿼리를 작성하는 것은 피하는 것이 좋음.
- 코드 리뷰
- QueryDSL을 사용한 코드는 가독성이 중요
- 따라서 코드 리뷰를 통해 다른 개발자들이 이해하기 쉽도록 작성하는 것이 중요하다.
300x250
반응형
GitHub 댓글