스프링
스프링과 JPA를 이용한 웹개발_Querydsl
JANNNNNN
2024. 3. 30. 10:34
JPQL까지 공부했는데.. Querydsl은 또 뭐야?
Querydsl
여태까지 공부했던 JPQL은 정적쿼리였고, Querydsl은 동적쿼리입니다
- 정적쿼리 : 쿼리의 구조와 내용이 런타임 중에 변경되지 않는 쿼리를 말합니다.
- 동적쿼리 : 런타임 중에 쿼리의 구조나 조건이 변경될 수 있는 쿼리를 말합니다.
- Ex) 저자명을 기준으로 책을 찾는 간단한 정적 쿼리, 저자명과 페이지 수 범위를 기준으로 책을 찾는 동적 쿼리
자바 메소드를 사용하므로 문자열 덧셈 연산에서 발생하기 쉬운 잘못된 SQL문 작성 문제 완화
SQL문의 가독성이 높아짐
문자열로 표현된 SQL은 type 체크가 불가능하지만 코드로 작성된 SQL문은 type 체크가 가능
- 컴파일 단계에서 에러가 발생하므로 시스템 운영 시 발생하는 큰 문제를 미연에 방지
일관성: 동일한 인터페이스와 동일한 구현을 기반으로 쿼리가 작성되므로 일관성 있는 쿼리 작성(실행) 가능
Querydsl을 사용은 어떻게 하나요?
먼저! pom.xml에 라이브러리 추가해야합니다
<!-- https://mvnrepository.com/artifact/com.querydsl/querydsl-jpa -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.querydsl/querydsl-apt -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jakarta.annotation/jakarta.annotationapi -->
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
- querydsl-jpa: QueryDSL JPA 라이브러리
- querydsl-apt: 쿼리 타입(Q)을 생성할 때 필요한 라이브러리
Q파일 생성
- 메이븐을 설치하고 메이븐 명령어를 통해 컴파일해도 되지만 IDE의 GUI환경을 사용
- jakarta.annotation-api
➡️ Q파일 생성된 것 확인하면 끝
<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
예제 : Querydsl이 어떻게 활용될까!?
public void addPerson(Person person){
this.person = person;
person.getAddresses().add(this);
}
➡️Address class에서 Person 연관관계 주입해주는 helper 만들기
➕address가 "다"고 person가 "일"이기 때문에 address가 ownership을 가지고 있음!
그래서 this.person = person으로 person은 1명만 주입!
public void addAddress(Address address){
this.addresses.add(address);
address.setPerson(this);
}
➡️Person class에서 address 연관관계 주입해주는 helper 만들기
➕반면, address는 "다"이기 때문에 그냥 add함수를 사용
이렇게 조건을 where절로 넣어서 DB를 관리할 수도 있다!
where절의 조건을 두개 넣어도 괜찮다. (콤마를 넣으면 and절 ,or를 넣으면 or절)
ordering이나 paging도 가능하다!