여기어때 프로젝트 후기

SEUNGCHAN BAEK·2021년 6월 17일
0

TIL

목록 보기
14/15
post-thumbnail

프로젝트 소개

종합숙박 O2O서비스 '여기어때'를 모티브로 한 프로젝트

개발 기간 : 2021.04.26 ~ 2021.05.07
팀 명 : 야, 여기어때(BetterChoice)
팀 인원 : 6명
프론트엔드 : 김효진, 박단비, 박성은
백엔드 : 백승찬, 신지원, 황수민

백엔드 깃허브 주소 : https://github.com/poketsc/19-2nd-betterChoice-backend

기술스택

Framework

  • Django

Language

  • Python

DB

  • Mysql
  • RDS

Communication

  • Github
  • Slack
  • Trello
  • Notion

배포 및 통신

  • EC2
  • Docker
  • Postman
  • httpie
  • JSON

ERD

  • AqueryTool

Trello 와 Notion을 이용한 의사소통

Trello

Notion

ERD

URL : https://aquerytool.com:443/aquerymain/index/?rurl=9f3b4eae-ec1e-475c-b6aa-ccc73c62ed70
password : i706x8

우리팀이 구현한 Endpoint

내가 한 일

  • 회원가입 시 핸드폰 인증(네이버 클라우드) 기능 구현
  • 회원가입 기능 구현 (bcrypt를 이용한 비밀번호 해싱 후 저장)
  • 로그인 기능 구현 (jwt를 활용하여 인증 기능 구현)
  • AWS(S3)를 이용한 사진 업로드 기능 구현
  • 모든 구현 기능 unittest 완료
  • Docker 와 AWS(EC2)를 활용하여 배포

이번 프로젝트 목표

이번 프로젝트에서는 마켓컬리 프로젝트와는 다르게 많은 기능보다는 적은 기능이지만 소셜 기능과 unittest를 해보는것을 목표로 했다. 마켓컬리 프로젝트에서는 간단한 기능을 많이 해봤다면 이번 여기어때 프로젝트에서는 난이도가 조금 있는 기능들을 구현하려고 했다. 그래서 데이터모델링도 마켓컬리 프로젝트보다 훨씬 간단하게 구현했다. 마켓컬리 프로젝트와 똑같이 2주 프로젝트지만 unittest를 하기위해서 최대한 빠르게 데이터모델링을 끝내려고 했다.

재밌었던 api 기능

마켓컬리 프로젝트에서는 email로 비밀번호 찾기를 구현했었는데 핸드폰인증 기능을 구현해보면 재밌을것같아 구현해본 기능이다. 핸드폰 인증으로 네이버 클라우드를 선택한 이유는 가격이 저렴했기 때문이였고 100000만 포인트를 지급받아서 프로젝트를 하는데 있어서 사실상 무료로 사용할수 있었기 때문이다.

핸드폰 번호를 입력한후 핸드폰 인증버튼을 누르면 utils.py 에 직접만든 auth_number() 함수를 실행시켜 4자리의 난수를 받는다. update_or_create 메서드로 같은 핸드폰번호로 이미 데이터를 생성한적이 있으면
난수를 수정하고 데이터를 생성한적이 없으면 핸드폰번호와 생성된 난수로 인스턴스를 생성한다. 그리고 utils.py에 만들어진 send_sms() 함수를 호출하고 인자값으로 phone_number, 난수값을 입력한다. send_sms() 함수에서 URL,ACCESS_KEY,FROM_PHONE_NUMBER 등은 보안을 위해서 my_settings.py에 저장시킨후 불러왔다. make_signature() 와 send_sms() 함수는 네이버 클라우드에서 제공하는 api를 사용한것인데 그대로 사용하면 작동이 안된다. uri도 수정해야했고 몇번의 시행착오 끝에 실행 가능한 코드를 구현할수 있었다. 인증번호를 사용자에게 보낸후 사용자가 확인후에 인증번호를 입력하면 데이터베이스에 저장된 정보와 확인후에 일치하면 성공 메세지를 프론트에게 전달한다. 처음으로 구현해본 소셜 기능이였고 핸드폰으로 인증번호가 왔을때는 정말 신기하고 이게 진짜 되는구나라는 생각을 했다.

