QueryDsl이란?
QueryDsl은 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크입니다.
QueryDSL을 사용하면 코드에서 SQL 쿼리를 직접 작성하는 대신 자바 객체와 메서드를 사용하여 쿼리를 작성할 수 있어, 컴파일 시점에 문법 오류를 잡을 수 있고 코드 가독성이 높아집니다.
왜 사용하나?
실제로 Query를 사람이 짜다보면 수많은 쿼리를 수작업으로 생성해야한다.
사람이 짜다보면 Query는 컴파일 단계에서 오류가 있는지 알 수가 없다.
(String으로 처리되기 때문이다.)
Query 생성을 자동화 하여, 자바 코드로 작성할 수 있다.
그 외 기타 이득이 많다.
QueryDSL 설정 및 사용 예시
- 프로젝트 설정
Maven 또는 Gradle을 사용하여 QueryDSL을 프로젝트에 추가할 수 있습니다. 여기서는 Gradle을 사용한 설정을 예시로 보여드리겠습니다.
plugins {
id 'org.springframework.boot' version '2.5.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor 'com.querydsl:querydsl-apt'
annotationProcessor 'javax.persistence:javax.persistence-api'
}
test {
useJUnitPlatform()
}
- 엔티티 클래스 생성
먼저, 데이터베이스 테이블과 매핑될 엔티티 클래스를 생성합니다.
package com.example.demo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getters and setters
}
- Q 클래스 생성
QueryDSL은 엔티티 클래스를 기반으로 Q 클래스를 생성합니다. Q 클래스는 QueryDSL에서 사용되는 타입 안전한 쿼리를 작성할 수 있게 해줍니다.
Gradle 빌드를 실행하면 build/generated 디렉토리에 Q 클래스가 생성됩니다. 이 예시에서는 QUser 클래스가 생성됩니다.
- Repository 클래스
QueryDSL을 사용하기 위해 사용자 정의 Repository 인터페이스와 구현 클래스를 작성합니다.
UserRepositoryCustom.java:
package com.example.demo;
import java.util.List;
public interface UserRepositoryCustom {
List<User> findUsersByName(String name);
}
UserRepositoryImpl.java:
package com.example.demo;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import javax.persistence.EntityManager;
import java.util.List;
public class UserRepositoryImpl implements UserRepositoryCustom {
private final JPAQueryFactory queryFactory;
@Autowired
public UserRepositoryImpl(EntityManager entityManager) {
this.queryFactory = new JPAQueryFactory(entityManager);
}
@Override
public List<User> findUsersByName(String name) {
QUser user = QUser.user;
return queryFactory.selectFrom(user)
.where(user.name.eq(name))
.fetch();
}
}
UserRepository.java:
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {
}
- 서비스 및 컨트롤러 클래스
서비스 및 컨트롤러 클래스에서 QueryDSL을 사용하여 쿼리를 실행할 수 있습니다.
UserService.java:
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getUsersByName(String name) {
return userRepository.findUsersByName(name);
}
}
UserController.java:
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getUsersByName(@RequestParam String name) {
return userService.getUsersByName(name);
}
}
요약
이 예시는 QueryDSL을 사용하여 타입 안전한 SQL 쿼리를 작성하고 Spring Data JPA와 통합하는 방법을 보여줍니다. QueryDSL을 사용하면 코드 가독성을 높이고 컴파일 시점에 쿼리 오류를 잡을 수 있습니다.
참고 :
https://velog.io/@jkijki12/Spring-QueryDSL-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
'개발 > Spring' 카테고리의 다른 글
[Spring] spring 기초 (0) | 2023.03.09 |
---|---|
[Spring] 어노테이션 모음집 (0) | 2023.03.08 |
[Spring] Spring Boot (0) | 2023.02.10 |
[Spring] Spring Framework (0) | 2023.02.10 |
[Spring] Spring Framework vs Spring MVC (0) | 2022.12.26 |