[Node JS] Cafe Stamp 프로젝트 - 기획 및 설계

RedPanda·2022년 10월 24일
0

드디어 첫 프로젝트를 진행하였다. 이 프로젝트 전에 미니 프로젝트 하나를 팀원 한분과 작업했었는데 도중에 정식으로 프로젝트를 진행하라해서 미니 프로젝트를 미뤄두었다.

처음에는 둘 다 할 수 있을 줄 알았는데, 막상 진행을 다 해보니 GitHub부터 마지막에 구현한 Socket까지 배워야 할 것이 산더미였다.

오늘부터는 프로젝트 리마인드 및 개선해야 할 점에 대해 포스팅하고자 한다.

🔖 기획 및 설계 과정

✏️ 프로젝트 기획 과정

팀원은 백엔드 둘, 프론트엔드 둘로 구성되었다. 4명이라 다양한 주제가 나왔는데, 그 중에서 가장 주목을 받았던 것은 '작은 카페들을 위한 카페 관리 시스템' 이었다.

초반 기획으로는 각 카페(고객)에 대해 쿠폰, 게시판, 고객관리 등의 서비스를 구독 형식으로 제공해준다는 것으로 잡고 시작했다.
그러나 카페마다 게시판 DB, 고객DB, 쿠폰DB를 각각 가져야 한다는 제약이 있었다.
이렇게 나눠주지 않고 한 개의 DB에 몰아 넣는다면 DB 크기가 매우 커지고, DB에서 데이터를 찾는 시간 또한 증가할 것이며, 결과적으로 서버의 품질이 저하될 우려가 있었다.

그렇다고 다른 주제를 찾자니 마땅히 좋은 아이디어가 나오지 않았다.
그래서 우리 팀은 카페 프로젝트를 하되, 기능을 줄이고 쿠폰기능만 제공해주는 방향으로 기획하였다.

🧾 요구사항 명세 및 초반 DB 설계

우선 메인페이지가 있어야 했다. 당근마켓으로 따지면 웹사이트 처음 화면 같은 느낌이다. 당근마켓은 홈페이지가 메인이 아니라 어플이 메인이기 때문에 홈페이지에는 주요 기능이 없다. 이를 차용하여 우리 또한 홈페이지와 기능페이지를 나눠서 개발하기로 하였다.

메인페이지에서 있어야할 기능에 대한 요구사항은 이러하다.

점주 회원 관리
- 카페(지점) 등록 / 수정 / 삭제 / 조회
- 점주 정보 등록 / 수정 / 삭제 / 조회
- Q&A 및 F&Q 등록 / 수정 / 삭제 / 조회

  • 점주(Owner)는 홈페이지에서 회원가입 및 로그인을 해야한다. 내정보 조회 및 수정, 탈퇴 또한 가능해야 한다.
  • 카페(Cafe)는 로그인한 점주에 한하여 제공하되, 구독한 고객에 한하여 등록, 수정, 삭제, 조회가 가능해야 한다.
  • Q&A는 추가적으로 넣은 기능인데, 서비스를 사용하면서 점주들이 관리자에게 물어볼 질문에 대한 기능이다. 질문에 대한 답변은 관리자 계정에서만 할 수 있다.

다음은 실제 이용할 카페 페이지에 대한 요구사항이다.

카페 페이지 관리
- 등록 고객(전화번호) 등록 / 조회
- 쿠폰 개수 추가 / 조회 / 삭제
- 메뉴 조회 / 추가 / 삭제

  • 해당하는 카페(Cafe)는 각각의 고객들을 가지고 있으며, 고객들에 해당하는 스탬프 또한 가지고 있다.
  • 스탬프(Stamp)는 고객이 없으면 자동으로 추가되어야 하고, 추가 및 사용만 가능하다. (스탬프는 삭제가 불가능하다.)

초기에는 고객과 쿠폰과 카페의 연관관계를 잘 설정한다면 문제없이 만들 수 있을 것 같았다. 그러나, 카페와 고객은 N대M 관계이고, 이에 대해 스탬프를 어떻게 관계 맺어야 할지 고민이 많았다. 이부분 때문에 이틀을 날렸다...
첫 결론으로는 카페와 고객의 관계를 스탬프로 엮는 방법을 사용하였다.
이는 Sequelize ORM의 N대M 관계를 생성하는 방법에서 차용하였다. 아래의 예시를 보면 이해가 될 것 같다.

가운데의 테이블을 스탬프로 하여 카페와 고객의 관계를 연결시키는 방법을 사용하였다.
이대로 개발을 하다가 한가지 고민에 빠졌다.

