mappedBy

  • 양방향 매핑일 때 사용
  • @OneToMany의 속성
  • 내가 관계의 주인이라는 것을 표시

연관 관계의 주인

Jpa 에서 자주 언급되는 양방향 매핑이라는 말이 있을 것이다. 하지만 엄밀히 이것은 양방향이 아니다. 서로 다른 단방향 연관관계 2개를 어플리케이션 레벨에서 적절하게 양방향인 것처럼 만들어 주는 것이다.

반면 데이터베이스 테이블은 외래키 하나로 양방향 관계가 가능하다. 아래의 예시를 보자

SELECT * FROM MEMBER M JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
SELECT * FROM TEAM T JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID

하지만 JPA에서 양방향을 만들기 위해서는 2개의 단방향이 필요하게 되므로 총 2개의 참조가 필요해지게 된다.

A, B 두개의 엔티티가 있다고 가정하면 A 클래스에서 B 클래스를 필드로 가지고 있어야 하고, B 클래스에서도 A 클래스에 대한 필드를 가지고 있어야 한다. 이를 테이블로 생각하면 A에 외래키(B)가 있어야하고, B 테이블에 외래키(A)를 들고 있으란…?? 궁금하면 계속 읽어보자.

엔티티를 양방향 연관관계로 설정하기 위해 필요한 참조는 2개인데 데이터베이스 상으로 외래키는 하나이다. 이런 차이로 인해 JPA에서는 객체 연관관계 중 하나를 주인으로 삼고 이 외래키를 보관하도록 한다.

예시

class Team (
    ...
    @OneToMany(mappedBy="team")
    val members: List<Memeber> = listOf()
){}

class Member (
    ...
    @ManyToOne
    @JoinColumn(name="TEAM_ID")
    val team: Team? = null
){}