⭐️ How?

현재 진행하는 원티드 프리온보딩 인턴십 과정에서는 자료구조, 알고리즘을 공부하고 있다.

더불어 팀 과제를 위한 팀이 꾸려졌고, Python, Django 스택으로 모인 팀이 결성됐다!
인턴십 과정에서 Python을 다루는 인원이 얼마 없어서 그런지 우리 팀은 4명이 한 조를 이루게 되었다.

자유롭게 팀 프로젝트를 진행해도 좋아서 1건의 팀 과제 마무리 후, 팀 프로젝트를 시작하게 되었다.

⭐️ What?

첫 회의 시간에는 같이 진행해 볼 팀 프로젝트 아이디어를 생각해왔었다.

  • 미리 코디를 해볼 수 있는 웹 서비스
  • 내게 맞는 카페를 찾고, 미리 주문할 수 있는 웹 서비스
  • 쇼핑몰을 구축해보는 이커머스 웹 서비스
  • 실시간 그룹 채팅으로 소통하며 경매를 진행할 수 있는 실시간 경매 서비스

나는 이커머스 웹 서비스를 제안했었고, 최종적으로는 실시간 경매 사이트를 구축하는 것으로 정했다.

그 이유는 팀원 모두 비동기 채팅 기능 개발에 대해 자세히 경험하지 못해서 관심이 높았고, 무엇보다 여러 기술 스택이라던지 해보지 않았던 것들을 부딪히며 시도해보자! 라는 생각이 선택의 가장 큰 이유였다.

본인도 채팅 기능에 대해 튜토리얼을 진행 해 본적은 있지만, API로 작성하는 과정은 겪어보지 못해서 채팅으로 실시간 경매를 진행할 수 있다는 아이디어가 가장 개발해보고 싶었다.


📌 프로젝트 핵심

프로젝트의 핵심은 실시간 그룹 채팅 기능으로 경매를 진행할 수 있다는 것이다.
핵심 요구사항은 다음과 같이 생각했다.

  • 가입을 한 사용자는 누구나 경매를 등록하거나 경매에 참여할 수 있다.
  • 경매 물품을 등록할 때 경매 시작 시간, 경매 마감 시간, 경매 시작 가격, 물품 소개를 작성할 수 있다.
  • 경매가 시작되면 그룹 채팅에 참여할 수 있고, 그룹 채팅 내에서 경매가 진행된다.
  • 참여한 사람들 중 가장 높은 금액을 채팅한 사람의 금액을 실시간으로 확인할 수 있다.
  • 경매가 마감되면 가장 높은 금액을 제시한 사람과 판매자가 연결되어 1:1 채팅방으로 소통할 수 있다.
  • 판매자는 판매를 결정할 수 있고, 만약 판매하지 않을 시 패널티가 부과된다.
  • 낙찰된 사용자는 3일 이내에 결제를 해야하고, 결제하지 않을 시 패널티가 부과된다.

이 외의 추가 기능들의 요구사항도 많지만 실시간 경매에 대한 핵심 요구사항은 이렇게 구성했다.


📝 결정 사항

팀원 모두 새롭게 도전하는 것에 대한 두려움은 없었다! (이런 점이 마음에 들었다)

그래서 사용해보지 않았던 것을 위주로 사용하는 것을 제안했고, 결과적으로 팀원과 회의를 거쳐서 Django와 MongoDB를 사용하고, CI&CD까지 구축해보는 것으로 정했다.

MongoDB는 NoSQL로 여태까지 써 본 RDBMS와는 다른 DB이며 사용해보지 않았고, CI & CD 경험도 해보고 싶었는데 팀원 모두 의견에 동의해줘서 고마웠다.

현재까지 팀 프로젝트의 진행 상황은 요구사항 상세화 하기, ERD 작성하며 MongoDB 설계 하기, 역할 배분이다.

💡 회의를 거친 결과물

  • 요구사항, 아이디어 이해를 돕기 위한 Figma 화면 구성

  • DB ERD 설계

  • DB ERD 참고하여 MongoDB 도큐먼트 설계 (너무 길어져서 내가 맡아 작성한 부분만 올렸다.)

Auctions
{
   "id" : ObjectId(),
   "auction_user_id" : ObjectId(), // users 컬렉션 id 참조
   "chat_name" : String, 
   "created_at" : ISODate()
}


Chatters
{
  "id" : ObjectId(),
  "auction_id" : ObjectId(), // auctions 컬렉션 _id 참조 
  "user_ids": [ObjectId()], // 참여한 user들의 id를 배열로 저장 (users 컬렉션 id 참조)
  "offer_prices": [NumberInt()] // 각 사용자가 제안한 가격 배열로 저장, user_ids와 인덱스를 맞춰서 사용 가능하게 함.
}

Chattings
{
  "id" : ObjectId(),
  "auction_id": ObjectId(), // auctions 컬렉션 id 참조 
  "messages": [
     {
       "sender_id": ObjectId(), // 메시지 보낸 사람 id (users collection id 참조)
       "message_type": String, // 판매자(seller) 또는 구매자(buyer) 메시지인지 표시  
       "content": String, // 메시지 내용
     },
     ...
   ]
}

📋 회고

이제 각자 역할 배분하여 맡은 부분을 개발하고 있는 상황이고, 1:1 채팅, 마음에 드는 경매를 담는 wishlist 기능 구현을 담당하게 되었다.

매일 회의를 진행해서 일정을 지키는게 힘들텐데 다들 잘 지켜주는 것 같아서 고맙고, 서로 의문점을 공유하고 고민하는 점이 좋았다. NoSQL을 다들 처음 경험해봐서 어려움이 있겠지만, 다같이 어려움을 공유해가며 함께 성장하고! 프로젝트도 계획한대로 잘 완성되었으면 좋겠다.

profile
발전하는 꿈나무 개발자 / 취준생

0개의 댓글