Notice
Recent Posts
Recent Comments
Link
250x250
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- spring
- 프로그래머스
- 미니정리
- web
- BACK-END
- 쿼리
- jpa
- 데이터베이스
- 스프링
- 서버
- node.js
- java
- 백엔드
- jsp
- 프론트엔드
- 코드테스트
- oracle
- 프런트엔드
- 알고리즘
- Next.js
- MySQL
- 코드 테스트
- 디자인 패턴
- 오라클
- SQL
- 정리
- 자바스크립트
- JavaScript
- 스프링부트
- 자바
Archives
- Today
- Total
참치코더의 꿈 메모장
JPA / 일대다(oneToMany) 관계 매핑 정리 본문
728x90

일대다 관계(OneToMany)
- 하나의 엔티티가 여러 엔티티를 가질때 발생
ex) 하나의 팀에 여러 명의 회원이 속함
구조
- 주인(Owner) : 일(one) 쪽에 위치
- 외래키(FK) : 다(Many) 쪽 테이블에 존재
- 외래키가 다(Many)쪽에 있는 상태(관계형 데이터베이스는 절대적인 조건을 가진다)에서 객체 관점으로
1:多로 관리를 한다면 주인 쪽인 1이(Team) Member 테이블의 외래키를 관리한다는 점에서 이상한
모양의 데이터베이스 설계도가 나오게 된다. (실제 DB 테이블과 객체 사이에 리버스 모양으로 관리가 된다.)
- JPA는 이걸 지원하지만 굉장히 굉장히 비효율적이기 때문에
(나는 Team을 바꿨는데? 내부적으로 왜 Member 테이블이 update 되었다고 로그가 찍혔지? 등등....)
설계 자체를 다대일 관점에서 설계를 다 하고 정말 해당 데이터 조인이 필요하다면 다대일 양방향 관계를
추가하는 것으로 개발을 진행해야 한다.
|
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
// 일대다 단방향 매핑
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
// 단방향 일대다
@OneToMany
@JoinColumn(name="TEAM_ID") // MEMBER 테이블의 FK 칼럼명
private List<Member> members = new ArrayList<>();
}
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
}
/*
1. @JoinColumn(name = "TEAM_ID")로 지정했기 때문에 실제 FK는 MEMBER 테이블에 존재한다.
2. 하지만 Member는 Team을 모르므로 Team이 외래키를 직접 관리하려고 한다.
3. 이때 INSERT 후 추가적인 UPDATE 쿼리가 발생 할 수 있다.
*/
// 일대다 양방향 매핑
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
// 양방향 매핑
@OneToMany(name="TEAM_ID")
private List<Member> members = new ArrayList<>();
public void addMember(Member member) {
members.add(member);
member.setTeam(this); // 연관관계 편의 메서드
}
}
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID", insertable false, updatable = false) // 외래키 주인
private Team team;
}
/*
1. 이렇게 한다면 일대다 양방향 매핑처럼 보이게 할수는 있지만 JPA에서 공식으로 지원하는 방법이 아니다.
2. 결국 Member에서 다대일 일대다 매핑에서 조회만 할수 있도록 기능을 막아놓은 것이다, 불안정함
*/
|
cs |
그럼 뭘 사용해야 할까?
- 실무에서는 거의 항상 @ManytoOne을 주인으로 둔 단방향 매핑, 필요하다면 양방향 매핑을 사용한다.
- 양방향을 쓸 땐 연관관계 편의 메서드로 일관성을 유지하는게 좋다. (더 편하다.)
728x90
'JPA' 카테고리의 다른 글
| JPA / 상속관계 매핑 (SINGLE_TABLE, JOINED, TABLE_PER_CLASS) (1) | 2025.10.13 |
|---|---|
| JPA / 일대일(OneToOne) 매핑, 다대다(ManyToMany) 매핑(코드 위주) (0) | 2025.10.10 |
| JPA - 양방향 매핑 과 설정 방법 정리 (0) | 2025.10.08 |
| JPA / 단방향 엔티티 연관관계(多 : 一) 정리 (0) | 2025.10.06 |
| JPA / 데이터 생성 시간 , 수정 시간 컬럼 자동 저장 방법(코드 위주) (0) | 2025.10.04 |
Comments