Moisam

기숙사 공동구매 플랫폼

React Node.js Express MySQL WebSocket

At a Glance

항목
분야 백엔드 / 폐쇄형 커뮤니티 커머스
기간 (채워주세요: YYYY.MM ~ YYYY.MM)
팀 규모 / 내 비중 (채워주세요: 예 — 3명 / 백엔드·DB 단독)
핵심 스택 React, Node.js, Express, MySQL, WebSocket, Google OAuth 2.0
대상 사용자 아주대학교 기숙사 학생 (폐쇄 커뮤니티)
다룬 엔티티 User, Post, Participation, Comment, Chatroom, Chatmessage (6 entities)
핵심 지표 (채워주세요: 시범 사용자 수 · 게시글/참여 수 · API 엔드포인트 수 등)
결과물 (채워주세요: GitHub 링크 · 시연 영상/스크린샷)

한 줄 요약: Moisam은 채팅 기반 공동구매의 모집 → 참여 → 결제 → 수령을 영속 기록과 상태 머신 위에 올린 풀스택 프로토타입입니다.


Problem & Constraints

기숙사 공동구매는 비용 절감 효과가 있지만, 비공식 채팅으로 진행되면 다음 문제가 반복됩니다.

  • 참여자 검증이 어려움 (누가 기숙사 학생인지)
  • 결제·수령 상태가 채팅 히스토리에 흩어짐
  • 주최자가 수동으로 참여/입금/배분을 추적
  • 신뢰가 캡처와 구두 확인에 의존

또 폐쇄 커뮤니티 특성상 사용자 풀이 작고, 외부 사용자가 섞이지 않도록 인증 단계가 필요합니다. 이 프로젝트의 목표는 위 흐름을 기록 가능한 상태 머신정규화된 관계형 모델 위에 다시 설계하는 것이었습니다.


What I Built · How

데이터 모델 (핵심 강점)

게시글을 상태가 있는 객체로 보고, PostParticipation을 분리해 전체 공동구매 상태참여자 개별 상태를 둘 다 추적할 수 있게 했습니다.

User ──< Post ──< Participation >── User
              │
              └─ Chatroom ──< Chatmessage >── User
Post ──< Comment >── User

(채워주세요: 실제 ERD 이미지 또는 mermaid 다이어그램 1장 — 강점이 가장 잘 드러나는 부분입니다.)

공동구매 상태 머신

[모집중] ──참여마감──▶ [결제대기] ──전원입금──▶ [배분준비]
   │                                              │
   └──조기마감/취소──▶ [취소]                      └──수령완료──▶ [완료]

핵심 기술 결정

  • MySQL — 사용자·게시글·참여·결제·채팅 간 관계와 제약이 본질이라 관계형이 자연스러움.
  • Google OAuth 2.0 — 비밀번호 직접 관리 회피 + 학교 도메인 이메일을 통한 학생 그룹 검증의 첫 단계.
  • WebSocket — 위치/결제/수령 확인은 대화 중심 워크플로라 실시간 채팅이 필수.
  • Post ↔ Chatroom 연결 — 확정된 참여자만 들어가는 채팅방을 게시글과 함께 생성 → 운영 대화가 게시글 옆에 붙음.

검토 후 채택하지 않은 대안

대안 채택하지 않은 이유
Firebase 등 BaaS 관계 제약/트랜잭션 표현이 약함, 학습 목적상 백엔드를 직접 다루고 싶었음
NoSQL (MongoDB) 결제·참여·수령 상태 일관성이 핵심이라 정규화된 관계형이 유리
단일 Post 테이블에 상태만 칼럼으로 참여자 개별 상태(입금/수령)를 추적할 수 없음 → Participation으로 분리

Results & Demo

  • 모집 → 참여 → 결제 → 수령 → 완료의 전 라이프사이클을 다루는 풀스택 프로토타입 완성.
  • 6개 핵심 엔티티의 정규화된 스키마와 상태 머신 기반 백엔드 설계 검증.
  • 게시글과 채팅방이 자연스럽게 연결되어 주최자 운영 부담을 시스템이 일부 흡수.

(채워주세요: GitHub 링크 · 화면 캡처(모집·채팅·결제 상태) 3~4장 · 시범 운영 시 사용자/게시글 수)


What I’d Do Differently

  • 결제 확인 동시성전원 입금 → 상태 전이 구간에 트랜잭션·낙관적 락 정책을 명시하고 race condition 테스트 케이스 작성.
  • 채팅 메시지 영속/순서 보장 — WebSocket 이벤트 손실 시 복구 절차(메시지 ID·재전송) 정의.
  • 스키마 IaC화 — Prisma / Liquibase 등으로 마이그레이션을 코드로 관리해 학교 SSO 연계나 추후 모델 변경을 안전하게.
  • 운영 지표 — 게시글 완료율 / 평균 모집 시간 / 분쟁 발생 비율 등 서비스 신뢰 지표를 처음부터 수집.

English version: Moisam