또다른 재밌었던 api 기능

마켓컬리 프로젝트에서는 사진업로드가 되지않는 글만 입력할수 있게 review api를 만들었었다. 이번 프로젝트에서는 사진업로드가 가능한 api를 구현해 보고 싶어 AWS(S3)를 사용해 보았다.

S3_CLIENT 에는 aws_access_key_id, aws_secret_access_key 등의 정보가 들어가 있는데 보안을 위해서 my_setting.py에 저장한 후 불러왔다. AWS_S3_BUCKET_NAME도 보안을 위해서 my_setting.py에 저장한 후 불러왔다. 사진을 한장이 아닌 여러장을 올릴수 있게 하기 위해서 리스트로 받은 값을 for문으로 처리해 하나하나 S3에 업로드 시켰다. S3에 업로드 후에 데이터베이스에 업로드된 이미지 url을 저장하기 위해서 url이 만들어지는 패턴을 이용해서 f-string으로 url을 만든후에 데이터베이스에 저장한다. f'https://{my_settings.AWS_S3_BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/{file.name}' 이때, 데이터베이스 hit을 최소화하고 속도를 향상 시키기 위해서 bulk_create를 사용했다.

나를 힘들게 했던 unittest!!!

처음 해본 unittest지만 외부 api가 필요없는 기능에서는 unittest가 어렵지 않았다. 하지만 외부 api를 사용해야하는 기능에서는 mocking 기법을 사용해야했다. 그 이유는 운영 환경 대비 제약이 많은 테스트 환경에서는 실제 데이터베이스와 연동하거나 실제 외부 API를 호출하기가 불가능한 경우가 많기때문이다. 가령 가능하더라도, 이렇게 외부 서비스에 의존하는 테스트는 해당 서비스에 문제가 있을 경우 깨질 수 있으며 실행 속도도 느릴 수 밖에 없다. mocking 기법을 사용하지 않으면 test인데 실제로 파일이 s3가 올라가거나 핸드폰인증에서 실제로 메세지가 전송된다. 따라서 단위 테스트를 작성할 때 외부에 의존하는 부분을 임의의 가짜로 대체하는 기법이 자주 사용되는데 이를 mocking 이라고 한다. 다시 말해, 모킹(mocking)은 외부 서비스에 의존하지 않고 독립적으로 실행이 가능한 단위 테스트를 작성하기 위해서 사용되는 테스팅 기법이다. 특히 s3를 이용해야하는 기능에서는 mocking 기법도 사용해야하고 multipart form data로 데이터를 받아야해서 unittest 하는데 가장 어려웠던 부분이였다. Multipart form data로 값을 전달받는 과정에서 정말 많은 시행착오가 있었다. 위 코드는 이렇게 많은 시행착오 끝에 만들어진 unittest중에 여러개의 사진을 올렸을때 성공하는 테스트이다.

느낀점

BetterChoice의 PM으로써 부족한점이 많았지만 팀원들의 밝은 에너지가 있어서 잘 마무리 할수 있었던것 같다. 팀원들을 많이 도와드리고 싶었지만 나도 처음해보는 기능들이여서 절대적인 시간투자가 필요했다. 특히 수민님, 질문에 대한 제대로된 답변을 드리지 못해 죄송해요!!! 2차 프로젝트라서 더 많이하고 잘할수 있었을것만 같았는데 역시 새로 해야되는 추가사항들이 있었다. unittest,docker,외부 api.... 어려웠지만 기능들이 마켓컬리 프로젝트에 비해 훨씬 재미었다. 특히 핸드폰인증 성공했을때 자랑하려고 사람들에게 핸드폰번호 물어봤었던 기억이 있다. 개발을 하면서 불가능한것은 없다고 느낀다. 다만 익숙하지 않을뿐이라고 생각한다. 이번 프로젝트를 통해서도 많이 성장한것 같아서 뿌듯하다.

profile
백엔드 개발자가 되는 그날까지

0개의 댓글