본문 바로가기
JPA

[Relation] mappedBy

by 슈슈슉민 2023. 7. 27.

양방향 및 단방향 매핑 고민은 주로 JPA에서 발생하는 문제이다. RDBS에서는 join을 사용하여 연결(양방향 매핑)을 쉽게 구현할 수 있다. 이는 RDBS의 기능 중 하나이며, JPA는 이에 대해 직접적인 지원을 제공하지 않는다.

그렇다면, JPA에서도 RDBS처럼 양방향 매핑이 더 좋은 선택이 아닐까 생각할 수 있다. 그러나 다음과 같은 이유로 이는 적합하지 않을 수 있다.

  • Entity의 복잡성이 증가할 수 있다.
  • 코드의 가독성이 떨어질 수 있다.

따라서, 일반적으로 JPA에서는 단방향 매핑을 지향한다. 그러면 두 테이블 중 어느 쪽에서 매핑을 설정해야 하는가에 대한 문제가 생긴다. 이는 다시 말해, '연관관계의 주인은 누구인가?'에 대한 질문과 같다. 연관관계의 주인은 외래키 수정 권한을 가지게 된다.

 

 

Cart vs. User 가 있다고 하자. (대충 만든 db를 보자면)

user{
 int id AI,
 varchar username
}

cart{
 int id AI,
}

한 user가 여러개의 cart를 갖는 1:N관계를 짓는다고 하자.

Cart Entity 에서
@ManyToOne
 User user
User Entity 에서
@OneToMany
 List<Cart> carts = new ArrayList<>();

이런식으로 anotation을 RDBS 관점으로 해석하면 아래와 같다.

user{
 int id AI,
 varchar username
}

cart{
 int id AI,
 int user_id FK
}

OneToMany 에서는 mappedBy("cart") 옵션이 달리지 않는다. mappedBy가 없을 때 연관관계의 주인은 N쪽이 된다. 즉, 연관관계의 주인이 아님을 

 

반대로 User가 연관관계의 주인이 된다면?

Cart Entity 에서
@ManyToOne
 User user
User Entity 에서
@OneToMany(mappedBy = "user")
 List<Cart> carts = new ArrayList<>();
user{
 int id AI,
 varchar username,
 int cart_id FK
}

cart{
 int id AI,
}

이것을 erd로 보면 user:cart=n:1 관계로 해석할 수 도 있다. 모순적이다. 그렇기 때문에 실무에서는 One 쪽에 mappedBy 옵션을 지양한다.

 

 

'JPA' 카테고리의 다른 글

[QueryDsl] 대량으로 수정하기  (0) 2025.04.08
[QueryDsl] 동적 접근이란 무엇일까  (0) 2024.10.25
Open Session in View  (0) 2024.04.25