본문 바로가기

Back-end109

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.
API 조회 성능 최적화 - Entity 직접 노출 방식 - 이번 포스팅부터 단일 객체를 조회하는 API 성능을 최적화 하는 방식에 대해서 알아 볼 예정이다. - 여기서 단일 객체란 Many To One 또는 One To One 관계를 가지는 객체를 의미한다. - 단일 객체를 조회하는 방식에는 Entity 직접 노출, DTO 변환, DTO 직접 사용 방식이 있다. - 이에 대해 하나씩 알아보자. 1. Entity 직접 노출 방식의 문제점과 해결방법 - 결론부터 말하면, 이 방식은 사용하지 않는다. - Entity를 직접 노출하는 방식은 Entity의 내용 변동이 있는 경우, API 스펙에도 변경사항이 발생하기 때문이다. - 즉, API 스펙에 영향을 끼치는 구조이므로 사용하지 않는다. - 다만, Entity 직접 노출 방식을 사용하지 않는 이유에 대해서 이해할.. 2022. 5. 28.
JPA를 이용한 API 개발 꿀팁 - Annotation 1. API 컨트롤러를 분리한다. - API를 제작하기 이전에 기본적인 CRUD기능을 다루는 컨트롤러를 생성했을 것이다. - 그리고 API를 제작할 때에는 API 컨트롤러를 저장할 패키지를 따로 만들어 사용한다. 2. @Valid, @NotEmpty a) @Valid - API를 통해서 POST 메서드로 데이터를 DB에 저장하거나 변경할 때에는 @Valid와 @NotEmpty를 사용한다. - @Valid는 javax 라이브러리의 기능으로 유효성을 검사하는 기능을 갖는다. b) @NotEmpty - @NotEmpty는 @Valid에서 검증하는 조건(= constraints) 중 하나다. - @NotEmpty가 부착된 Entity의 필드 값을 required로 처리한다. - 이처럼 반드시 필요한 값이 입력되.. 2022. 5. 27.
JPA 개발 꿀팁 개요 - JPA를 이용해 서비스를 개발할 때 주의해야 하는 부분을 정리해보자. PK 매핑 필드의 컬럼명을 지정하자 - 일반적으로 JPA에서 Entity를 작성할 때 PK 값을 id라는 필드로 매핑한다. - JPA에서는 Entity.id 형식으로 특정 객체의 id 값을 호출할 수 있다. - 그러나 DB의 관점에서는 각 테이블마다 id라는 칼럼이 존재하기 때문에 단순 쿼리문에서 id가 어떤 테이블의 id인지 구분하기 어려울 수 있다. - 그러므로 각 Entity의 id를 생성할 때, 반드시 @Column을 이용하여 "테이블명_id" 형식으로 설정하도록 하자. 연관 관계 설정 a) 항상 다(N) 쪽이 FK를 가진다. - 일대다(1:N) 또는 다대일(N:1) 관계에서는 항상 다 쪽이 FK를 가진다. - 반대에서.. 2022. 5. 25.
Unreachable Statement 오류 0. 개요 - 자바를 사용하다 보면 발생하는 오류 중 하나인 Unreachable Statement에 대해서 알아보자. 1. Unreachable Statement a) 오류의 의미 - Unreachable Statement를 해석해보면, 이는 접근할 수 없는 문장이라는 뜻이다. - 접근할 수 없다는 것이 무슨 의미일까? - 말 그대로 해당 코드를 실행하지 못한다는 뜻이다. b) 오류 메시지 - Unreachable Statement 오류가 발생하면 다음과 같은 오류 메시지가 발생한다. - 해당 메시지를 보면, 어떤 코드에서 Unreachable Statement가 발생했는지 확인할 수 있다. - 이 메시지의 의미는 해당 코드를 실행할 수 없다는 것이다. - 즉, 해당 코드를 포함한 다음 코드들이 아예 .. 2022. 5. 10.
Collections와 Collection에 대하여 0. 개요 - Java를 공부하다 보면 Collections와 Collection을 반드시 만나게 된다. - 이 둘은 독립된 존재이면서 동시에 떨어질 수 없는 관계를 가지는데, 직접 파보기 전까지 이해하기가 힘들다. - 이번 포스팅에서는 Collections와 Collection의 차이점과 관계에 대해서 알아보자. 1. Collection이란? - Collection은 자료구조를 다루기 위한 기본 메서드와 반복자를 제공하는 인터페이스다. a) Collection은 Interface다. - 다음 사진은 Java 8 공식 문서의 collection에 대한 설명이다. - Collection은 Iterable을 상속받은 인터페이스다. - 보통 인터페이스는 공통된 메서드를 상속하기 위한 목적으로 작성된다. - 그.. 2022. 5. 9.