[스프링 DB 2편] #7. 데이터 접근 기술 - Querydsl #591
Develop-KIM
started this conversation in
동환
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Querydsl 소개1 - 기존 방식의 문제점
긴급 요구사항
쿼리 추가
버그 발생
문자를 합치면
"select * from memberwhere name like ?and age between ? and ?"QUERY의 문제점
에러는 크게 2가지
SQL, JPQL
Type-safe
QueryDSL
JPA에서 QUERY 방법은 크게 3가지
JPQL(HQL)
장점 : SQL QUERY와 비슷해서 금방 익숙해진다.
단점: type-safe 아니라 동적쿼리 생성이 어렵다.
Criteria API
장점 : 동적쿼리 생성이 쉽다.
단점 : type-safe 가 아니다. 복잡하다.
MetaModel Criteria API (type-safe)
QueryDSL 분석
DSL
QueryDSL
JPA, MongoDB, SQL 같은 기술들을 위해 type-safe SQL을 만드는 프레임워크이다.
Querydsl-JPA
Querydsl-JPA 기능
구성
기능 살펴보기
SpringDataJPA + Querydsl
Querydsl 설정
스프링 부트 2.x와 스프링 부트 3.x의 설정이 다르다.
스프링 부트 2.x 설정
build.gradle
스프링 3.x 설정
Q타입 삭제
Querydsl 적용
JpaItemRepositoryV3
공통
JPAQueryFactory가 필요하다.JPAQueryFactory는 JPA 쿼리인JPQL을 만들기 때문에
EntityManager가 필요하다.JdbcTemplate을 설정하는 것과 유사하다.JPAQueryFactory를 스프링 빈으로 등록해서 사용해도 된다.save(), update(), findById()
기본 기능들은 JPA가 제공하는 기본 기능을 사용한다.
findAllOld
Querydsl을 사용해서 동적 쿼리 문제를 해결한다.
BooleanBuilder를 사용해서 원하는where조건들을 넣어주면 된다.이 모든 것을 자바 코드로 작성하기 때문에 동적 쿼리를 매우 편리하게 작성할 수 있다.
findAll
앞서
findAllOld에서 작성한 코드를 깔끔하게 리팩토링 했다. 다음 코드는 누가 봐도 쉽게 이해할 수 있을 것이다.where(A,B)에 다양한 조건들을 직접 넣을 수 있는데, 이렇게 넣으면 AND 조건으로 처리된다.참고로
where()에null을 입력하면 해당 조건은 무시한다.likeItemName(),maxPrice()를 다른 쿼리를 작성할 때 재사용 할 수 있다는 점이다.쉽게 이야기해서 쿼리 조건을 부분적으로 모듈화 할 수 있다. 자바 코드로 개발하기 때문에 얻을 수 있는 큰 장점이다.
QuerydslConfig
ItemServiceApplication - 변경*
QuerydslConfig를 사용하도록 변경했다.예외 변환
Querydsl은 별도의 스프링 예외 추상화를 지원하지 않는다. 대신에 JPA에서 학습한 것 처럼@Repository에서 스프링 예외 추상화를 처리해준다.정리
Querydsl 장점
Querydsl 덕분에 동적 쿼리를 매우 깔끔하게 사용할 수 있다.
likeItemName(itemName),maxPrice(maxPrice)메서드를 다른 쿼리에서도 함께 사용할 수 있다.Querydsl을 사용해서 자바 코드로 쿼리를 작성하는 장점을 느껴보았을 것이다. 그리고 동적 쿼리 문제도 깔끔하게 해결해보았다.
Querydsl은 이 외에도 수 많은 편리한 기능을 제공한다. 예를 들어서 최적의 쿼리 결과를 만들기 위해서
DTO로 편리하게 조회하는 기능은 실무에서 자주 사용하는 기능이다.
JPA를 사용한다면 스프링 데이터 JPA와 Querydsl은 실무의 다양한 문제를 편리하게 해결하기 위해 선택하는 기본 기술이라 생각한다.
All reactions