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(..
2024.05.28 -
JPQL - Named 쿼리 - 정적 쿼리
JPQL 쿼리는 크게 정적 쿼리와 동적 쿼리로 나눌 수 있다.- 동적 쿼리: em.createQuery(“select…”) 처럼 jpql을 문자로 완성해서 직접 넘기는 것. 런타임에 특정 조건에 따라 jpql을 동적으로 구성할 수 있다.- 정적 쿼리: 미리 정의한 쿼리에 이름을 부여해서 필요할 때 사용할 수 있는데 이것을 Named 쿼리라 한다. Named 쿼리는 한 번 정의하면 변경할 수 없는 정적인 쿼리다.Named 쿼리는 애플리케이션 로딩 시점에 JPQL 문법을 체크하고 미리 파싱해둔다. 따라서 오류를 빨리 확인할 수 있고, 사용하는 시점에는 파싱된 결과를 재사용하므로 성능상 이점도 있다. 그리고 Named 쿼리는 변하지 않는 정적 SQL이 생성되므로 데이터베이스의 조회 성능 최적화에도 도움이 된다..
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..
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..
2023.10.23 -
프록시
객체는 객체 그래프로 연관된 객체들을 탐색한다. 그런데 객체가 데이터베이스에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기는 어렵다. JPA 구현체들은 이 문제를 해결하려고 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 하지만 자주 함께 사용하는 객체들은 조인을 사용해서 함께 조회하는것이 효과적이다. JPA는 즉시 로딩과 지연 로딩이라는 방법으로 둘을 모두 지원한다. 프록시 엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다. 예를 들어 회원 엔티티를 조회할 때 연관된 팀 엔티티는 비즈니스 로직에 따라 사용될 때도 있지만 그렇지 않을 때도 있다. //회원 엔티티 @Entit..
2023.07.28 -
조인 테이블
데이터베이스 테이블의 연관관계를 설계하는 방법은 크게 2가지다. 1. 조인 컬럼 사용(외래 키) 2. 조인 테이블 사용(테이블 사용) ▼ 조인 컬럼 사용 테이블 간에 관계는 주로 조인 컬럼이라 부르는 외래 키 컬럼을 사용해서 관리한다. 외래키에 null을 허용하는 관계를 선택적 비식별관계라한다. 회원과 사물함을 조인할 때 외부조인(OUTER JOIN)을 사용해야한다. 실수로 내부 조인을 사용하면 사물함과 관계가 없는 회원은 조회되지 않는다. 그리고 회원과 사물함이 아주 가끔 관계를 맺는다면 외래 키 값 대부분이 null로 저장되는 단점이 있다. ▼ 조인 테이블 사용 조인 테이블이라는 별도의 테이블을 사용해서 연관관계를 관리한다. 조인 컬럼을 사용하는 방법은 단순히 외래키 컬럼만 추가해서 연관관계를 맺지만..
2023.06.13