JPA/Base

JPA - 연관관계 매핑 #2

2022. 8. 11. 17:34
728x90
반응형

✍연관관계 매핑시 고려사항

- 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음
- 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데인 구조. 사실, 단방향 2개라고 볼 수 있다.

ㆍ다중성
ㆍ단방향, 양방향
ㆍ연관관계의 주인 

 

❓❗ 다대일 [N:1] @ManyToONe

 

❓❗ 일대다 [1:N] (운영 측면에서 권장하지 않음) @OneToMany

- 기본적으로 DB 설계상 일대다 관계에서 일인 쪽에 FK가 있을 수 없다. 연관관계의 주인도 마찬가지.
  (일 쪽에서 FK를 가지고 있으면 테이블 하나에서 다른 FK 때문에 중복 테이블이 생성되기 때문.)
  => 따라서, 테이블의 일대다 관계는 항상 다(N) 쪽에 외래 키가 있다. 

- JPA 표준 스펙에서는 '일대다 '관계 매핑을 지원.
- 연관관계의 주인으로 '다' 쪽 객체를 저장할 변수에 @JoinColumn(name = "'일' 쪽의 PK")를 매핑.

- 기존 다대일 관계보다, 쿼리가 하나 더 발생. (다(N) 쪽의 FK를 UPDATE 해주어야 하기 때문.) 
   => 반대편 테이블의 외래 키를 관리하는 형태.

일대다 단점

  • 엔티티가 관리하는 외래 키가 다른 테이블에 있음
  • 연관관계 관리를 위해 추가로 UPDATE SQL 실행

💡 다대일 양방향 매핑을 사용하는 것을 권장

 

❓❗ 일대일 [1:1] @OneToOne

- 일대일 관계는 반대도 일대일
- 외래 키를 주 테이블이나 대상 테이블 중에 선택 가능
- 외래 키에 데이터베이스 유니크 제약 조건(UNI) 추가.

- 다대일 관계와 유사.

🎨주 테이블에 외래 키
- 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래키를 두고 대상 테이블을 찾음.
- JPA 매핑 편리
- 장 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
- 단 : 값이 없으면 외래 키에 null 허용

🎨대상 테이블에 외래 키
- 대상 테이블에 외래 키가 존재
- 장 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지
- 단 : 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨.
        (주 테이블에서 대상 테이블을 찾기 위해 대상 테이블에 쿼리를 날려야 하기 때문. )

 

❓❗ 다대다 [N:M] (실무에서 권장되는 관계 매핑이 아님) @ManyToMany 

- 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음.
   (연결 테이블을 추가해서 일대다 -> 다대일 관계로 풀어내야함) 
- 객체는 컬렉션을 사용하여 객체 2개로 다대다 관계를 표현할 수 있음. 

- 편리해 보이지만 실무에서 사용 X 

- JPA에서 다대다 관계를 설정하면 내부적으로 중간 테이블이 존재하기때문에, 예상치 못한 쿼리가 나감.
- 중간 테이블에 원하는 컬럼을 추가할 수 없음.

다대다 한계 극복

- 중간 테이블을 Entity로 만들어, @ManyToOne - @OneToMany 관계로 풀어 사용.
==> 기존 Customer - Product 에서 Customer - Order - Product와 같은 형태로 중간 테이블 생성하여 일대다, 다대일 매핑

 

 

 

본 게시글은 김영한님의 Inflearn 강의를 토대로 제작되었습니다.

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

728x90
반응형
저작자표시 (새창열림)
'JPA/Base' 카테고리의 다른 글
  • JPA - 프록시 & 지연로딩, 즉시로딩
  • JPA - 상속 관계 매핑
  • JPA - 연관관계 매핑
  • JPA - Entity Mapping
KAispread
KAispread
개발에 관련된 학습 내용들을 기록하는 공간입니다.
반응형
KAispread
기억의 정류장
KAispread
전체
오늘
어제
  • All (120)
    • Language (27)
      • Java (14)
      • JavaScript (4)
      • Principle (2)
      • Summary (7)
    • Web (10)
      • Template (4)
      • Base (6)
    • Spring (7)
    • Test (7)
    • JPA (23)
      • Spring Data JPA (9)
      • Base (14)
    • AWS (10)
    • DevOps (8)
      • Monitoring (2)
    • Database (10)
    • Algorithm (9)
    • Project (1)
    • Git (1)
    • 생각 정리 (4)
    • IDE (3)
      • eclipse (1)
      • Intellij (2)

블로그 메뉴

  • 🌈 GIthub
  • 🌎 LinkedIn
  • 📝 Notion
  • 🧑🏻‍💻 Resume

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
글쓰기 관리자
KAispread
JPA - 연관관계 매핑 #2
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.