반응형
이번엔 양방향 연관관계에 대해 정리해본다.
단방향 연관관계와 양방향 연관관계의 차이점
Team team = new Team();
team.setName("A");
em.persist(team);
Member m = new Member();
member.setUsername("member1");
member.setTeam(team);
Member m = em.find(Member.class, member.getId());
Team t = m.getTeam(); // 팀 찾을 수 있음
지난 번 단방향 연관관계에서는 member에서 team을 객체지향적으로 찾을 수 있었다.
하지만 team에서 반대로 member를 찾을 수 없다, 양방향 매핑이 안되어 있기 때문임!
양방향 연관관계란?
JPA에서 객체와 테이블의 연관관계는 다르게 동작한다.
- DB 테이블은 외래키(예: MEMBER.TEAM_ID) 하나로 양방향 조인 가능
- 객체는 서로 참조해야만 양방향이 된다 → 단방향 두 개의 조합
즉, JPA에서 양방향 연관관계란 서로를 참조하는 단방향 관계 2개를 만드는 것과 같다.
member 엔티티
@Entity
public class Member {
@Id @GeneratedValue
@Column("MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
//@Column(name = "TEAM_ID")
//private Long teamId;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
team 엔티티
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
}
이렇게 명시적으로 양방향 관계를 맺을경우, team에서도 member를 get할 수 있다.
JPA 양방향 연관관계에서 연관관계의 주인이란?
앞서 말했듯 객체와 테이블의 관계에는 차이가 있다.
- 객체 세계에서는 연관관계를 2개의 단방향으로 표현한다.
- 반면 DB 세계에서는 외래키 하나로 양방향 조인이 가능하다.
연관관계 주인이 왜 필요할까?
이제 이런 상황을 생각해보자.
나는 A라는 멤버의 팀정보를 바꾸고 싶을때, member에 있는 Team 객체를 수정해야할까? 아니면 팀에 있는 member 객체를 수정해야할까?
이런 애매한 상황이 생길 수 있으므로 명확한 연관관계의 주인이 필요하다
연관관계의 주인이란?
🔑 정의
DB의 외래키를 관리하는 객체
즉, 외래키를 직접 가지고 있는 쪽, 대부분 @ManyToOne이다.
만약 oneToMany를 주인으로 사용할경우 Team에 있는 member를 변경했는데 쿼리는 member를 수정하는 쿼리가 나가게된다.
즉 Team 객체를 수정했는데 쿼리는 member를 수정(?) 복잡해지고 객체 지향적이지 못함 (성능이슈도 있음)
규칙 정리
항목 | 설명 |
연관관계의 주인 | 외래키가 있는 객체 (대개 @ManyToOne) |
외래키 관리 여부 | 연관 관계의 주인만이 외래키를 관리 (등록 수정 = INSERT/UPDATE 쿼리 발생) |
mappedBy | 주인이 아닌 쪽에서 사용, 주인이 아닌경우 읽기만 가능 |
연관관계 설정 방식 | 주인만 세팅하면 DB에 반영됨 |
mappedBy의 의미
@OneToMany(mappedBy = "team")
private List<Member> members;
mappedBy = "team" 은 다음과 같은 뜻이다:
- "나는 주인이 아니다"
- "연관관계 관리는 Member.team이 한다"
- "나는 읽기 전용이며 insert/update 대상이 아니다"
반응형
'프로그래밍 > JPA' 카테고리의 다른 글
[JPA] 다양한 연관관계 매핑 (2) | 2025.06.30 |
---|---|
[JPA] 양방향 연관관계와 연관관계의 주인[2] (0) | 2025.06.25 |
[JPA] 단방향 연관관계 (0) | 2025.06.24 |
[JPA] 기본키 매핑 (0) | 2025.06.19 |
[JPA] 필드와 컬럼 매핑 (1) | 2025.06.19 |