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
- 서버
- java
- spring
- 알고리즘
- jsp
- 미니정리
- 정리
- 프런트엔드
- 오라클
- web
- 백엔드
- 프론트엔드
- node.js
- oracle
- 스프링
- 디자인 패턴
- 자바
- JavaScript
- SQL
- 자바스크립트
- Next.js
- jpa
- BACK-END
- 코드테스트
- 프로그래머스
- MySQL
- 데이터베이스
- 코드 테스트
- 스프링부트
- 쿼리
Archives
- Today
- Total
참치코더의 꿈 메모장
JPA - 양방향 매핑 과 설정 방법 정리 본문
728x90

양방향 매핑
- 두 엔티티가 서로를 참조하는 관계
단방향 매핑은 Member -> Team (다 : 일)만 참조하지만,
양방향 매핑은 Member -> Team, Team -> Member 둘 다 참조한다.
|
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
|
// Member.java
@Entity
@Getter
@Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // 외래키(주인)
private Team team;
}
// Team.java
@Entity
@Getter
@Setter
public class Team{
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team") // 반대편에서 team 필드를 참조함
private List<Member> members = new ArrayList<>();
}
|
cs |
mappedBy의 의미
연관관계의 주인(owner) : 외래키(FK)를 실제로 관리하는 쪽
-> @JoinColumn이 있는 쪽(Member)
비주인(inverse) : mappedBy로 주인을 지정하는 쪽
-> Team의 @OneToMany(mappedBy = "team")
즉, DB의 TEAM_ID 컬럼은 Member 테이블에만 존재하고, TEAM은 단순히 읽기용 관계만을 가진다.
|
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
|
// 양방향 관계 설정 시 주의할 점
// 주인쪽만 설정해도 DB에 작동은 하지만
// 객체지향 관점으로 봤을때, 매커니즘이 이상하다.
// 따라서 전체 경로에 입력을 시켜주는 것이 좋다.
Team teamA = new Team();
teamA.setName("팀A");
em.persist(teamA);
Member member1 = new Member();
member1.setUsername("member1");
member1.setTeam(teamA); // 연관관계의 주인 쪽만 설정
em.persist(member1);
// teamA.getMembers()는 비어 있음
teamA.getMembers().size();
//////////////////////////////////////////////////////
// 해결 방법 -> 연관관계 편의 메서드 사용
// Team.java
public void addMember(Member member) {
members.add(member);
member.setTeam(this); // 양쪽 다 설정
}
// Member.java
public void addTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
// 주의 할 점이 양쪽 클래스에다가 2중으로 연결을 해놓으면
// 버그가 발생할 가능성이 있기 때문에, 프로젝트에 따라 유동적으로 선택하도록 하자
|
cs |
연관관계의 주인은 왜 필요할까?
- DB의 외래키(FK)는 한쪽에만 존재하므로, JPA가 어느 쪽을 기준으로
FK를 수정해야 하는지를 알아야 한다.
- 주인이 아닌 쪽(mappedBy)에서는 insert/update 쿼리를 발생시키지 않는다.
실 개발에서는?
- 단방향 매핑만으로 충분한 경우가 많다.
- 무한 루프 주의(toString, 롬복, JSON 직렬화 시)
- 연관관계 편의 메서드는 한쪽에만 정의하는 것이 좋음 (혼란 방지) -> 그냥 (다)쪽으로
728x90
'JPA' 카테고리의 다른 글
| JPA / 일대일(OneToOne) 매핑, 다대다(ManyToMany) 매핑(코드 위주) (0) | 2025.10.10 |
|---|---|
| JPA / 일대다(oneToMany) 관계 매핑 정리 (0) | 2025.10.09 |
| JPA / 단방향 엔티티 연관관계(多 : 一) 정리 (0) | 2025.10.06 |
| JPA / 데이터 생성 시간 , 수정 시간 컬럼 자동 저장 방법(코드 위주) (0) | 2025.10.04 |
| JPA / IDENTITY 전략 VS SEQUENCE 전략 비교 정리 (0) | 2025.10.02 |
Comments