본문 바로가기

Back-end/JPA 개념48

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.
35. JPQL - 벌크 연산 0. 개요 - 이번 포스팅에서는 벌크 연산에 대해서 알아보자. 1. 벌크 연산 a) 벌크 연산을 사용하는 이유 - 100개의 물건을 관리하는 Item 객체 있다고 해보자. - 물가 상승으로 인하여 모든 물건의 가격을 10% 인상하려고 한다면 어떻게 해야 할까? - 지금까지 배운 방식으로 생각하면, 반복문을 통해 Item 객체를 탐색하면서 각 데이터를 가져온다. - 그리고 JPA의 변경 감지 기능(= dirty checking)을 사용하여 객체의 값을 변경한다. - 그러나 이 방식에는 한 가지 문제가 존재한다. - 100개의 물건 가격을 수정하기 위해서 100개의 update 쿼리가 발행된다는 것이다. - 만약 100만 개의 물건 가격을 수정한다면 100만 개의 update 쿼리가 발행된다. - 이러한 경.. 2022. 5. 8.
34. JPQL - 다형성 쿼리, Entity 직접 사용, Named 쿼리 0. 개요 - 이번 포스팅에서는 유용한 JPA의 기능 몇 가지를 알아보도록 하자. 1. 다형성 쿼리 a) 다형성 쿼리란? - 다형성 쿼리는 상속 관계에서 사용할 수 있는 기능이다. - 부모 객체를 통해 특정 자식 객체를 조회할 때 사용하는 기능이다. b) 다형성 쿼리 사용 방법 - 예를 들어, Food라는 부모 객체가 있고 하위에 Beverage, Snack이 있다고 해보자. - Food 객체를 통해 Snack 객체를 조회하고 싶은 경우, 다음과 같은 JPQL을 작성할 수 있다. SELECT f FROM Food f WHERE TYPE(f) IN(Snack); - 위의 JPQL은 다음과 같은 SQL로 번역되어 DB에게 전달된다. SELECT f FROM Food f WHERE f.DTYPE IN ('Sn.. 2022. 5. 7.
33. JPQL - Fetch Join의 한계 0. 개요 - 이번 포스팅에서는 Fetch Join의 한계에 대해서 알아보자. 1. Fetch Join의 한계 - Fetch Join 사용 시, 하지 못하는 것 또는 하면 안 되는 것에 대해서 알아보자. a) 별칭, Where 절 사용 금지 - Fetch Join을 사용할 때에는 별칭과 Where 절을 사용하지 않는 것을 권장한다. - 첫 번째 이유는 Fetch Join의 역할 또는 정의를 위배하기 때문이다. - Fetch Join은 연관된 Entity를 모두 조회한다는 정의를 가지고 있다. - 그러나 Where 절을 통한 필터링은 Fetch Join의 결과 값에 변화를 주게 된다. - 즉, 연관된 Entity를 모두 조회한다는 역할이 필터링을 사용함으로써 변질되는 것이다. - 두 번째 이유는 데이터 무.. 2022. 5. 6.
32. JPQL - Collection Fetch Join과 Distinct * 본 포스팅은 이전 포스팅과 이어지는 내용입니다. 0. 개요 - 이전 포스팅에서 사용한 Player와 Team Entity를 동일하게 사용할 예정이다. - 이전 포스팅에서 Fetch Join의 기본 개념과 ManyToOne 관계에서의 Fetch Join을 알아보았다. - 이번 포스팅에서는 ManyToMany 관계 또는 Collection 필드의 Fetch Join을 알아보자. 1. Collection Fetch Join - ManyToMany 관계 또는 Collection 필드를 JOIN 할 때에는 중복 데이터가 발생한다. - 사실 DB의 관점에서는 중복 데이터는 존재하지 않는다. - 그러나 JPA의 관점에서는 중복 객체가 발생한다. - 어떤 문제가 있는지, 문제의 원인과 해결 방법이 무엇인지 알아보자.. 2022. 5. 5.
31. JPQL - Fetch Join 개념 0. 개요 - 이번 포스팅은 JPQL의 주요 기능 중 하나인 Fetch Join에 대해서 알아보자. - Fetch Join을 설명하기 위해 다음 Entity를 예시로 사용할 예정이다. @Entity public class Player { @Id @GeneratedValue private Long id; private String name; private String position; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; // Getter & Setter 생략 } @Entity public class Team { @Id @GeneratedValue private L.. 2022. 5. 4.
30. JPQL - 경로 표현식과 묵시적 JOIN 0. 개요 - 이번 포스팅에서는 경로 표현식과 묵시적 JOIN에 대해서 알아보자. - 설명을 위해 다음 객체를 사용할 예정이다. @Entity public class Player { @Id @GeneratedValue private Long id; private String name; private String position; private int age; @Embedded private Address address; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; // Getter & Setter 생략 } @Entity public class Team { @Id @GeneratedValue priva.. 2022. 5. 3.