https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84
※ 실무 활용 - 순수 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 하여 모든 기능을 편하게 구현할 수 있다.
- 코드 분석 필요
'Spring' 카테고리의 다른 글
[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 - 1 (0) | 2022.06.06 |
---|---|
[Spring] ThymeLeaf 정리 - 1 (0) | 2021.11.22 |
[Spring] 실전! Querydsl - 2 (0) | 2021.09.09 |
[Spring] 실전! Querydsl - 1 (0) | 2021.09.09 |
[Spring] 실전! 스프링 데이터 JPA - 3 (0) | 2021.09.06 |