본문으로 바로가기

[Spring] 실전! Querydsl - 3

category Spring 2021. 9. 13. 13:19

https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84

 

실전! Querydsl - 인프런 | 강의

Querydsl의 기초부터 실무 활용까지 한번에 해결, 본 강의는 자바 백엔드 개발의 실전 코스를 완성하는 마지막 강의 입니다. 스프링 부트와 JPA 실무 완전 정복 로드맵을 우선 확인해주세요. 로드

www.inflearn.com

 

※ 실무 활용 - 순수 JPA와 Querydsl

ㅁ 순수 JPA 리포지토리와 Querydsl

- jpaqueryfactor 동시성 문제는 entitymanger에 의존하게 됨

 entitymanager는 프록시 단위로 만들어지기 때문에, 트랜잭션에 따라 따로 처리하게 됨

 

ㅁ 동적 쿼리와 성능 최적화 조회 - Builder 사용

- springframework util의 StringBuilderUtils 사용하여 "" , null 동시에 처리

 - 동적쿼리에서 조건문에 아무것도 안들어갈 경우, 전체를 가져오게 되는데 이럴 경우 데이터가 방대하면 문제가 될 수 있따.

   페이징 처리나 기본조건이 들어가야 한다.

 

ㅁ 동적 쿼리와 성능 최적화 조회 - Where절 파라미터 사용

- predicate 를 BooleanExpression으로 바꾸는게 좋음

- 재사용이 가능한 코드들이고, 읽기 편함

- 선호하는 방식

- 리턴값 혹은 프로젝션을 바꿔도, where의 조건절은 재상용이 가능하다

- null만 조심할 경우 조립가능

 > 모든 쿼리에 들어가는 공통 조건(ex) delYn 체크 등등0)을 isValid()로 만들어서 where에 넣기만 하면 됨

 

ㅁ 조회 API 컨트롤러 개발

- @PostConstruct와 @Transactional 은 동시에 쓸 수 없음

 > Service를 따로 만들어서 해결

 

※ 실무 활용 - 스프링 데이터 JPA와 Querydsl

ㅁ 스프링 데이터 JPA 리포지토리로 변경

- 인터페이스 생성 및 jparepository 인터페이스 상속받아 생성

 

ㅁ 사용자 정의 리포지토리

- 커스텀 인터페이스를 만들어 구현하고( 이름을 반드시 Impl 을 뒤에 붙여야함 ), 이를 JPArepository 인터페이스를 상속받은 곳에 상속시킨다.

- 커스텀 리포지토리라고 모든 커스텀 쿼리를 넣으려고 하지 말자.

 > 분리를 하는것이 좋을수도 있음 (조회나 화면에 맞게)

 

ㅁ 스프링 데이터 페이징 활용1 - Querydsl 페이징 연동 & CountQuery 최적화

- PageImpl은 스프링데이터의 Page의 구현체

- 컨텐츠 쿼리와 카운트 쿼리를 나눠서 실행 후, 페이지 구현하기

- 카운트 쿼리 생략 가능한 경우

  > 페이지 시작이면서 컨텐츠 사이즈가 페이지 사이즈보다 작을 때

 > 마지막 페이지일때

  >>> PageableExecutionUtils.getPage 에서 카운트 쿼리. fetchCount()를 넣어서 리턴함

- 정렬은 Pageable의 sort가 있으나 사용하기 어려움 (조인이 들어있을 경우 사용 어려움)

 > 변수를 받아서 그냥 쿼리에서 정렬하는게 좋음

 

ㅁ 스프링 데이터 JPA가 제공하는 Querydsl 기능

- 실무에서는 사용하기는 어렵다.

- 아래와 같이 사용

    Iterable<Member> result = memberRepository.findAll(member.age.between(10, 40)
    .and(member.username.eq("member1")));

- 조인이 되지않음 ( 가장 치명적인 단점 )

- 서비스 클래스가 Querydsl에 의존해야함

- Pageable, sort 지원함

- 단순한 테이블에는 그나마 쓸 수 있따.

 

ㅁ Querydsl Web 지원

- 컨트롤러의 파라미터를 파라미터 바인딩을 querydsl 통한 Predicate로 받을 수 있음

 -> 바로 리포지토리의 메소드의 where 조건 파라미터로 입력 가능

- Equal 만 가능, Join 안됨

- 권장하지 않음!! 기능의 제약이 많음

 

ㅁ QuerydslRepositorySupport

 - 추상 클래스

- EntityManager를 가지고 있음 (따로 안받아도 됨)

- 페이징 관련하여 간략하게 구현할 수 있다. (그렇게 좋아보이지는 않음)

- 치명적인 단점 : 파라미터 바인딩 되는 sort는 안됨

- querydsl 3.0 버전 대상으로 만들어서 from으로 시작함 (select로 시작할 수 없음)

-  스프링 데이터 sort 기능이 정상 동작하지 않음

 > 파라미터로 받아서 sort조건 생성

 

 

ㅁ Querydsl 지원 클래스 직접 만들기

- Querydsl4RepositorySupport 코드에 반복되는 로직을 간단히 구현해두었음

- 간단하게 이걸 extends 하여 모든 기능을 편하게 구현할 수 있다.

- 코드 분석 필요