Skip to content

[recap] 양방향 매핑에서 MappedBy가 필요한 이유 #10

@move-hoon

Description

@move-hoon

무엇을 알게 되었나요?

양방향 매핑

  • 양방향 매핑은 두 객체가 서로 참조해야 하는 상황에서 정의하는 연관관계 방식이다.
  • 실제로는 각각의 단방향 매핑이 존재하는 것이며 이를 합쳐 양방향을 의미한다.

MappedBy 사용 이유

image
  • 현재 Member와 Team은 N:1 관계이다.
  • 여기서 양방향 매핑을 적용한다면, Member 객체뿐만 아니라 Team 객체도 members 필드를 통해 MEMBER 테이블에 접근이 가능해지기 때문에 혼란이 생길 수 있다.
  • 그렇기 때문에 두 객체중 하나의 객체만 테이블을 관리할 수 있도록 정하는 것이 MappedBy 옵션이다. 그렇다면 어느 곳에 해당 옵션을 사용하는 게 좋을까?

MappedBy 위치

@Entity
public class Member { 

    @Id @GeneratedValue
    private Long id;
    
    @Column(name = "USERNAME")
    private String name;
    private int age;
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    … Getter, Setter 생략
}
@Entity
public class Team {

    @Id @GeneratedValue
    private Long id;
    private String name;
    
    @OneToMany(mappedBy = "team")
    List<Member> members = new ArrayList<Member>();

    … Getter, Setter 생략
}
  • 주인이 아닌 객체에 MappedBy를 적용해야 한다.
  • 예제에서는 Team 객체에 MappedBy가 적용되어 있는 것을 볼 수 있는데 이 경우에는 Team 객체는 MEMBER 테이블을 관리할 수 없고 Member 객체만이 권한을 받고 주인이 아닌 쪽은 읽기(조회)만 가능해진다. 즉, MappedBy가 정의되지 않은 객체가 주인(Owner)가 되는 것이다.
  • 일반적으로 외래키를 가진 객체를 주인으로 정의하는 것이 좋다.(외래키를 가진 Member 객체가 주인)

어려운 내용이 있었다면 이를 어떻게 해결하였나요?

x

어떤 자료를 참고하였나요?

https://velog.io/@wogh126/JPA-%EC%96%91%EB%B0%A9%ED%96%A5-%EB%A7%A4%ED%95%91%EC%97%90%EC%84%9C-MappedBy%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions