다독샵을 만들어가면서...
지난 3월달부터 진행한 다독이 챌린지가 막을 내렸다. 다독이 챌린지를 회상하며 내가 개발한 다독샵에 대한 피드백 시간을 가지려고 한다.
다독샵을 만들게 된 계기
다독다독에서 3월14일부터 2주간 진행할 다독이 챌린지를 기획했다. 챌린지를 함께 기획하면서, 해결해야 할 과제들이 있었는데 내가 해결할 과제가 있을지 추려본 결과 다음과 같은 리스트를 뽑았다
- 일별로 챌린지를 완수한 사람 체크하기
- 협찬 물품 지급 방안
1. 일별로 챌린지를 완수한 사람 체크하기
챌린지를 완수한 사람에 대한 데이터는 다독다독에서 중요하게 체크해야할 데이터였다. 우리가 목표로 세운 챌린지 성공인원은 총 100명으로, 챌린지를 진행하는 기간에는 이 챌린지를 성공한 사람이 몇명이냐에 따라 이벤트를 추가로 열어서 일일 면제권을 지불하는 등의 방법을 간구해야 했기 때문에 매일마다 해당 데이터를 갱신하여, 몇명이 현재 챌린지에 참여하고 있는지에 대한 데이터를 확인해야 했다.
2. 협찬 물품 지급 방안
8개의 협찬사에서 약 648만원 규모의 물품을 전달하기로 하였다. 해당 물품들 중 1개를 챌린지를 성공한 사람이 가져가야 하는데, 문제는 가격이 천차만별이었다. 10000원짜리 상품부터 시작해서 79000까지 상품의 가치가 제각각이었다. 뿐만 아니라, 상품의 수량도 일정하지 않아서 이부분에서 부득이하게 이용자들에게 선착순으로 지급하는 방안을 채택하게 되었다.
문제는 100명정도 되는 사람들에게 어떻게 하면 선착순으로 전달할 수 있을까였다.
해결방안
이용자 데이터 저장
sqlalchemy를 이용하여 model 구조를 짜고 model을 기반으로 alembic을 활용하여 mysql db테이블을 생성하였다.
초기 설문지를 바탕으로 이용자 데이터 약 300여개를 수집하였고, 초기 설문지에서 받은 정보 중 이름의 ASCII코드와 전화번호 뒷자리를 조합하여 이용자들의 id를 만들었다.
챌린지 성공 여부 저장
challange_logs 테이블에 일차마다 챌린지 성공여부를 저장했다. 엑셀파일에 저장된 raw data를 batch파일 내부에서 전처리과정을 거쳐, local에서 띄운 서버의 API를 요청하여 챌린지 성공 여부를 저장하였다.
# app/batch/challange_exe.py
import requests
import pandas as pd
import idgen
df = pd.read_excel('data.xlsx', index_col=None)
def is_exist_user(user_name, bpn):
r = requests.get(f'http://localhost:8000/user?user_name={user_name}&back_phone_number={bpn}')
if r.status_code==200:
return True
else:
return False
def insert_user(user_name, bpn):
data = {'user_name': user_name, 'back_phone_number': bpn}
r = requests.post('http://localhost:8000/user', json=data,
headers={"Content-Type": "application/json; charset=utf-8"})
print(r.text)
def create_challange_log(challange_id, user_id, now_date, status, link=None, is_duplicate=False):
data = {
'challange_id': challange_id,
'user_id': user_id,
'now_date': now_date,
'status': status,
'link': link,
'is_duplicate': is_duplicate
}
r = requests.post('http://localhost:8000/challange/participate', json=data,
headers={"Content-Type": "application/json; charset=utf-8"})
if __name__=="__main__":
now_date = input("날짜(2022-xx-xx): ")
status = input("상태(SUCCESS/FAIL/EXCEPT): ")
challange_id = int(input("챌린지 ID: "))
for index, row in df.iterrows():
user_name = row['user_name']
user_name = user_name.replace(" ", "")
bpn = str(row['back_phone_number'])
bpn = bpn.replace(" ", "")
if len(bpn) != 4:
bpn = '0'*(4-len(bpn))+bpn
user_id = idgen.id_generator(user_name, bpn)
if not is_exist_user(user_name, bpn):
insert_user(user_name, bpn)
if status=="EXCEPT":
create_challange_log(challange_id, user_id, now_date, status)
else:
link = row['link']
create_challange_log(challange_id, user_id, now_date, status, link)
다독샵 개설
다독이 챌린지가 일주일을 넘긴 시점부터 협찬 물품의 구체적인 수량 및 협찬 물품 종류가 확정이 났다. 협찬 물품을 챌린지 성공자들에게 전달하기 위해 물품을 선착순으로 지급하는 방안으로 결정되었고, 협찬 물품을 지급하기 위해선 아래와 같은 조건들을 만족해야만 했다.
- 챌린지를 성공한 사람에 한해서만 지급 (DB연동)
- 한정된 수량의 물품을 정확하게 떨어지게 지급
- 업체에게 물품을 선택한 사람들의 명단 전달
다음의 후보군들을 표로 정리해보았다
위의 충족요건들을 모두 만족하는 선택지는 다독샵을 직접 개설하는 것이었다. 문제는 챌린지 완료 시점인 28일 안에 개발을 끝내고 30일 안에 배포작업이 완료되어야 했다. 개발 시점은 다독이 챌린지 9일차인 22일(화)이었고, 마감기간 안에 끝내기가 어려웠다.
협업 진행
이 문제를 해결하기 위해 내부 환경에 중심을 두어 생각해보기로 했다.
- API 개발 및 서버 배포
다독이 챌린지를 8일차까지 진행하는 동안, 유저의 데이터들을 관리하기 위해 FastAPI를 활용하여 몇가지 API를 만들어 두었고, 클라이언트가 사용하기 위해 AWS를 활용한 서버 배포를 하였다. 이를 통해 이용자가 챌린지를 몇번 완료했는지와 같은 정보를 전달하였다. 다독샵과 관련한 추가적인 API를 만드는데 소요되는 기간은 대략 2~3일 정도일 것 같았다.
-
다독샵 디자인
다독샵에 들어갈 메인페이지를 간단하게 피그마를 통해 제작하였다.
예상되는 총 페이지는 7페이지 안쪽이였고, 예상 소요기간은 1일정도였다. -
프론트엔드
프론트엔드쪽에서는 작업을 별도로 해두지 않았고, 혼자서 작업할 경우 약 7~8일 소요 예상
위의 작업량을 기반으로 보았을 때 프론트엔드에 쏟을 시간이 절대적으로 부족했다. 때문에 프론트엔드를 도와줄 사람을 구했고, 숨고를 통하여 견적을 비교해보았다.
순수한 기획안을 바탕으로 소프트웨어 개발쪽에 견적요청을 넣었을 때 500만원의 견적이 나왔다. 터무니 없는 가격이 책정이 되어 유지보수 측에 견적을 비교해본 결과, 80만원정도의 가격이 나왔다. 학교 측 예산을 집행하기엔 너무 큰 금액이었다
결국 프로그래밍/코딩 레슨 분야로 견적을 요청하였고, 직접 연락을 하여 다음의 부분을 제공하기로 하였다.
- 기획 페이지 5페이지 이내
- API 제공
- 웹 배포
순수하게 프론트엔드 작업 부분을 맡고 같이 협업을 진행한다 하였을 때, 9만원의 견적이 나왔다. 해당 금액은 학교측에 교육비 예산으로 처리 가능했다!!!
(협업 진행 관련 사진)
다독샵 배포 결과
대망의 31일이 되었고, 완독이들을 대상으로 홈페이지를 열었다. 해당 홈페이지에서 상품을 고를 수 있는 시간을 저녁 6시로 잡았고 6시 정각에 유저에게 티켓을 발급하였다.
결과는??
대 망 이었다 ㅠ
난생 처음 겪는 트래픽 문제라 처음에는 서버를 키우면 해결될 문제라 생각했다.
하지만 서버를 키우고 7시에 열었을 때도 마찬가지 문제가 발생하였고, docker-compose logs를 확인한 결과 nginx 웹서버의 timeout에러를 발견했다.
(예시 사진 참조: https://stackoverflow.com/questions/44675435/504-error-with-nginx-and-flask-docker-containers)
문제 해결 방법
서버 터질 당시에는 내 멘탈도 같이 터졌고, 상품 지급 관련하여 팀원들과 수습하는 것이 중요했기에 방법을 찾을 수가 없었다.
어느정도 정리가 된 후에 해당 문제의 해결책을 찾아본 결과,여러가지 해결 방안들을 찾을 수 있었고 그 중 몇가지가 가능성이 있어보였다.
-
nginx conf time-out 시간 늘리기
[참조] https://kinsta.com/blog/504-gateway-timeout/
-
aws Elastic Load Balancer 활용
출처: 아마존 aws -
aws lambda 사용
느낀점
사이트 배포를 난생 처음 해보았고 배포까지는 무사히 마쳐서 기뻤다. 사이트 배포 뿐만 아니라 이후에 서버를 ScaleUp할지 ScaleOut할지와 같은 결정을 어떤 상황에서 내려야 하는가에 대한 고민들도 같이 해볼 수 있어서 힘들었지만 그만큼 많이 배웠던 프로젝트였다.
내가 자청해서 직접 사이트를 만들겠다고 결정했고 그 결과가 좋지 않아서 팀원들에게 많이 미안했다. 선착순이라도 100명 정도는 감당할 수 있지 않을까? 하는 확실하지 않은 판단을 내렸던 것이 원인이었던 것 같다. 다음에는 이런일이 발생하지 않도록 보다 꼼꼼하게 더 논리적으로 판단을 내려야겠다.
Author And Source
이 문제에 관하여(다독샵을 만들어가면서...), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mivv/다독샵을-만들어가면서저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)