Programming/Study

중간 테이블은 어느 도메인에 위치시켜야할까?

JKROH 2024. 3. 26. 14:34
반응형

 데이터베이스 설계를 하다보면 종종 다대다 관계를 마주한다. 그리고 다대다 관계를 해결하기 위해 중간 테이블을 사용하는 것이 일반적이다.

 

 다대다 테이블을 사용하면, @ManyToMany와 @JoinTable을 사용하는 것보다 유연하게 테이블 및 소프트웨어 디자인이 가능하다.

  1. 중간 테이블에 더 많은 정보를 담을 수 있다. @JoinTable에는 양쪽 테이블의 id값밖에 담지 못한다.
  2. 추가 칼럼을 담을 수 있다는 것은 곧 해당 테이블이 새로운 개념으로 확장될 수 있다는 의미다.

 그런데, 그럼 중간 테이블은 어디에 두는 것이 옳을까? 예를 들어, A라는 도메인과 B라는 도메인의 중간 테이블인 C엔티티는 어느 도메인 패키지에 두는 것이 옳을까.

 

 내가 생각한 방안은 크게 두 가지였다.

  1. A 또는 B 도메인의 하위 도메인으로 둔다.
  2. 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 : 도메인 모델을 나눌 때 중간테이블

https://www.inflearn.com/questions/886194/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%AA%A8%EB%8D%B8%EC%9D%84-%EB%82%98%EB%88%8C-%EB%95%8C-%EC%A4%91%EA%B0%84%ED%85%8C%EC%9D%B4%EB%B8%94

 

도메인 모델을 나눌 때 중간테이블 - 인프런

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네니오2. 인프런의 질문 게시판과 자주 하는 질

www.inflearn.com

 

반응형