JPA 15

JPQL - Criteria 기초 (조회, 집합, 정렬)

Criteria 쿼리는 JPQL을 자바 코드로 작성하도록 도와주는 빌더 클래스 API이다. Criteria를 사용하면 문자가 아닌 코드로 JPQL을 작성하므로 문법 오류를 컴파일 단계에서 잡을 수 있고 문자 기반의 JPQL보다 동적 쿼리를 안전하게 생성할 수 있는 장점이 있다.   Criteria 기초Criteria API는 javax.persistence.criteria 패키지에 있다. 아래는 단순한 Criteria 쿼리이다.//JPQL: select m from Member mCriteriaBuilder cb = em.getCriteriaBuilder(); // 1. Criteria 쿼리 빌더// 2. Criteria 생성, 반환 타입 지정CriteriaQuery cq = cb.createQuery(..

JPA 2024.05.28

JPQL - Named 쿼리 - 정적 쿼리

JPQL 쿼리는 크게 정적 쿼리와 동적 쿼리로 나눌 수 있다.- 동적 쿼리: em.createQuery(“select…”) 처럼 jpql을 문자로 완성해서 직접 넘기는 것. 런타임에 특정 조건에 따라 jpql을 동적으로 구성할 수 있다.- 정적 쿼리: 미리 정의한 쿼리에 이름을 부여해서 필요할 때 사용할 수 있는데 이것을 Named 쿼리라 한다. Named 쿼리는 한 번 정의하면 변경할 수 없는 정적인 쿼리다.Named 쿼리는 애플리케이션 로딩 시점에 JPQL 문법을 체크하고 미리 파싱해둔다. 따라서 오류를 빨리 확인할 수 있고, 사용하는 시점에는 파싱된 결과를 재사용하므로 성능상 이점도 있다. 그리고 Named 쿼리는 변하지 않는 정적 SQL이 생성되므로 데이터베이스의 조회 성능 최적화에도 도움이 된다..

JPA 2024.05.14

JPQL - 서브 쿼리

JPQL도 SQL 처럼 서브 쿼리를 지원한다. 여기에는 몇가지 제약이 있는데, 서브쿼리를 WHERE, HAVING 절에서만 사용할 수 있고, SELECT, FROM 절에서는 사용할 수 없다. 다음은 나이가 평균보다 많은 회원을 찾는다. select m from Member m where m.age > (select avg(m2.age) from Member m2) 다음은 한 건이라도 주문한 고객을 찾는다. select m from Member m where (select count(o) from Order o where m = o.member) > 0 # 참고로 이 쿼리는 다음처럼 컬렉션 값 연관 필드의 size 기능을 사용해도 같은 결과를 얻을 수 있다. select m from Member m whe..

JPA 2023.10.23

JPQL - 경로 표현식

경로 표현식이라는 것은 .(점)을 찍어 객체 그래프를 탐색하는 것이다. select m.username from Member m join m.team t join m.orders o where t.name = '팀A' 위의 JPQL에서 m.username, m.team, m.orders, t.name이 모두 경로 표현식을 사용한 예다. 경로 표현식의 용어 정리 상태 필드: 단순히 값을 저장하기 위한 필드(필드 or 프로퍼티) 연관 필드: 연관관계를 위한 필드, 임베디드 타입 포함(필드 or 프로퍼티) - 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 - 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 @Entity public class M..

JPA 2023.10.23

프록시

객체는 객체 그래프로 연관된 객체들을 탐색한다. 그런데 객체가 데이터베이스에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기는 어렵다. JPA 구현체들은 이 문제를 해결하려고 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 하지만 자주 함께 사용하는 객체들은 조인을 사용해서 함께 조회하는것이 효과적이다. JPA는 즉시 로딩과 지연 로딩이라는 방법으로 둘을 모두 지원한다. 프록시 엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다. 예를 들어 회원 엔티티를 조회할 때 연관된 팀 엔티티는 비즈니스 로직에 따라 사용될 때도 있지만 그렇지 않을 때도 있다. //회원 엔티티 @Entit..

JPA 2023.07.28

조인 테이블

