[JPA] 양방향 연관관계와 연관관계의 주인[1] :: 잡다한 프로그래밍
반응형

이번엔 양방향 연관관계에 대해 정리해본다.

 

단방향 연관관계와 양방향 연관관계의 차이점

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

+ Recent posts