@ManyToMany ?? _실전 적용하기

박민우·2022년 4월 14일
0

모아부자

목록 보기
6/9


"여러 초대를 받고 싶어요"

모아부자 서비스 개발 중 처음 기획하고 ERD를 설계했던 부분에서 수정해야 할 부분이 생겼다.
바로 목표에 대한 초대를 여러 개 받고 싶다는 것이다.

처음에는 초대하고, 수락 대기 상태만 있으면 될 것이라고 생각했었다. 그래서 'isaccepted' 라는 이름으로 'ChallengeGoal', 'GroupGoal' 두 테이블에 넣어두었다.
그런데 구현하면서 팀원들과 이야기를 나누다 보니, 한 가지 목표만 진행하는 것은 의도가 좋지만 초대까지 하나만 받는 것은 기능 부족과 같이 느껴진다는 것이다.

백엔드 개발자들도 이와 같은 생각에 동의하게 되었고, DB에 대해서 다시 생각해보게 되었다. 일대다, 다대일 관계로만 작업하고자 했기에 방법이 없을까 여러 고민을 했다.

그런데 서비스를 풀어서 생각해보아도, 한 사용자가 여러 초대를 받을 수 있고 하나의 초대는 여러 명의 사용자를 포함해야 해서 다대다 관계가 발생했다.

그래서 다대다 관계를 어떻게 풀어갈까 이야기를 나누었다. @ManyToMany를 사용하면 중간테이블이 자동 생성되지만 말 그대로 '자동'생성이라 데이터의 변동이 잦은 서비스 특성상 오류가 발생하지 않을까 우려 되었다. 예상치 못한 쿼리가 날아가 예상하지 않은 데이터를 가져오거나 오류가 날 것이라고 생각한 것이다.

그리고 서비스에 맞춰 DB를 생각하다보니 중간 테이블이 있다면, 그곳에 is_accepted 라는 칼럼이 딱 들어가면 기존에 'ChallengeGoal' 과 'GroupGoal'에 넣었던 칼럼을 빼고 기능적으로 활용할 수 있을 것이라고 생각되었다.

그래서 'WaitingGoal' 이라는 테이블을 만들고 그 중간 테이블로 'MemberWaitingGoal'을 만들었다. 그리고 그곳에 'is_accepted_goal'이라는 칼럼을 추가해서 사용자들이 수락, 거절하는 상태를 가질 수 있도록 했다.

아래는 수정 설계한 ERD 이다.


profile
KingdomOfGod newPerson = new KingdomOfGod();

0개의 댓글