본문 바로가기

Back-end/JPA 개념48

Query DSL이란? 0. 개요 - 이번 포스팅은 Query DSL에 대해서 간략하게 알아볼 예정이다. - JPA를 조금 더 효율적으로 사용하고 싶다면 Query DSL에 대해서 알아보자. http://querydsl.com/ 2022. 6. 8.
Spring Data JPA란? 0. 개요 - 이번 포스팅은 Spring Data JPA에 대해서 간략하게 알아볼 예정이다. - JPA를 조금 더 효율적으로 사용하고 싶다면 Spring Data JPA에 대해서 알아보자. https://spring.io/projects/spring-data-jpa Spring Data JPA Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered ap.. 2022. 6. 7.
OSIV(Open Session In View) 0. 개요 - 지금까지 JPA 기본 개념에 대해서 알아보았다. - 이번 포스팅은 JPA의 마지막 개념인 OSIV에 대해서 알아보자. 1. OSIV(Open Session In View) a) OSIV 란? - Open Session In View란, 하이버네이트 또는 JPA를 지칭하는 이름이다. - JPA는 Open Entity Manager In View이라 불리기도 하는데, 관례상 OSIV로 통일하여 부른다. b) OSIV 사용 설정 - JPA를 사용하면 Spring에서 기본적으로 spring.jpa.open-in-view의 옵션 값을 TRUE로 설정한다. - 이는 OSIV 옵션을 사용한다는 의미로, JPA 프로젝트 빌드 시점에 다음과 같은 warn 로그에서 확인할 수 있다. c) OSIV의 기능 -.. 2022. 6. 7.
API 조회 성능 최적화 - 컬렉션(DTO 직접 조회) 0. 개요 - 이번 포스팅에서는 DTO를 직접 사용하여 컬렉션을 조회하는 방식에 대해서 알아보자. 1. DTO 직접 조회 준비 a) DTO 직접 조회의 의미 - 단일 조회 시 DTO를 직접 사용한 조회 방법과 동일하게 컬렉션도 DTO를 사용하여 직접 조회할 수 있다. - DTO 직접 조회 방식의 핵심은 Entity를 전혀 사용하지 않고 오직 DTO만을 이용하여 데이터를 받아오는 것이다. - 즉, Entity를 조회하고 그 데이터를 이용하여 DTO를 생성 및 반환하는 작업이다. - 언뜻 보면 DTO 변환 방식과 특별한 차이점을 못 느낄 수도 있다. - 그러나 DTO 직접 조회 방식은 API 메서드에서 오직 DTO만을 사용한다는 것이 특징이다. b) 준비 작업 확인 - 우선 DTO 변환을 이용한 조회 메서드.. 2022. 6. 4.
API 조회 성능 최적화 - 컬렉션(Fetch Join + 페이징 + Batch Size) 0. 개요 - 이전 포스팅에서 Fetch Join을 사용하면 페이징을 사용할 수 없다는 것을 배웠다. - 그러나 개발을 하다 보면 Fetch Join과 페이징이 함께 필요한 경우가 발생할 것이다. - 이러한 상황에서 어떻게 페이징을 구현할 수 있는지 알아보자. 1. Fetch Join + 페이징 사용 불가 a) 근본적인 이유 - Fetch Join은 일대다(= OneToMany) 조인에서 사용된다. - 일대다(= OneToMany) Join의 목적은 일(= One)을 기준으로 Join 하는 것이다. - 그러나 DB는 다(= Many)를 기준으로 Join 하므로 결과 데이터가 다(= Many)의 개수만큼 생성된다. - 이처럼 결과 데이터의 증가로 인해, 데이터의 순서가 뒤틀리게 되어 페이징을 사용할 수 없.. 2022. 6. 3.
API 조회 성능 최적화 - 컬렉션(Fetch Join, distinct) 0. 개요 - 이전 포스팅에서 DTO 변환을 이용한 컬렉션 조회 방법을 알아보았다. - DTO 변환 방법을 사용하여 컬렉션 조회 시, 다수의 SQL 문이 발행된다는 문제점을 확인하였다. - 이 문제를 해결하기 위해 Fetch Join을 이용한 컬렉션 조회 방법을 알아보자. 1. DTO 변환 + Fetch Join a) Fetch Join 쿼리 작성 - 우선 Fetch Join을 이용하는 쿼리를 작성해보자. - 쿼리는 다음과 같다. public List findAllWithItem() { return em.createQuery("select o from Order o " + "join fetch o.member " + "join fetch o.delivery " + "join fetch o.orderIte.. 2022. 6. 2.
API 조회 성능 최적화 - 컬렉션(DTO 변환) 0. 개요 - 이전 포스팅까지 Many To One 또는 One To One 관계에 대한 조회 방식을 알아보았다. - To One 관계는 Join 대상이 하나인 관계로, Fetch Join을 이용하여 N + 1 문제를 해결하였다. - To Many의 관계는 Join 대상이 다수인 관계로, 중복 데이터가 발생하는 문제를 가진다. - 이번 포스팅에서 To Many 관계를 조회할 때 발생하는 문제와 해결책에 대해서 알아보자. 1. 컬렉션 조회 시 DTO 변환 방식 a) 예시 코드 - 다음과 같이 DTO를 사용하여 컬렉션 조회를 수행하려고 한다. @RestController @RequiredArgsConstructor public class OrderApiController { private final Orde.. 2022. 6. 1.
API 조회 성능 최적화 - DTO 직접 조회 0. 개요 - 일반적으로 JPA에서 조회를 수행할 때, Entity로부터 조회된 결과를 DTO를 통해 전달한다. - 그러나 이러한 과정을 스킵하고 바로 DTO를 통해 조회할 수 있는 방법은 없을까? - 이번 포스팅에서는 DTO를 통해 직접 조회 방법에 대해 알아보자. 1. DTO를 통한 직접 조회 - 이전 포스팅에서는 Entity의 조회 결과를 DTO에 넘겨서 DTO 객체를 반환하는 방법으로 조회하였다. - DTO를 통한 직접 조회 방법은 조회 결과를 DTO 객체로 직접 반환하는 방법이다. a) DTO 클래스 생성 - 다음과 같이 DTO 클래스를 생성한다. @Data public class SimpleOrderQueryDto { private Long orderId; private String name;.. 2022. 5. 30.
API 조회 성능 최적화 - DTO 변환 방식(Fetch Join) 1. 조회 API에서 DTO를 사용하는 이유 - 이전 포스팅에서 Entity를 직접 사용한 조회 API를 구성하는 방법에 대해 알아보았다. - Entity를 직접 노출하는 방식은 Entity의 내용이 변경됐을 때, API 스펙에 직접적인 영향을 미치기 때문이다. - 그러므로 Entity 대신 DTO를 사용하여 이를 해결한다. 2. DTO를 이용한 조회 API 구성 방법 - API에서 DTO를 구성하는 방식은 매우 간단하다. - 기존에 Entity가 직접 사용된 부분을 DTO로 교체하면 된다. - 다음 코드를 살펴보자. @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepos.. 2022. 5. 30.