Spring JPA
이커머스 프로젝트를 진행하면서 jpa를 사용하였다.
덕분에 sql을 직접 작성하지 않고 메서드를 통해서 쿼리를 구현하였지만,,
OneToMany 관계를 가지는 구조에서 직접적인 연관관계가 없다면,
many 쪽에서 one의 엔티티를 가져오는것이 번거롭다.
Product : 나이키 에어포스
ProductItem : 260
ProductItem_status : 품절
status로부터 해당 product를 가져오기 위해서는 jpa 로는 안되고 엔티티 내부를 들어가서 비교문과 반복문을 통해 가져와야한다.
또한 가져오는 과정에서 모든 필드가 넘어오므로 원하는 필드만 가져오는것도 불가능하다. Dto를 따로 만들어 반환한 이유이다.
@Query를 이용한 JPQL
sql문을 직접 쓰는거라 오타날 확률이 많고, 오류를 런타임시점에서 알수 있다.
QueryDSL
Domain Specific Language
도메인에 특화된 언어라는데,,
기존 Entity로 설정된 클래스를 Q타입이라는 쿼리 클래스로 미리 생성하여 작업한다.
해당 클래스를 이용하여 쿼리(자바코드기반)를 작성하면된다.
즉 JPQL을 자바코드로 쓰게 해주는 프레임워크라고 생각하면된다.
장점
- 컴파일 시점에 문법 오류 확인 가능 & 자동완성
- 동적 쿼리 작성 편리
단점
- jpa 1차 캐시 사용 불가
JPQL을 사용하면 SQL로 번역되어 디비에 바로 쿼리를 날린다.
JPA를 사용하게 되면 영속성 컨텍스트 1차 캐시에 데이터가 저장이 되는데, QueryDSL은 직접적으로 디비에서 조회하기 때문이다.
Spring Boot 에서 사용방법
Gradle에 추가
plugins {
id 'java'
id 'org.springframework.boot' version '2.6.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
// queryDSL
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
dependencies {
...
// querydsl
implementation "com.querydsl:querydsl-jpa:5.0.0"
implementation "com.querydsl:querydsl-apt:5.0.0"
...
}
// Qtype 생성 경로
def querydslDir = "src/main/java" +
"/generated/querydsl"
querydsl {
library = "com.querydsl:querydsl-apt"
jpa = true
querydslDefault = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
test {
useJUnitPlatform()
}
compileQuerydsl 실행
Qtype 생성경로에 가면 생성되어있다.
'SPRING' 카테고리의 다른 글
[Swagger] RequestHeader 설정하기 (0) | 2024.01.29 |
---|---|
[Feign Client] 정리 및 사용법 (0) | 2024.01.25 |
Swagger 사용방법(feat.springdoc) (1) | 2023.12.30 |
3. 인증 관련 구조와 내부 동작 (1) | 2023.12.23 |
2. Spring Security란? (1) | 2023.12.23 |