데이터베이스 테이블의 연관관계를 설계하는 방법은 크게 2가지다. 1. 조인 컬럼 사용(외래 키) 2. 조인 테이블 사용(테이블 사용) ▼ 조인 컬럼 사용 테이블 간에 관계는 주로 조인 컬럼이라 부르는 외래 키 컬럼을 사용해서 관리한다. 외래키에 null을 허용하는 관계를 선택적 비식별관계라한다. 회원과 사물함을 조인할 때 외부조인(OUTER JOIN)을 사용해야한다. 실수로 내부 조인을 사용하면 사물함과 관계가 없는 회원은 조회되지 않는다. 그리고 회원과 사물함이 아주 가끔 관계를 맺는다면 외래 키 값 대부분이 null로 저장되는 단점이 있다. ▼ 조인 테이블 사용 조인 테이블이라는 별도의 테이블을 사용해서 연관관계를 관리한다. 조인 컬럼을 사용하는 방법은 단순히 외래키 컬럼만 추가해서 연관관계를 맺지만..

JPA 2023.06.13

상속 관계 매핑

관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이라는 개념이 없다. 대신에 슈퍼타입(Super-type)과 서브타입(Sub-type) 관계라는 모델링 기법이 객체의 상속 개념과 가장 유사하다. ORM에서 말하는 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다. 여기서 저 중간에 엑스표는 Exclusive(상호배제관계)를 의미하고, 하나의 슈퍼타입 엔티티가 여러개의 서브타입 엔티티를 가질 수 없다는 것을 의미한다. 반대로 엑스표가 없으면 Inclusive(상호보완관계)를 의미하고, 하나의 슈퍼타입 엔티티가 여러개의 서브타입 엔티티를 가질 수 있다는 것을 의미한다. 슈퍼타입, 서브타입 논리모델을 실제 물리모델인 테이블로 구현할 때는 3가지 방법을 선택할 수 ..

JPA 2023.05.11

다양한 연관관계 매핑 (2)

일대일 [1:1] 일대일 관계는 양쪽이 서로 하나의 관계만 가진다. 예를 들어 회원은 하나의 사물함만 사용하고 사물함도 하나의 회원에 의해서만 사용된다. ​ 일대일 관계는 다음과 같은 특징이 있다. 일대일 관계는 그 반대도 일대일 관계이다. 테이블 관계에서 일대다, 대대일은 항상 다(N)쪽이 외래 키를 가진다. 반면에 일대일 관계는 주 테이블이나 대상 테이블 둘 중 어느 곳이나 외래 키를 가질 수 있다. 테이블은 주 테이블이든 대상 테이블이든 외래 키 하나만 있으면 양쪽으로 조회할 수 있다. 따라서 일대일 관계는 주 테이블이나 대상 테이블 중에 누가 외래 키를 가질지 선택해야 한다. ​ ▼ 주 테이블에 외래 키 주 테이블에 외래 키를 두고 대상 테이블을 참조한다. 외래 키를 객체 참조와 비슷하게 사용할 ..

JPA 2023.04.27

다양한 연관관계 매핑 (1)

다대일 다대일 관계의 반대 방향은 항상 일대다 관계고 일대다 관계의 반대방향은 항상 다대일 관계다. 데이터베이스 관계에서 외래키는 항상 다 쪽에 있고, 다쪽이 연관관계의 주인이다. ​ 1. 다대일 단방향 [N:1] @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; ///Getter, Setter... } @Entity public class Team { @Id @GenerateValue @Column(name = "TEAM_ID") pr..

JPA 2023.04.27

연관관계 매핑 기초

단방향 연관관계 연관관계 중에선 다대일(N:1) 단방향 관계를 가장 먼저 이해해야 한다. 회원과 팀의 관계를 통해 다대일 단방향 관계를 알아보자. · 회원과 팀이 있다. · 회원은 하나의 팀에만 소속될 수 있다. · 회원과 팀은 다대일 관계다. ​ ▼ 객체 연관관계 회원 객체는 Member.team 필드(멤버변수)로 팀 객체와 연관관계를 맺는다. 회원 객체와 팀 객체는 단방향 관계다. 회원은 Member.team 필드를 통해서 팀을 알 수 있지만 반대로 팀은 회원을 알 수 없다. ​ ▼ 테이블 연관관계 회원 테이블은 TEAM_ID 외래 키로 팀 테이블과 연관관계를 맺는다. 회원 테이블과 팀 테이블은 양방향 관계다. 회원 테이블의 TEAM_ID 외래 키를 통해서 회원과 팀을 조인할 수 있고 반대로 팀과 회..

JPA 2023.04.27