경로 표현식 JPQL에서 .(점)을 찍어 객체 그래프를 탐색하는 것 select m.username // 경로 표현식 사용 from Member m join m.team t // 경로 표현식 사용 join m.orders o // 경로 표현식 사용 where t.name '팀A' // 경로 표현식 사용 경로 표현식의 용어 정리 상태 필드 : 단순히 값을 저장하기 위한 필드 (필드 or 프로퍼티) 연관 필드 : 객체 사이의 연관관계를 위한 필드, 임베디드 타입 포함 (필드 or 프로퍼티) 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션 // 상태 필드, 연관 필드 @Entity public c..
JPQL JPQL의 특징 JPQL은 객체지향 쿼리 언어이므로 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리 JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않음 JPQL은 결국 SQL로 변환됨 샘플 도메인 모델 UML, ERD 1) 회원이 상품을 주문하는 다대다 관계를 일다대, 다대일 관계로 풀어내기 위해 연결 엔티티인 ORDER 사용 2) Address는 임베디드 타입이므로 UML에 스테레오 타입을 사용해 로 정의하고 ERD에는 ORDERS 테이블에 포함 기본 문법과 쿼리 API JPQL도 SQL과 비슷하게 SELECT, UPDATE, DELETE 문을 사용할 수 있으며 엔티티를 저장할 때는 EntityManager.persist() 메소드를 사용하면 되므로 IN..
객체지향 쿼리 언어 JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술인 JPQL, Criteria, QueryDSL 등을 지원 Criteria나 QueryDSL은 결국 JPQL을 편리하게 사용하도록 도와주는 기술 객체지향 쿼리 소개 가장 단순한 검색 방법으로는 식별자로 조회와 객체 그래프 탐색이 존재하며 식별자로 엔티티 하나를 조회한 후, 조회한 엔티티에 객체 그래프 탐색을 사용하면 연관된 엔티티들을 찾을 수 있음 식별자로 조회 : EntityManager.find() 객체 그래프 탐색 : a.getB().getC() 하지만 위의 방법만으로는 애플리케이션을 개발하기 힘드므로 좀 더 현실적이고 복잡한 검색 방법인 JPQL이 필요 SQL이 데이터베이스 테이블을 대상으로 하..
값 타입 매핑 이전까지의 Member, Delivery에는 주소 정보가 단지 나열되어 있음 // 값 타입 적용 전 public class Member { ... private String city; private String street; private String zipcode; ... } public class Delivery { ... private String city; private String street; private String zipcode; ... } Address 라는 값 타입을 만들어서 나열된 주소 대신에 사용하도록 Member와 Delivery 엔티티 변경 이제 주소 정보에 필드나 로직이 추가되면 Address 값 타입만 변경하면 됨 // 값 타입 주소(Address) packa..
값 타입JPA의 데이터 타입은 엔티티 타입과 값 타입으로 나눌 수 있으며엔티티 타입은 @Entity로 정의하는 객체로 식별자를 통해 지속적으로 추적할 수 있음값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 말하며 식별자가 없고 숫자나 문자같은 속성만 있으므로 추적할 수 없음기본값 타입 : 자바가 제공하는 기본 데이터 타입으로 자바 기본 타입(int, double), 래퍼 클래스(Integer), String이 존재 임베디드 타입 (복합 값 타입) : JPA에서 사용자가 직접 정의한 값 타입 컬렉션 값 타입 : 하나 이상의 값 타입을 저장할 때 사용기본값 타입자바가 제공하는 기본 데이터 타입인 기본값 타입// 기본값 타입@Entitypublic clas..
글로벌 패치 전략 설정 글로벌 패치 전략을 즉시 로딩으로 설정하면 사용하지 않는 엔티티도 함께 조회되므로 모두 지연 로딩으로 설정 @OneToMany, @ManyToMany는 기본으로 지연 로딩이므로 그냥 두고 @OneToOne, @ManyToOne의 fetch 속성을 지연 로딩으로 수정 // 주문 // 주문 엔티티에서 member와 delivery를 지연 로딩으로 설정 @Entity @Table(name = "ORDERS") public class Order extends BaseEntity { @Id @GeneratedValue @Column(name = "ORDER_ID") private Long id; @ManyToOne(fetch = FetchType.LAZY) // 지연 로딩 @JoinColu..
프록시프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회하므로 객체 그래프로 연관된 객체들을 마음껏 탐색 가능하며이러한 방법을 지연 로딩이라고 하며, 지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신 데이터베이스 조회를 지연할 수 있는 가짜 객체인 프록시 객체가 필요// 회원 엔티티@Entitypublic class Member { private String username; @ManyToOne private Team team; public Team getTeam() { retrun team; } public String getUsername() { re..
상속 관계 매핑 요구사항 추가 상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장할 수 있음 모든 데이터는 등록일과 수정일이 있어야 함 ERD 분석 엔티티를 상속 관계로 만들고 공통 속성은 Item 엔티티에 둔 후, Album, Book, Movie 자식 엔티티를 추가 상속 관계를 테이블 하나에 통합하는 단일 테이블 전략을 선택했으므로 ITEM 테이블 하나만 사용하고 DTYPE이라는 컬럼으로 자식 상품을 구분 상속 관계 매핑 item이라는 패키지를 만들어서 상품(Item)과 상품의 자식 클래스(Album, Book, Movie)들을 모아둔 후, 상품 클래스는 직접 사용하지 않으므로 abstract를 추가해서 추상 클래스를 만듦 // 부모 엔티티 상품 (Item) package jpabook.model..