본문 바로가기

Web/Spring

[Hibernate + Spring Data JPA + Querydsl] Querydsl

반응형

 

[Querydsl]

Querydsl이란?

- 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 프레임워크.

- 문자열로 작성하거나 XML 파일(ex : Ibatis, Mybatis)에 쿼리를 작성하는 대신, Querydsl이 제공하는 플루언트(Fluent) API를 이용해서 쿼리를 생성할 수 있다.

 

단순 문자열과 비교해서 Fluent API를 사용하는 장점

- IDE의 코드 자동 완성 기능 사용

- 문법적으로 잘못된 쿼리를 허용하지 않음

- 도메인 타입과 프로퍼티를 안전하게 참조할 수 있다.

- 도메인 타입의 리펙토링을 더 잘 할 수 있음.

 

** 기존 String형의 SQL쿼리가 문자로 Type Check가 불가능하고, 실행하기 전까지 작동 여부를 확인 하기 어려운 부분이 있던 단점을 보완하여 SQL을 Java로 Type safety하게 지원하는 것이 Spring Querydsl 프레임워크이다.

 

목적

- 타입에 안전한 방식으로 HQL(Hibernate Query Language)를 실행하기 위한 목적으로 만들어졌다.

HQL 쿼리를 작성하다보면 String 연결을 이용하게 되어 이는 결과적으로 많은 양의 읽기 어려운 코드를 만드는 문제를 발생시킬 뿐만 아니라 String을 이용해서 도메인 타입과 프로퍼티를 참조하다보면 오타 등으로 잘못된 참조를 하게 될 수 있다.

 

- 타입에 안전하도록 도메인 모델을 변경하면 소프트웨어 개발에 큰 이득을 얻게 된다. 도메인의 변경이 직접적으로 쿼리에 반영되고, 쿼리 작성 과정에서 코드 자동완성 기능을 사용함으로써 쿼리를 더 빠르고 안전하게 만들 수 있게 된다.

 

** Querydsl의 최초 쿼리 언어 대상은 Hibernate의 HQL이었으나, 현재는 JPA, JDO, JDBC, Hibernate Serch, MongoDB, 콜렉션 그리고 RDFBean을 지원한다.

 

핵심원칙

- 첫째, 타입 안정성(Type safety) 이다. 도메인 타입의 프로퍼티를 반영해서 생성한 쿼리 타입을 이용해서 쿼리를 작성하게 된다. 또한, 완전히 타입에 안전한 방법으로 메서드 호출이 이루어진다.

- 둘째, 일관성(Consistency) 이다. 기반 기술에 상관없이 쿼리 경로와 실행되는 오퍼레이션은 모두 동일하며, Query 인터페이스는 공통의 상위 인터페이스를 갖는다.

 

모든 쿼리 인스턴스는 여러 차례 재사용 가능하다. 쿼리 실행 이후 페이징 데이터와 프로젝션 정의는 제거된다.

 

** Javadoc에서 com.querydsl.core.Query / com.querydsl,core,Projectable / com.querydsl.query.types.Exception의 내용을 확인해보면 Querydsl 쿼리와 표현 타입이 제공하는 표현의 범위와 표현력을 알 수 있다.

 

 

[Spring Data JPA]

JPA(Java Persistence API)란?

- 자바 어플리케이션에서 관계형 데이터베이스(RDBMS)를 사용하는 방식을 정의한 인터페이스이다.

- JPA는 인터페이스 이기때문에 특정 기능을 수행하는 라이브러리가 아니여서 Spring Data JPA는 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 방법일 뿐이다.

- 이와 같이 JPA는 단순 명세(interface)이기 때문에 구현이 존재하지 않는다. JPA를 정의한 javax.persistence 패키지의 대부분은 interface, enum, Exception 과 각종 Annotation으로 이루어져 있다. 예를 들어, JPA의 핵심이 되는 EntityManagerjavax.persistence.EntityManager라는 파일에 interface로 정의되어 있다.

 

Spring Data JPA

- 위와 같은 JPA를 Spring Framework에서 편하게 사용하기 위해 제공하는 모듈이다.

- JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring에서 해당 메소드 이름에 적합한 쿼리를 수행하는 구현체를 만들어 Bean으로 등록해준다.

 

[Hibernate]

- JPA라는 명세의 구현제이다.

- 하이버네이트는 JPA의 구현체이기 때문에 JPA를 사용하기 위해서 반드시 하이버네이트를 사용할 필요가 없다.

 

**Hibernate / JPA / Spring Data JPA의 구조

******Querydsl reference : http://www.querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/

반응형