고객 테이블에 있는 유효한 칼럼이 오직 고객의 전화번호라는 점이었다. 이는 DB의 낭비이라 보았고, 나는 스탬프 테이블에 추가하여 문제를 보완해보았다.
이에 대한 장단점이 있지만, 단점은 확실하다. 모든 고객을 조회할때 한 개의 테이블에서 조회하기 때문에 조회하는 데에 시간이 오래걸린다는 큰 단점이 있었다. 하지만 카페가 많아지는 것을 고려하는 것보다 DB 구조를 단순화하는 게 이번 프로젝트의 취지에 맞을 것 같았다. 고객을 조회하는 API는 결국 한번밖에 사용하지 않았기 때문이다. 따라서 나름대로 최선의 방법을 찾고자 노력하였다.

결과적으로 나온 DB를 ER-Diagram으로 그려보았다.

🧱 SCHEMA 및 ER-Diagram

추가 설명으로, Q&A는 각각 한 질문에 한 답변만 달 수 있도록 하기 위해 1대1 관계로 구현하였다.

다음은 요구사항 분석에 대한 스키마이다.

  • 점주(Owner)

    ColumnDomainAllow NullPrimary KeyForeign Key
    idNUMERICFALSEOX
    emailSTRING(50)FALSEXX
    userIdSTRING(20)FALSEXX
    passwordSTRING(100)FALSEXX
    nameSTRING(20)FALSEXX
    ownerPhoneSTRING(13)FALSEXX
    isManagerBOOLEANFALSEXX
    CafeIdNUMERICTRUEXCafe - Id
  • 카페(Cafe)

    ColumnDomainAllow NullPrimary KeyForeign Key
    IdNUMERICFALSEOX
    cafeNameSTRING(50)FALSEXX
    locationSTRING(20)FALSEXX
    businessNumSTRING(20)FALSEXX
    expireDateDATEFALSEXX
    iconSTRING(100)TRUEXX
    imgSTRING(100)TRUEXX
    OwnerIdNUMERICTRUEXOwner - Id
  • 도장(Stemp)

    ColumnDomainAllow NullPrimary KeyForeign Key
    idNUMERICFALSEOX
    stackStampINTEGERTRUEXX
    leftStampINTEGERTRUEXX
    visitINTEGERTRUEXX
    memoSTRING(100)TRUEXX
    custPhoneSTRING(13)TRUEXX
    CafeIdNUMERICTRUEXCafe - Id
  • 질문(Question)

    ColumnDomainAllow NullPrimary KeyForeign Key
    idNUMERICFALSEOX
    categoryENUMFALSEXX
    titleSTRING(100)FALSEXX
    textSTRING(300)FALSEXX
    SolutionIdNumericTRUEXSolution - Id
    CafeIdNUMERICTRUEXCafe- Id
  • 답변(Solution)
    ColumnDomainAllow NullPrimary KeyForeign Key
    idNUMERICFALSEOX
    commentSTRING(300)FALSEXX
    QuestionIdNUMERICTRUEXQuestion - Id
    CafeIdNUMERICTRUEXCafe - Id

보통은 고객을 PK나 UNIQUE 값으로 두겠지만, 카페마다 중복된 고객을 가지기 때문에 UNIQUE 값을 설정해두지 않았다.

API 요구사항 및 설계

API 요구사항

필요한 기능에 대한 API 요구사항을 나열해보았다.

  • 로그인 (10/11)
  • 회원가입 (10/11)
  • 아이디 중복 확인 (10/11)
  • 비밀번호 중복 확인 (10/11)
  • 이메일 보내기 (10/11) - nodemailer
  • 이메일 인증 (10/11)
  • 비밀번호 찾기 : 아이디와 본명, 이메일 기입 -> 이메일로 임시비밀번호 발송
  • 아이디 찾기 : 본명과 이메일 기입 -> 이메일로 아이디 발송 -> 로그인 또는 비밀번호찾기 페이지로 라우팅 해주는 페이지
  • 카페 추가 + 결제 시스템 : 만료일 칼럼 추가해서 한달마다 유효한지 확인 및 삭제
  • 카페 이름 중복 체크
  • 내 정보 CRUD (10/11)
  • 내 카페 CRUD (10/11)
  • 등록 고객(전화번호) 등록 / 조회
  • 쿠폰 개수 조회 / 사용 / 추가 /
  • QnA CRUD
  • res.status 조정
  • 결제 기능 추가
  • Socket으로 쿠폰 적립 / 사용
  • 쿠폰 현황 확인 알람 (kakaotalk push API) https://developers.kakao.com/docs/latest/ko/message/rest-api
profile
끄적끄적 코딩일기

0개의 댓글