양방향 및 단방향 매핑 고민은 주로 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 |