일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- spring
- Java
- LCM
- C#강의
- mvc
- Python
- pypy3
- python3
- unity
- 파이썬
- 프로그래머스
- 1일1솔
- 소수찾기
- 우선순위큐
- DP
- 그리디 알고리즘
- JPA
- 합 구하기
- deque
- 연관관계
- 인프런
- BFS
- 완전탐색
- 브루투포스
- 소수판별
- c#
- 백준
- 누적합
- appendleft
- popleft
- Today
- Total
jae_coding
[Spring JPA] 다양한 연관관계 매핑 (N:1, 1:N, 1:1, N:M) 본문
목차
- 연관관계 매핑시 고려사항
- 다대일 [N:1]
- 일대다 [1:N]
- 일대일 [1:1]
- 다대다 [N:M]
1. 연관관계 매핑시 고려사항
- 다중성 (DB의 관점에서)
- 다대일: @ManyToOne (가장많이 사용한다)
- 일대다: @OneToMany
- 일대일: @OneToOne
- 다대다: @ManyToMany (실무에서는 사용하면 안된다)
- 단방향 매핑 or 양방향 매핑
- 테이블
- 외래 키 하나로 양쪽 조인 가능
- 방향이라는 개념이 존재하지 않음
- 객체
- 참조용 필드가 있는 쪽으로만 참조가능
- 한쪽만 참조하면 단방향
- 양쪽이 서로 참조하면 양방향
- 테이블
- 양방향일때, 연관관계의 주인
- 테이블
- 외래 키 하나로 두 테이블이 연관관계를 맺음
- 객체
- A와 B 양방향 관계는 A👉B, B👉A 처럼 참조가 2군데임
- 참조가 2개이니 2개중 테이블의 외래키를 관리하는 곳을 지정해야함
- 연관관계의 주인: 외래 키를 관리하는 참조
- 주인의 반대쪽: 외래 키에 영향을 주지 않고, 단순 조회만 가능 (읽기만 가능)
- 테이블
2. 다대일 [N:1]
다대일 단방향 매핑
- 외래키가 있는 곳: 다(N)
- 다대일 👈👉 일대다
다대일 양방향 매핑
- 외래 키가 있는 곳이 연관관계의 주인
- 양쪽을 서로 참조하도록 개발을 진행
3. 일대다 [1:N]
1이 연관관계의 주인!
일대다 단방향 매핑 (실무에서는 권장하지 않음)
- DB입장에서는 외래키를 다쪽에 선언이 되어야한다.
- 일대다의 경우에는 팀의 리스트 멤버스를 변경했을때, 다른 테이블을 업데이트 해주어야하는 특이한 구조가 된다.
단점
- 엔티티가 관리하는 외래 키가 다른 테이블에 존재한다.
- 연관관계 관리를 위해서 추가적으로 UPDATE SQL을 실행한다. (혼동 + 운영이 힘들어짐)
일대다 양방향 매핑
일대다 양방향은 공식적으로는 존재하지 않으니 다대일 양방향을 사용하는 편이 효율적이다.
4. 일대일 [1:1]
- 주 테이블 or 대상 테이블 중에 외래 키를 선택할 수 있다.
- 외래 키가 존재하는 DB에 유니크 제약조건이 추가되어야 한다.
- 일대일 단방향 (주 테이블에 외래 키가 존재) 👉 다대일 단방향 매핑과 유사하다.
- 일대일 단방향 (대상 테이블에 외래 키가 존재)은 존재 할 수 없다. (JPA가 지원하지 않음)
- 일대일 양방향 (주 테이블 FK)
- 일대일 양방향 (대상 테이블 FK)
주 테이블에 외래키가 존재한다면?
- 객체지향 개발자들이 선호
- JPA 매핑 관리
- 장점: 주 테이블만 조회하면 대상 테이블에 데이터가 존재하는지 확인할 수 있다.
- 단점: 값이 없으면 외래 키에 null이 들어간다.
대상 테이블에 외래키가 존재한다면?
- 전통적인 DB 개발자들이 선호
- 장점: 일대일에서 일대다 관계로 변경할 때, 테이블 구조를 유지
- 단점: 프록시 기능의 한계로 인하여 지연 로딩으로 설정을 한다고해도 즉시로딩이 된다. (치명적인 단점)
5. 다대다 [N:M]
실무에서는 사용하면 안된다
이유?
RDBMS는 정규화된 테이블 2개로 다대다 관계를 사용할 수 없다. 따라서 연결 테이블을 추가하여 일대다, 다대일 관계로 풀어내어야 한다.
예시)
하지만, 객체에서는 컬렉션을 사용하여 객체 2개로 다대다 관계를 설정할 수 있다 (@ManyToMany)
한계점?
- 연결 테이블이 단순히 연결만 하고 끝나지 않는다.
- 주문시간, 수량 같은 더미 데이터가 들어올 수 있다.
- 🌟 다대다를 풀어내기위해서 @ManyToMany 👉 @OneToMany, ManyToOne 으로 풀어내야함 🌟
'Spring, java > Spring_JPA' 카테고리의 다른 글
[Spring JPA] 프록시 (0) | 2022.09.15 |
---|---|
[Spring JPA] 상속관계 매핑 (Superclass) (0) | 2022.09.13 |
[Spring JPA] 연관관계 매핑 (0) | 2022.09.10 |
[Spring JPA] 엔티티 매핑 (0) | 2022.09.08 |
[Spring JPA] 영속성 관리 (영속성 컨텍스트) (0) | 2022.09.08 |