반응형
user가 다른 user를 follow 하거나 unfollow 하는 기능을 만들면서 고민한 내용이다. user가 follow 하는 다른 user들의 정보를 DB에 저장할 때, 하나의 user가 여러 user를 follow 할 수 있고, 여러 user가 하나의 user를 follow 할 수 있으므로 n:m 관계이다. @ManyToMany 사용을 지양하고 중간 Entity를 만들어서 두 개의 @ManyToOne으로 나눠서 개발해야 한다는 것을 어렴풋이 알고는 있었는데, 이참에 정확한 이유를 정리해보자.
@ManyToMany 사용을 지양하는 이유
- @ManyToMany를 사용하면 JPA는 자동으로 중간 조인 테이블을 생성하고 관리한다. 자동으로 생성해줘서 간편하다는 장점이 있지만, 테이블에 추가적인 필드나 제약 조건을 추가할 수 없다는 단점이 있다.
- 관계가 복잡해지고 데이터가 많은 경우에, JPA는 관계를 처리하기 위해 여러 쿼리를 내부적으로 실행한다. 내부적으로 실행하는 쿼리를 최적화하기 위해 직접 커스터마이징 하는 것보다 직접 중간 Entity를 만들고 최적화된 쿼리를 작성하는 것이 덜 복잡하고, 성능을 개선할 수 있다.
// @ManyToMany를 사용하는 경우
@Entity
class User {
@ManyToMany
List<User> followers = new ArrayList<>();
}
// 중간 Entity를 사용하는 경우
@Entity
class Follow {
@ManyToOne
@JoinColumn(name = "follower_id")
private User follower;
@ManyToOne
@JoinColumn(name = "following_id")
private User following;
}
결론
@ManyToMany는 정말 간단하고 확장 가능성이 없는 경우에는 유용하지만, 관계가 복잡해지고 추가적인 요구 사항이 생길 때는 중간 Entity를 사용하는 것이 제어, 성능 최적화, 확장성 및 유지 보수 측면에서 유리하다.
반응형
'Tool > Spring' 카테고리의 다른 글
[Spring boot] H2 데이터베이스에서 MySQL dialect 설정하기 (0) | 2023.12.01 |
---|---|
[Spring boot] JUnit5 테스트 코드 작성하기 (0) | 2023.12.01 |
[Spring Security] Spring Security 사용자 인증 정보 접근하기 (0) | 2023.11.21 |
[Spring] Filter 간단 정리 (0) | 2023.11.20 |
[Spring] ApplicationRunner(앱 시작하고 코드 실행하기) 정리 (0) | 2023.10.31 |