Backend/SpringBoot

양방향맵핑과 'mappedBy'

Mo'Greene 2022. 12. 30. 22:56

두 엔티티가 있다.

@Entity
class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long memberId;

    @ManyToOne
    private Team team;
}


@Entity
class Team {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long teamId;

    @OneToMany
    private Set<Member> members = new HashSet<>();

}

 

과연 두 엔티티는 '양방향 맵핑' 되었다고 말할 수 있을까?

db를 살펴보자

h2를 통해 확인한 테이블

Member와 Team은 각 이름의 테이블로 서로가 양방향맵핑이 되었다고 생각되는데 뜬금없는 TEAM_MEMBERS가 생겨있다.

 

TEAM_MEMBERS는 Team엔티티에서 @OneToMany 를 통해 생긴 테이블이라는걸 알 수 있고

erd로 보자면 이렇게 얌전히 서로가 얽혀있는 관계가 아닌

Member -> Team

Team -> Team_Member 라는 2개의 '단방향 맵핑'이 생겨버린 상황이다.

 

위와같은 상황을 해결코자 사용하는 것이 mappedBy 다.

mappedBy는 '연관관계의 주인'이 누구냐고 해석하는 것이다.

 

@Entity
class Team {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long teamId;

    @OneToMany(mappedBy = "team")
    private Set<Member> members = new HashSet<>();

}

위와 같이 mappedBy 설정을 통해 Member의 엔티티에 Team의 값을 넣어주게 되었다.

각 엔티티의 양방향 맵핑을 설정해주게 되었다.