Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- gradle
- preventdefault
- Spring Security
- MSA
- cloud native
- Spring Batch
- Crawling
- AuthenticatoinProvide
- REACT
- vue
- Flyway
- Filter
- axios
- SWAGGER
- Reduxpender
- openapi3
- stopPropogation
- cheerio
- Pender
- tasklet
- 리액트
- JavaScript
- MFA
- OpenStack
- Spring REST Docs
- SpringBoot
- SpringRESTDocs
- vuejs
- UsernamePasswordAuthenticationFilter
- T-OTP
Archives
- Today
- Total
Miracle Morning, LHWN
12. JPQL, Criteria, Query DSL 본문
# Hibernate 와 Spring Data JPA 의 차이
- Hibernate : JPA 의 구현체
- Spring Data JPA = 사용하기 편한 모듈
JPQL
- 대소문자 구분
- 엔티티 이름 (테이블명이 아닌 그 테이블에 엔티티로서 설정한 명칭 review)
- 별칭 필수
# 기본 문법
String jpql = "select c from review c";
List<Review> result = em.createQuery(jpql, Review.class).getResultList();
# TypedQuery : Type 의 validation 이 추가
public static void typedQuery(EntityManager em) {
String jpql = "SELECT b FROM review b";
TypedQuery<Review> query =
em.createQuery(jpql, Review.class);
List<Review> reviewList = query.getResultList();
for(Review review : reviewList) {
System.out.println(review.getTitle());
}
}
EntityManager : 엔티티를 관리하는 객체 (쿼리를 요청하거나 관리)
Criteria
CriteriaBuilder cb = this.em.getCriteriaBuilder();
// 업데이트 쿼리
CriteriaUpdate<Review> update = cb.createCriteriaUpdate(Review.class);
// 루트 클래스 만들기
Root e = update.from(Review.class);
// 조회 조건 만들기
update.set("count", newCount);
update.where(cb.greaterThanOrEqualTo(e.get("count "), oldCount));
// 빌더를 통한 실행
this.em.createQuery(update).executeUpdate();
Query DSL
JPQL 의 문제를 보완한 오픈소스
# 장점
- 컴파일 시점에 오류 발견
- 코드는 JPQL 과 유사
- 동적 쿼리
# 단점
- 쿼리가 문자열이기 때문에 문법 오류를 발견할 수 없음
select m from Review m where cnt > 10
JPAQueryFactory query = new JPAQueryFactory(em);
QReview m = QReview.review;
List<Review> list =
query.selectFrom(m)
.where(m.cnt.gt(10))
.orderBy(m.cnt.desc())
.fetch();
JPA 에서 성능 최적화에 대한 고민
- 느린 쿼리 개선
- 최적화되지 않은 쿼리로 인한 느려짐을 방지
- Fetch 타입의 정확한 선택
- 매핑 관계에 있어서 잘못된 FetchType 을 선택하게 되면 수행되는 쿼리 수가 늘어남
- 기본적으로 DB 튜닝에 있어서 쿼리의 숫자를 줄이는 방식이랑 동일한 개념
- JOIN 대신 FETCH JOIN 사용
- 조인은 두 가지 테이블을 읽기 때문에 성능상으로 느려짐을 경험
- 따라서 특정한 영역 데이터를 먼저 가져와서 조인하는 방식이 유리
- 데이터베이스가 어려운 일 작업하게 하기
- 간혹 서비스를 구현함에 로직 및 구현 부분에서 데이터를 가져와서 처리하는 경우가 있음
- 데이터베이스가 할 수 있는 영역들은 데이터베이스의 쿼리를 활용해서 처리를 하는 것이 더 빠름
- 최대 절전 모드 활용
- 하이퍼네이트 세션의 1단계 세션 캐시 활용 (기본적으로 모든 엔티티는 캐시됨)
- 2단계 캐시의 경우 공유 캐시 모드를 설정해야 활용 가능 (orm.hibernate, annotations.Cache 주석을 사용하여 활성화)
'IT 기술 > [JAVA] Spring Boot' 카테고리의 다른 글
14-1. Flyway 사용해보기 - Gradle Usage (0) | 2021.05.25 |
---|---|
13. DDL-AUTO 와 Flyway (0) | 2021.05.22 |
11. JPA (Java Persistence API) (0) | 2021.05.17 |
10. JPA 를 사용한 페이징(Paging) 처리 (0) | 2021.05.11 |
8-3. 프로젝트에서 JPA 직접 사용해보기 (0) | 2021.05.11 |
Comments