이전

QueryDSL (type-safe Query)

문제

긴급 요구사항

  • 검색 조건 추가
  • 나이
  • 이름
  • 퇴근시간 10분전…

쿼리 추가 String sql =
“select * from member” +
“where name like ?” +
“and age between ? and ?”

컴파일 완료-> 배포완료-> 퇴근완료-> 버그발생-> !!

문자를 합치면
“select * from memberwhere name like ?and age between ? and ?”

QUERY 의 문제점

  • QUERY 는 문자, Type-check 불가능
  • 실행하기 전까지 작동여부 확인 불가

에러는 크게 2가지

  • 컴파일 에러 (좋은 에러)
  • 런타임 에러 (나쁜 에러)

SQL, JPQL
만약 SQL 이 클래스처럼 타입이 있고 자바 코드로 작성 할 수 있다면?

Type-safe

  • 컴파일시 에러 체크 가능
  • Code-assistant x 100 !!!
  • CTRL + SPACE + . (DOT)

QueryDSL

  • 쿼리를 Java 로 type-safe 하게 개발할 수 있게 지원 하는 프레임워크
  • 주로 JPA 쿼리(JPQL)에 사용

JPA Query (java ORM)

질문 : 사람을 찾아보자

  • 20~40살
  • 성 = 김씨
  • 나이 많은 순서
  • 3명을 출력하라

JPA 에서 QUERY 방법은 크게 3가지

  1. JPQL (HQL)
    • 장점 : SQL QUERY 와 비슷해서 금방 익숙해짐
    • 단점 : type-safe 아님 동적쿼리 생성이 어려움
  2. Criteria API
    • 장점 : 동적쿼리 생성이 쉬움??
    • 단점 : type-safe 아님, 너무 너무 너무 복잡함, 알아야 할게 너무 많음
  3. MetaModel Criteria API(type-safe)
    • Criteria API + MetaModel, Criteria API 와 거의 동일, 복잡하긴 마차가지

이건 아니야ㅡㅡ; -timowest-

QueryDSL?

###DSL

  • 도메인 + 특화 + 언어
  • 특정한 도메인에 초점에 맞춘 제한적인 표현력을 가진 컴퓨터 프로그래밍 언어
  • 특징 : 단순, 간결, 유창

QueryDSL

  • 쿼리 + 도메인 + 특화 + 언어
  • 쿼리에 특화된 프로그래밍 언어
  • 단순, 간결, 유창
  • 다양한 저장소 쿼리 기능 통합
  • JPA, MongoDB, SQL 같은 기술들을 위해 type-safe SQL을 만드는 프레임워크

QueryDSL - JPA

  • Querydsl 은 JAP(JPQL)을 typesafe 하게 작성하는데 많이 사용됨

QUERYDSL -> JPQL -> SQL

장점

  • type-safe
  • 단순함
  • 쉬움

단점

  • Q코드 생성을 위한 APT 를 설정해야함

SpringDataJAP + Querydsl

  • SpringData 프로젝트의 약점은 조회
  • Querydsl 로 복잡한 조회 기능 보완
    • 복잡한 쿼리
    • 동적 쿼리
  • 단순한 겅우 : SpringDataJPA
  • 복잡한 경우 : Querydsl 직접 사용

QueryDSL 결론

  • 한번 써보면 돌아 올 수 없음
  • 감동의 컴파일 에러
  • 감동의 IDE 지원, ctrl+space, Code-assistant
  • JPQL 로 해결하기 어려운 복잡한 쿼리는 네이티브 SQL 쿼리사용 (JdbcTemplate, Mybatis)