자바 ORM 표준 JPA 프로그래밍 8

객체지향 쿼리 언어2 - 중급 문법

JPQL - 경로 표현식 경로 표현식 .(점)을 찍어 객체 그래프를 탐색하는 것 select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' 경로 표현식 용어 정리 상태 필드(state field) : 단순히 값을 저장하기 위한 필드 ( ex : m.username ) 연관 필드(association field) : 연관관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 (ex : m.team) 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션(ex : m.orders) 경로..

Spring/JPA 2023.03.05

실전 예제

실전 예제 1. 요구사항 분석과 기본 매핑 요구사항 분석 회원은 상품을 주문할 수 있다. 주문 시 여러 종류의 상품을 선택할 수 있다. 기능 목록 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 상품 주문 주문내역조회 주문취소 도메인 모델 분석 회원과 주문의 관계 : 회원은 여러 번 주문할 수 있다. (일대다) 주문과 상품의 관계 : 주문할 때 여러 상품을 선택할 수 있다. 반대로 같은 상품도 여러 번 주문될 수 있다. 주문상품이라는 모델을 만들어서 다대다 관계를 일대다, 다대일 관계로 풀어냄 테이블 설계 엔티티 설계와 매핑 데이터 중심 설계의 문제점 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식 테이블의 외래키를 객체에 그대로 가져옴 객체 그래프 탐색이 불가능 ..

Spring/JPA 2023.02.19

JPA 애플리케이션 개발

JPA가 어떻게 동작하는데? JPA는 Persistence라는 클래스가 있는데 여기서 persistence.xml 설정 정보를 읽어서 EntityManagerFactory를 만듬. 여기서 필요할 때마다 EntityManager를 찍어냄. JpaMain 클래스를 만듬 JPA가 어떻게 동작하는지 살펴봄. 객체와 테이블 생성하고 매핑하기 Member.java @Entity public class Member { @Id private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public..

Spring/JPA 2023.02.18

JPA 프로젝트 생성

라이브러리를 넣는 것이 중요! pom.xml 사이에 어떤 라이브러리를 넣을지 정함. org.hibernate hibernate-entitymanager 5.3.10.Final com.h2database h2 1.4.199 실무에서 라이브러리 버전을 선택할 경우 JPA를 사용할 경우 스프링과 함께 사용하는 경우가 많기 때문에 스프링과 잘 연동되는 버전을 선택하는 것이 바람직하다. 또한 버전은 실제 설치하는 버전과 일치시키는 것이 좋다. JPA 설정 JPA를 사용하기 위해서는 몇 가지 설정 파일을 넣어줘야 한다. 1) JPA 설정 파일 - 위치 : src/main/resources/META-INF/persistence.xml JPA는 특정 단어에 종속적이지 않도록 설계됨. 그래서 단어에 맞는 설정을 해줘야함..

Spring/JPA 2023.02.18

프록시와 연관관계 관리 - 즉시 로딩과 지연 로딩

Member를 조회할 때 Team도 함께 조회해야 할까? 단순히 member 정보만 사용하는 비지니스 로직이라면 Team을 JOIN해서 조회하는 것은 손해다. 그래서 JPA는 지연로딩이라는 기능을 제공한다. @ManyToOne(fetch = FetchType.LAZY) @JoinColumn private Team team; 이렇게 @ManyToOne에 fetch = FetchType.LAZY를 추가하면 프록시 객체로 가져옵니다. println(member.getName()); 지연 로딩 LAZY을 사용해서 프록시로 조회 Member와 Team을 자주 함께 사용한다면 즉시 로딩 EAGER를 사용해서 함께 조회 @Entity public class Member { @Id @GeneratedValue priv..

Spring/JPA 2023.02.10

프록시와 연관관계 관리 - 프록시

목차 프록시 즉시 로딩과 지연 로딩 지연 로딩 활용 영속성 전이 : CASCADE 고아 객체 영속성 전이 + 고아 객체, 생명주기 실전 예제 - 5. 연관관계 관리 프록시 Member를 조회할 때 Team을 함께 조회해야 할까? 1) Member와 Member가 속한 Team을 출력하는 로직에서는 Member를 persist할 경우 Team과 함께 db query를 보내는 것이 좋다. 2) Member만 출력하는 로직은 Member를 persist할 경우 Team과 함께 db query를 보내는 것은 손해다. JPA는 지연 로딩과 프록시를 통해 이 문제점을 해결한다. 이 해결 방식을 이해하기 위해서는 프록시를 명확하게 알고 있어야 한다. 프록시 기초 JPA에서는 em.getReference()라는 흥미로..

Spring/JPA 2023.02.09

고급 매핑 - Mapped Superclass - 매핑 정보 상속

@MappedSuperclass 모든 객체에 공통된 속성을 추가해야 한다고 했을 경우 공통된 속성을 상속으로 받아서 사용할 수 있도록 만들어 준다. 상속관계 매핑과 다르다. 상속관계 매핑은 공통된 속성을 부모 객체에 포함시키는 것이다. 코드 공통된 속성을 넣는 엔티티 생성 package hellojpa; import javax.persistence.MappedSuperclass; import java.time.LocalDateTime; @MappedSuperclass public class BaseEntity { private String createBy; private LocalDateTime createdDate; private String lastModifiedBy; private LocalDate..

Spring/JPA 2023.02.09

고급 매핑 - 상속관계 매핑

목차 상속관계 매핑 객체의 상속관계를 테이블에 어떻게 매핑하는지 알아본다. @MappedSuperclass 속성만 상속하는 것이다. 실전 예제 - 4. 상속관계 매핑 이러한 상속관계 매핑을 어떻게 사용하는지 알아본다. 상속관계 매핑 관계형 데이터베이스는 상속 관계 X 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법DB입장에서 3가지 방법으로 구현할 수 있다. 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 조인 전략 데이터를 가져올 때 JOIN으로 가져오는 것, 총 2번의 ..

Spring/JPA 2023.02.08