
프로젝트 ERD 설계 도중 M:N(다대다) 관계를 표현해야 했는데, 다대다 관계를 ERD에서 어떻게 표현하는지 이번에 처음 알아서 기록하려 한다. 더불어 테이블을 설계하며 고민했던 소셜 계정 메일과 일반 계정 메일의 중복 이슈를 해결한 과정 또한 기록하고자 한다.

최초로 설계한 유저 테이블은 하나였다.
소셜 로그인 여부 컬럼을 통해 소셜유저와 일반유저를 분리할 수 있다고 생각했지만, 컬럼을 이렇게 설계 했을 때 다음과 같은 문제가 발생한다.
따라서 각자가 필요없는 컬럼을 보유한 채로 테이블을 공유해야 하기 때문에 성능과 가독성 면에서 비효율적이라 판단하고, 분리하였다.
그래서 소셜 유저와 일반 유저가 공통으로 갖고 있는 컬럼은 User테이블에서 관리하고, 그 이외에 각자의 컬럼 값은 각자의 테이블을 생성하여 관리하기로 하였다.
애초에 테이블 분리만 하면 될거라 생각했는데,
id값이 중복되는 이슈도 생각하여야 했다.

위 예시처럼, 각 테이블에서 PK값으로 id를 관리하면, 같은 id 값이지만 그 안의 value가 다른, 어색한 상황이 발생할 수 있다는 것이다.
그래서 우리가 내린 결론은 다음과 같다

결론적으로 나온 유저 테이블이다.
1대1 연관관계를 맺고, 소셜유저 테이블과 일반 유저 테이블의 id값을 user 테이블의 id를 참조하여 FK값이자 PK값으로 두었다.
이렇게 되면 별도로 두 테이블에서 개별의 PK(id)값을 가지지 않고, User 테이블의 id를 따르므로 id 값이 Unique해지게 된다.
위 테이블을 설계하며 또 고민했던 부분이 있었다.
소셜계정의 이메일과 일반 계정의 이메일이 중복되면 어떡하냐?
기존의 소셜 계정에서 a@example.com의 이메일을 이용하여 가입하고
또 일반 가입으로 a@example.com의 이메일을 이용하여 가입한다면?
위 테이블에선 소셜 로그인의 이메일과 일반 유저의 이메일을 중복체크할 수 있는 수단이 없었다.
따라서 비밀번호 재설정 시 이메일 주소를 통해 비밀번호 재설정 링크를 보내준다던가의 상황에서 모호해지고, 무엇보다 유저의 흐름 자체에서 같은 이메일로 두번 가입이 된다는 것 자체가 어색하다는 의견이었다.

그래서 결론적으로
이메일 또한 공통 유저 컬럼으로 분류하였다.
이를 통해 중복된 이메일로 회원가입 하는 것을 방지하여 어색한 흐름을 방지할 수 있었다.
역시 ERD 같은 설계는 말이 많이 나오고 논점이 많을 수 밖에 없다고 느꼈다.
하지만, 다수의 인원이 설계를 함께 진행하며 최대한 상대방의 의견을 납득 하려 노력하고, 상대방의 의견에 반대한다면 그에 맞는 의견을 제시하여야 건강한 토의가 진행될 수 있다는 걸 다시 한번 느꼈다.
또한 테이블을 설계할 때 테이블을 여러 테이블로 분리하는 것이나, FK 자체를 PK로 쓰는 기법을 통해 고유성을 지키는 방법을 배울 수 있었다.

유저 테이블을 다시 하나로 합치게 되었다 !
컨설턴트님과 회의를 진행한 후 피드백을 들었던 내용이다.
결국 택1인데
분리 할 만큼, 많이 분리되어있지도 않고, 통합했을때의 장점이 조금 더 크다고 판단하여 다시 통합하였다 !