Skip to content

험난한 ERD 그리기

cdj2073 edited this page Dec 14, 2023 · 1 revision

전체 ERD

ERD를 그려보자~!

User 관련 테이블

  • 사용자는 email, password를 이용해 회원가입/로그인 할 수 있다.
  • 사용자는 kakao 소셜 로그인을 통해 회원가입/로그인 할 수 있다.
    • 이후에 naver, google 로그인 등을 추가할 수 있다.
    • 확장 가능성을 위해 oauth_provider 테이블을 분리
    • 자체 회원가입 유저와 일단 하나의 user 테이블에 저장하게 되어 oauth_provider_id가 null인지 여부로 자체 회원가입과 소셜 회원가입 사용자를 구분한다.
  • 사용자는 다른 사용자를 팔로우할 수 있다.
  • 사용자는 여러 그룹에 속할 수 있다.
    • 한 명의 사용자는 여러 그룹에 속할 수 있고, 하나의 그룹에는 여러 사용자가 속할 수 있다.
    • N:M 관계를 표현하기 위해 중간에 user_group 이라는 junction table 추가
  • 사용자는 프로필 사진을 설정할 수 있다.
    • 사진과 같은 컨텐츠의 경우 사용자의 프로필, 그룹의 대표 이미지, 피드의 첨부파일 등 여러 곳에서 재사용할 수 있도록 content 테이블로 분리
    • user 테이블은 profile_id라는 이름으로 content 테이블의 id를 fk로 갖는다.
    • 사용자의 정보를 조회할 때 프로필 사진의 링크를 얻기 위해 content 테이블을 join하여 path를 불러오도록 한다.

Event 관련 테이블

사용자와 그룹은 각각 하나의 calendar를 갖는다.

현재는 그룹 기능이 존재하지 않아 event_member에서 사용자의 일정을 불러오기 때문에 calendar를 사용하고 있지 않지만 그룹 기능이 추가되면 그룹의 일정을 불러오는데 사용될 것 같다.


event와 detail, 그리고 event_member

일정에 필요한 내용들은 아래와 같다.

  • 제목
  • 시작일, 종료일
  • 참여 가능 여부
  • 일정 공지
  • 반복 설정
    • 반복 주기 / 반복 빈도 / 반복 종료일
  • 메모
  • 공개 여부

우리의 서비스에서 일정은 소유자 본인만의 것이 아니라 다른 사람들도 일정 멤버로 초대하거나 참여할 수 있다.

이렇게 일정을 공유하게 되면서 일정 소유자만이 수정하고 설정할 수 있는 속성일정 멤버 각자가 개인별로 설정할 수 있는 속성 두 가지로 나뉘게 되었다.

  • 일정 소유자만이 설정 가능

    • 제목
    • 시작일
    • 종료일
    • 참여 가능 여부
    • 일정 공지
    • 반복 설정
  • 일정 멤버 개인별 설정 가능

    • 메모
    • 공개 여부

이렇게 나뉜 두 속성을 하나의 event 테이블에 저장하게 된다면, 일정에 참여하는 사용자마다 event 테이블에 새로운 레코드가 추가될 것이다. 이 경우 중복된 데이터가 많아지고 일정 소유자가 일정의 제목이나 날짜와 같은 주요 속성을 수정했을 때 각각의 일정 멤버들의 event까지 찾아서 하나하나 수정해줘야 한다.

⇒ 개인 별로 설정 가능한 속성은 따로 빼자!

그렇게 event 테이블과 detail 테이블로 분리되었다!

추가적으로 일정에 참여한 사람이 누구누구인지, 누가 소유자이고 누가 참여자인지, 어떤 detail을 갖고 있는지 등을 저장하기 위한 event_member 테이블이 추가되었다.

  • event
    • 일정 소유자만이 설정 가능한 일정 내용으로 일정 멤버들과 공유된다.
  • detail
    • 개인별로 설정 가능한 일정 내용
  • event_member
    • event - user - detail을 모두 연결
    • 해당 user의 authority (OWNER/MEMBER)
💡 user A가 일정을 생성하면 event와 detail이 생성되고 event_member에 authority = OWNER로 추가된다. 해당 일정을 user B, C와 공유할 경우에는 user B와 C의 detail이 생성되고 각각 authority = MEMBER로 event_member에 추가된다. event는 새로 생성되지 않고 user A가 생성한 event id를 사용하여 user A가 일정 주요 내용을 수정했을 때 바로 반영된다.

repeat_policy

MeetMeet은 반복 일정도 지원한다!

하나의 반복 일정은 같은 반복임을 알고 있어야 하기에 반복 시작, 종료일, 반복 주기에 대한 정보를 갖고 있는 repeat_policy 테이블을 추가하고 repeat_policy의 id를 fk로 event 테이블에 추가해줬다.

🚨 이렇게 일정에 반복과 공유가 추가되며 일정 하나를 위한 테이블이 4개로 불어나게 되었다. 복잡한 ERD의 시작… + Left join 최대 9번의 시작….

invite

마지막으로 일정에 초대하면 초대 받은 사용자에게 푸시알림이 가고 해당 알림을 통해 일정 초대를 수락하거나 거절할 수 있다.

⇒ 누가(sender), 누구를(receiver), 어떤 이벤트에(event) 초대했는지 알아야 하고, 해당 초대가 수락되었는지 거절되었는지 여부(status)를 알아야 한다.

fcm 알림을 구현하며 알림의 상태를 저장해야할 필요성을 느껴 아래와 같이 알림 상태를 6가지로 나타내는 status 테이블을 추가하게 되었다.

Feed 관련 테이블

  • 일정에는 피드를 작성할 수 있고, 피드에는 이미지, 동영상을 업로드하고 글을 작성할 수 있다.
    • 피드 하나에 이미지와 동영상이 최대 10개까지로 여러 개 올라간다.
    • content 테이블은 위에서 말했다시피 사용자 프로필, 피드, 그룹 이미지 등 여러 곳에서 재사용할 수 있도록 하기 위해 따로 만들어두었기에 feed_content 테이블을 추가했다.
  • 피드에는 댓글을 작성할 수 있다.

⚽️협업 룰

코딩 컨벤션

📔회고

팀 회고

개인 회고

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

👨‍🏫멘토링 회의록

💻개발일지

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

💡트러블슈팅

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

📋회의록

스크럼 회의

스프린트 회의

밋밋 회의

공통

BackEnd

Android

기획

Clone this wiki locally