[JPA / Querydsl, JPQL] 복잡한 쿼리와 동적 쿼리 처리를 위한 querydsl, JPQL 소개
JPA
인터페이스로서 자바 표준 명세서입니다. 인터페이스인 JPA를 사용하기 위해서는 구현체가 필요하다.
Hibernate, Eclipsem, Link등이 있다.
Spring에서 JPA를 사용할때는 이 구현체들을 직접 다루지 않는다.
구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈을 이용해 JPA 기술을 다룬다.
관계를 보면
Spring Data JPA > Hibernate > JPA
Hibernate를 쓰는 것과 Spring Data JPA를 쓰는 것 사이에는 큰 차이가 없다.
그럼에도 스프링 진영에서는 Spring Data JPA를 개발했고 이를 권장하고 있다.
한단계 더 감싸놓은 Spring Data JPA 가 등장한 이유는 크게
- 구현체 교체의 용이성 : Hibernate 외에 다른 구현체로 쉽게 교체하기 위함 , 구현체 매핑을 지원해주면 쉽게 교체가 가능하다.
- 저장소 교체의 용이성 : 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함이다. 의존성 교체가 쉽기 때문이다.
>> CRUD의 인터페이스가 같은 Spring Data들의 하위 프로젝트
spring-boot-starter-data-jpa
- spring boot용 spring data jpa 추상화 라이브러리
- spring boot 버전에 맞춰 자동으로 JPA관련 라이브러리들의 버전을 관리해준다.
h2
- 인메모리 관계형 데이터 베이스
-별도 설치 필요없이 프로젝트 의존성만으로 관리할 수 잇다.
-메모리에서 실행되기 때문에 애플리케이션을 재시작할 때마다 초기화되어 테스트용도로 많이 사용
[개요]
Spring Boot + JPA 에 대해 배우고 나면 다음으로 Querydsl 을 할 차례 같다.
가끔 공고에 보여서 잠깐 정리해두고 가려고 한다.
[Querydsl 간단 설명]
JPA는 다양한 쿼리 방법을 지원한다.
- JPQL(Querydsl의 JPA 모듈)
- JPA Criteria
- QuertDSL
- 네이티브 SQL
- JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 와 함께 사용한다.
[장점]
JPA에서 사용하는 JPQL보다 간편하다.
프레임워크다.
모든 sql 문법을 자바 코드로 지원하고 있고 code assistance를 받을 수 있다.
다양한 장점이 있지만 러닝 커브가 있다고 한다.
유명 강의로는 실전! Querydsl 이 있다.
- 쿼리를 문자가 아닌 진짜 자바 코드로 작성한다. > 핵심 비즈니즈 로직을 개발하는데 집중이 가능하다.
- 동적 쿼리 문제를 깔끔하게 해결한다.
- 문법 오류도 컴파일 시점에서 잡아준다.
JPQL 소개
Java Persistence Query Languagage
- 가장 단순한 조회 방법
- EntityManager.find()
- 객체 그래프 탐색
- ex) 나이가 18살 이상인 회원을 모두 검색하고 싶다면?
JPQL
- JPA를 사용하면 entity 객체를 중심으로 개발한다.
- 문제는 검색 쿼리다.
- 검색을 할때도 테이블이 아닌 entity 객체를 대상으로 검색을 해야한다.
ex) DB를 몰라야 한다. 자바 코드에서 멤버 객체가 있구나 생각을 가지고 개발하게끔 하는게 좋다.
- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.
- 애플리케이션이 필요한 데이터만 DB 에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
- 그래서 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
- SQL과 문법이 유사하고 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 등을 지원한다.
- JPQL은 Entity 객체를 대상으로 쿼리를 질의하고 SQL은 데이터베이스 테이블을 대상으로 쿼리를 질의한다.
- SQL 을 추상화해서 특정 데이터 베이스 SQL에 의존하지 않고 JPQL을 한마디로 정의하면 객체 지향 SQL 이다.
Querydsl 설정
스프링 부트 2.6 이상, Querydsl 5.0 지원 방법
최근 스프링 부트 2.6 이상 버전에서는 Querydsl 5.0을 사용한다.
변경된 사항에 따라 build.gradle 설정을 변경해야 한다.
- querydsl-jpa, querydsl-apt 를 추가하고 버전을 명시해야 한다.
- 변경사항
- PageableExecutionUtils 클래스 사용 패키지 변경
- 기능이 Deprecated 된 것은 아니고, 사용 패키지 위치가 변경되었다. 기존 위치를 신규 위치로
변경하면 문제 없이 사용할 수 있다.
- 기능이 Deprecated 된 것은 아니고, 사용 패키지 위치가 변경되었다. 기존 위치를 신규 위치로
- Querydsl fetchResults(), fetchCount() Deprecated(향후 미지원)
- Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다.
- PageableExecutionUtils 클래스 사용 패키지 변경
H2 설치 후 권한때문에 실행되지 않는다면 실행파일 위치에서 chmod 755 h2.sh
- jdbc:h2:~/querydsl 최초 한번 실행한다.
- ~/querydsl.mv.db 생성 확인
- 이후 부터는 jdbc:h2:tcp://localhost/~/querydsl 이렇게 접속한다.
>> 일단 h2 설치랑 여러 책, 문서에서 섞어서 정리.
REFERENCE
- http://querydsl.com/
- https://velog.io/@shlee327/Querydsl-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95-%ED%95%99%EC%8A%B5%ED%95%98%EA%B8%B0
- https://tecoble.techcourse.co.kr/post/2021-08-08-basic-querydsl/