본문 바로가기

JPQL18

7. 오류 해결 스토리 - constraint ["PUBLIC.UK_MBMCQELTY0"] 0. 문제 설명 a) 오류 소개 - Entity에 새로운 속성을 부여하기 위해서 코드 수정을 진행하고 있었다. - 새로운 속성을 이용한 쿼리를 테스트하는 과정에서 다음 오류가 발생했다. org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["PUBLIC.UK_MBMCQELTY0FBRVXP1Q58DN57T_INDEX_8 ON PUBLIC.MEMBER(EMAIL) VALUES 5"; SQL statement: insert into member (email, member_name, password, sign_up_date, visibility, member_id) val.. 2022. 7. 30.
6. 오류 해결 스토리 - Update/delete queries cannot be typed 0. 문제 설명 a) JPQL을 이용한 Update 쿼리 작성 - 회원 정보를 수정하기 위해서 다음과 같은 쿼리문을 작성했다. public int updateById(Long id, String name, String email, String password) { return em.createQuery("update Member as m " + "set m.name = :name, m.email = :email, m.password = :password where m.id = :id", Member.class) .setParameter("id", id) .setParameter("name", name) .setParameter("email", email) .setParameter("password", p.. 2022. 7. 30.
5. 오류 해결 스토리 - Join Table 접근과 영속 상태 0. 개요 - 프로젝트 사이의 백엔드를 개발하면서 겪은 다양한 문제의 발생 과정과 해결책을 찾아가는 사고 과정을 기록합니다. 1. 문제 설명 a) Entity 관계 - 프로젝트 사이는 3개의 Entity(Member, Event, Friend)로 구성된다. - Event와 Friend는 모두 Member_id를 외래 키로 사용한다. - 즉, Member를 기준으로 Event와 Friend 객체가 DB에 등록된다. - Event는 다수의 Friend 객체를 보유할 수 있고, Friend는 다수의 Event에 소속될 수 있다. - Event와 Friend는 ManyToMany의 관계를 가지며, 이는 Join Table 전략으로 관리한다. @Entity @Getter public class Event { @I.. 2022. 7. 27.
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.
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.