본문 바로가기
Programming/Study

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

by JKROH 2024. 3. 26.
반응형

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

 

 다대다 테이블을 사용하면, @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

 

반응형

댓글