중간 테이블은 어느 도메인에 위치시켜야할까?
데이터베이스 설계를 하다보면 종종 다대다 관계를 마주한다. 그리고 다대다 관계를 해결하기 위해 중간 테이블을 사용하는 것이 일반적이다.
다대다 테이블을 사용하면, @ManyToMany와 @JoinTable을 사용하는 것보다 유연하게 테이블 및 소프트웨어 디자인이 가능하다.
- 중간 테이블에 더 많은 정보를 담을 수 있다. @JoinTable에는 양쪽 테이블의 id값밖에 담지 못한다.
- 추가 칼럼을 담을 수 있다는 것은 곧 해당 테이블이 새로운 개념으로 확장될 수 있다는 의미다.
그런데, 그럼 중간 테이블은 어디에 두는 것이 옳을까? 예를 들어, A라는 도메인과 B라는 도메인의 중간 테이블인 C엔티티는 어느 도메인 패키지에 두는 것이 옳을까.
내가 생각한 방안은 크게 두 가지였다.
- A 또는 B 도메인의 하위 도메인으로 둔다.
- C를 위한 새로운 도메인을 만든다.
도무지 나의 얕은 식견으로는 어느 것이 더 적절한지 답을 내릴 수가 없어서 오늘도 신(구글)에게 도움을 요청했다. 두 개의 자료를 참고해서 내 나름의 결론을 내렸다.
일단, 1번 2번 둘 다 사용 가능하다. 둘 중 어느 방법을 선택할지는 '의존 관계'에 있다. A와 B사이의 의존 관계가 명확하면 의존하는 쪽의 하위 도메인으로 C 도메인을 두면 된다. 예를 들어, A가 B에 의존하는 관계면 A도메인의 하위 도메인으로 C를 두는 것이다.
그럼 당연히 2번은 둘의 의존 관계가 불명확한 경우에 사용하면 된다. 좀 억지 예시긴 한데, 새와 총이라는 도메인이 있고 총에 맞은 새라는 도메인이 있다면, 다대다의 관계가 형성이 되지만 둘 간 의존 관계는 없다고 볼 수 있다. 새가 있어야 총이 있는 것도 아니고, 총이 있어야 새가 있는 것도 아니다. 이 때는 새로운 도메인을 하나 만들어서 사용하는 것이다.
다음으로 참고 자료를 찾으면서 얻은 정보는 아예 중간 테이블을 두 개 사용해서 A와 B도메인 둘 다에 집어넣는 것이다. 이는 둘의 의존 관계가 명확치 않을 때 사용하면 된다고 하는데, 아마 새로운 도메인을 만들어서 테이블을 하나만 사용했을 때와 두 개의 테이블을 사용했을 때의 트레이드 오프 관계를 고려해서 사용하면 되지 않을까 싶다. 테이블을 두 개 사용하면 그만큼 데이터 관리에 신경써야 할테고, 새로운 도메인을 만들면 그만큼 비즈니스 레벨에서 해당 도메인의 역할과 시스템 복잡도 제어에 힘써야 할 터이다.
당연히 다대다 관계뿐만 아니라 일대다 관계를 해소하기 위한 중간 테이블에도 적용될 원칙일 것이다. 개발 공부를 하며 내 나름의 원칙을 쌓았다고 생각될 때가 가장 뿌듯한 순간 중에 하난데, 원칙을 세울 수 있어 상당히 흡족하다.
참고자료
존버(?)님 블로그 : M:N 매핑의 중간 테이블. 어떤 패키지에 있어야 될까?
https://javachoi.tistory.com/445
M:N 매핑의 중간 테이블. 어떤 패키지에 있어야 될까?
최근 토이 프로젝트 엔티티 모델을 설계하면서 든 생각입니다. User(사용자) 라는 엔티티가 있고, Project(프로젝트) 라는 엔티티가 있다고 합시다. - 사용자는 다수 프로젝트에 참여할 수 있습니다.
javachoi.tistory.com
김영한님 Q&A : 도메인 모델을 나눌 때 중간테이블
도메인 모델을 나눌 때 중간테이블 - 인프런
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네니오2. 인프런의 질문 게시판과 자주 하는 질
www.inflearn.com