본문 바로가기

Back-end109

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.
29. JPQL - 사용자 정의 함수 0. 개요 - SQL에서 함수를 사용하듯, JPQL에서도 다양한 함수를 사용할 수 있다. - JPA를 사용하기 때문에 DB에 종속되지 않고 JPQL에서 제공하는 다양한 함수를 사용할 수 있다. - 기본 함수만을 가지고 해결하지 못하는 경우, 특정 DB에서 제공하는 함수를 가져와 사용할 수 있다. - 이때 사용자 정의 함수를 사용한다. - 이번 포스팅에서는 JPQL이 제공하는 기본 함수와 사용자 정의 함수에 대해서 알아보자. 1. 기본 함수 - JPQL에서 제공하는 기본 함수는 다음과 같다. → CONCAT, SUBSTRING, TRIM, LOWER, UPPER → LENGTH, LOCATE, ABS, SQRT, MOD, SIZE, INDEX - JPQL에서 제공하는 기본 함수의 사용 방법에 대해서 간단히.. 2022. 5. 2.
28. JPQL - case 식 0. 개요 - 이번 포스팅에서는 JPQL에서 사용할 수 있는 case 식에 대해서 알아보자. 1. Case 식의 종류 a) 기본 CASE - 예시를 통해 기본 case 식의 형태를 알아보자. SELECT CASE WHEN p.age = 35 THEN '노장' ELSE '현역' END FROM Player p; - 기본 case 식은 비교 대상에 대해서 조건을 부여할 수 있다. - 자바에서 사용하는 switch case 문과 동일한 원리로 작동한다. b) 단순 CASE - 예시를 통해 단순 case 식의 형태를 알아보자. SELECT CASE l.name WHEN 'leagueA' THEN '1부리그' WHEN 'leagueB' THEN '2부리그' ELSE '3부리그' END FROM League l; .. 2022. 4. 28.
27. JPQL - 서브 쿼리 & 타입 표현 0. 개요 - 이번 포스팅에서는 JPQL에서 SubQuery와 타입 표현에 대해 알아보자. 1. 서브 쿼리(SubQuery) a) 개념 - 서브 쿼리란, 쿼리 내부에 또 다른 쿼리를 삽입하는 형태를 말한다. - 간단한 예시를 통해서 서브 쿼리의 형태를 살펴보자. SELECT p FROM Player p WHERE p.age > (SELECT AVG(p2.age) FROM Player p2); - 이처럼 SQL과 동일하게 JPQL에서도 서브 쿼리를 사용할 수 있다. - 중요한 점은 서브 쿼리와 서브 쿼리를 포함하고 있는 쿼리는 쿼리상에서 연관 관계가 전혀 없다는 것이다. - 즉, p와 p2는 함께 사용되지 않고 독립적인 쿼리로 사용된다. - 이렇게 쿼리를 짜는 것이 서브 쿼리의 효율을 가장 잘 뽑아낼 수 .. 2022. 4. 27.