실전 예제 - 5.연관관계 관리
2022. 7. 5. 22:08
JPA
1. 글로벌 페치 전략 설정 • 모든 연관관계를 지연 로딩으로 • @ManyToOne, @OneToOne은 기본이 즉시 로딩이므로 지연로딩으로 변경 2. 영속성 전이 설정 • Order -> Delivery를 영속성 전이 ALL 설정 • Order -> OrderItem을 영속성 전이 ALL 설정 출처 : 김영한, 자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 전이: CASCADE
2022. 7. 5. 13:28
JPA
1. 영속성 전이: CASCADE • 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들도 싶을 때 • 예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장. 2. 영속성 전이: 저장 2. 영속성 전이: CASCADE - 주의! • 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음 • 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐 3. CASCADE - 종류 • ALL: 모두 적용 • PERSIST: 영속 • REMOVE: 삭제 • MERGE: 병합 • REFRESH: REFRESH • DETACH: DETACH 4. 고아 객체 • 고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제 • orphanRemoval = tru..
즉시 로딩과 지연 로딩
2022. 7. 5. 00:39
JPA
1. 지연 로딩 LAZY을 사용해서 프록시로 조회 2. 지연 로딩 3. 즉시 로딩 EAGER를 사용해서 함께 조회 4. 즉시 로딩 5. 프록시와 즉시로딩 주의 • 가급적 지연 로딩만 사용(특히 실무에서) • 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생 • 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다. • @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정 • @OneToMany, @ManyToMany는 기본이 지연 로딩 6. 지연 로딩 활용 • Member와 Team은 자주 함께 사용 -> 즉시 로딩 • Member와 Order는 가끔 사용 -> 지연 로딩 • Order와 Product는 자주 함께 사용 -> 즉시 로딩 7. 지연 로딩 활용 - 실무 • 모든 연관관계..
프록시
2022. 7. 4. 21:52
JPA
1. Member를 조회할 때 Team도 함께 조회해야 할까? 2. 프록시 기초 em.find() vs em.getReference() • em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 • em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 findMember.getId() = 1 Hibernate: select member0_.MEMBER_ID as MEMBER_I1_1_0_, member0_.createdBy as createdB2_1_0_, member0_.createdDate as createdD3_1_0_, member0_.lastModifiedBy as lastModi4_1_0_, member0_.lastModifiedDate as l..
실전 예제 - 4. 상속관계 매핑
2022. 7. 4. 14:52
JPA
1. 요구사항 추가 • 상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장될 수 있다. • 모든 데이터는 등록일과 수정일이 필수다. 도메인 모델 테이블 설계 출처 : 김영한, 자바 ORM 표준 JPA 프로그래밍 - 기본편
@MappedSuperclass
2022. 7. 4. 14:21
JPA
1. @MappedSuperclass 1) 공통 매핑 정보가 필요할 때 사용(id, name) • 상속관계 매핑X • 엔티티X, 테이블과 매핑X • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공 • 조회, 검색 불가(em.find(BaseEntity) 불가) • 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장 • 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑정보를 모으는 역할 • 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용 • 참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능 출처 : 김영한, 자바 ORM 표준 JPA 프로그래밍 - 기본편
상속관계 매핑
2022. 7. 3. 22:01
JPA
1. 상속관계 매핑 • 관계형 데이터베이스는 상속 관계X • 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 • 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입관계를 매핑 1) 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 • 각각 테이블로 변환 -> 조인 전략 • 통합 테이블로 변환 -> 단일 테이블 전략 • 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 2. 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED: 조인 전략 SINGLE_TABLE: 단일 테이블 전략 TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 • @DiscriminatorColumn(name=“DTYPE”) • @Di..
실전 예제 - 3. 다양한 연관관계 매핑
2022. 7. 3. 19:40
JPA
1. 배송, 카테고리 추가 - 엔티티 • 주문과 배송은 1:1(@OneToOne) • 상품과 카테고리는 N:M(@ManyToMany) 2. 배송, 카테고리 추가 - ERD 3. 배송, 카테고리 추가 - 엔티티 상세 N:M 관계는 1:N, N:1로 • 테이블의 N:M 관계는 중간 테이블을 이용해서 1:N, N:1 • 실전에서는 중간 테이블이 단순하지 않다. • @ManyToMany는 제약: 필드 추가X, 엔티티 테이블 불일치 • 실전에서는 @ManyToMany 사용X 출처 : 김영한, 자바 ORM 표준 JPA 프로그래밍 - 기본편
다대다
2022. 7. 3. 19:20
JPA
1. 다대다 • 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를표현할 수 없음 • 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야함 1) 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계 가능 • @ManyToMany 사용 • @JoinTable로 연결 테이블 지정 • 다대다 매핑: 단방향, 양방향 가능 2) 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계 가능 • 편리해 보이지만 실무에서 사용X • 연결 테이블이 단순히 연결만 하고 끝나지 않음 • 주문시간, 수량 같은 데이터가 들어올 수 있음 3) 다대다 한계 극복 • 연결 테이블용 엔티티 추가(연결 테이블을 엔티티로 승격) • @ManyToMany -> @OneToMany, @ManyToOne 출처 : 김영한, 자바 ORM 표준 ..
일대일 관계
2022. 7. 3. 18:03
JPA
1. 일대일 관계는 그 반대도 일대일 2. 주 테이블이나 대상 테이블 중에 외래 키 선택 가능 • 주 테이블에 외래 키 • 대상 테이블에 외래 키 3. 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가 1. 일대일: 주 테이블에 외래 키 단방향 • 다대일(@ManyToOne) 단방향 매핑과 유사 2. 일대일: 주 테이블에 외래 키 양방향 • 다대일 양방향 매핑 처럼 외래 키가 있는 곳이 연관관계의 주인 • 반대편은 mappedBy 적용 3. 대상 테이블에 외래 키 단방향 • 단방향 관계는 JPA 지원X • 양방향 관계는 지원 4. 일대일: 대상 테이블에 외래 키 양방향 • 사실 일대일 주 테이블에 외래 키 양방향과 매핑 방법은 같음 5. 일대일 정리 1) 주 테이블에 외래 키 • 주 객체가 대상 객체..
연관관계 매핑 시작
2022. 7. 3. 01:15
JPA
양방향 매핑시 가장 많이 하는 실수
2022. 7. 1. 23:45
JPA
1. 연관관계의 주인에 값을 입력하지 않음 2. 양방향 매핑시 연관관계의 주인에 값을 입력해야 한다. (순수한 객체 관계를 고려하면 항상 양쪽다 값을 입력해야 한다.) 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자 연관관계 편의 메소드를 생성하자 양방향 매핑시에 무한 루프를 조심하자 예: toString(), lombok, JSON 생성 라이브러리 1) 2) 3. 양방향 매핑 정리 단방향 매핑만으로도 이미 연관관계 매핑은 완료 양방향 매핑은 반대 방향으로 조회(객체 그래프 탐색) 기능이 추가된 것 뿐 JPQL에서 역방향으로 탐색할 일이 많음 단방향 매핑을 잘 하고 양방향은 필요할 때 추가해도 됨(테이블에 영향을 주지 않음) 4. 연관관계의 주인을 정하는 기준 비즈니스 로직을 기준으로 연관관계의 주..
양방향 연관관계와 연관관계의 주인
2022. 7. 1. 22:49
JPA
1. 양방향 매핑 2. 양방향 매핑 • mappedBy = JPA의 멘탈붕괴 난이도 • mappedBy는 처음에는 이해하기 어렵다. • 객체와 테이블간에 연관관계를 맺는 차이를 이해해야 한다. 1) 객체와 테이블이 관계를 맺는 차이 • 객체 연관관계 = 2개 회원 -> 팀 연관관계 1개(단방향) 팀 -> 회원 연관관계 1개(단방향) • 테이블 연관관계 = 1개 회원 팀의 연관관계 1개(양방향) • 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단 뱡향 관계 2개다. • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어 야 한다. • A -> B (a.getB()) • B -> A (b.getA()) class A { B b; } class B { A a; } 2) 테이블의 양방향 연..
단방향 연관관계
2022. 7. 1. 14:40
JPA
1. 연관관계 매핑 기초 • 객체와 테이블 연관관계의 차이를 이해 • 객체의 참조와 테이블의 외래 키를 매핑 • 용어 이해 • 방향(Direction): 단방향, 양방향 • 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해 • 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인 이 필요 2. 객체를 테이블에 맞추어 모델링(연관관계가 없는 객체) 1) 객체를 테이블에 맞추어 모델링(참조 대신에 외래 키를 그대로 사용)(외래 키 식별자를 직접 다룸) @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(nam..
요구사항 분석과 기본 매핑
2022. 7. 1. 02:32
JPA
1. 요구사항 분석 • 회원은 상품을 주문할 수 있다. • 주문 시 여러 종류의 상품을 선택할 수 있다. 2. 도메인 모델 분석 • 회원과 주문의 관계: 회원은 여러 번 주문할 수 있다. (일대다) • 주문과 상품의 관계: 주문할 때 여러 상품을 선택할 수 있다. 반대로 같은 상품도 여러 번 주문될 수 있다. 주문상품 이라는 모델을 만들어서 다대다 관계를 일다대, 다대일 관계로 풀어냄 3. 테이블 설계 4. 엔티티 설계와 매핑 @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; private String city; private String stree..
기본키 매핑
2022. 6. 30. 21:53
JPA
1. 기본 키 매핑 어노테이션 • @Id • @GeneratedValue @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; 2. 기본 키 매핑 방법 • 직접 할당: @Id만 사용 • 자동 생성(@GeneratedValue) • IDENTITY: 데이터베이스에 위임, MYSQL • SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE • @SequenceGenerator 필요 • TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용 • @TableGenerator 필요 • AUTO: 방언에 따라 자동 지정, 기본값 3. IDENTITY 전략 - 특징 • 기본 키 생성을 데이터베이스에 위임 • 주로 MySQL, Post..