'리뷰왕' 서비스 서버 개발 후기 (Flask, MySQL, Docker, AWS 사용)

Jihun Kim·2021년 10월 20일
1

프로젝트

목록 보기
1/3
post-thumbnail

목차

  1. 개발 배경
  2. 기술 스택
  3. 어려웠던 점과 해결 방법
  4. 웹 서비스 소개

1. 개발 배경

어느 플랫폼을 믿어야 할까...?

그동안 저는 음식점을 검색할 때 주로 '네이버 지도'를 이용해 왔습니다. 그런데 막상 가보면 기대했던 맛과 서비스와는 다른 경우가 종종 있었습니다. 그러던 중 제 친구는 '카카오 맵'을 사용한다는 것을 알게 되었는데 두 플랫폼 간의 리뷰 평점이 생각보다 꽤 다르다는 것을 알게 되었습니다.

(위에부터 차례대로 네이버, 카카오, 식신에서 제공하는 한 식당에 대한 평점 정보입니다.)


이에 저는 어느 플랫폼을 믿어야 맞을 지를 생각해 보았고, 각 사이트별 리뷰 정보를 크롤링 해온 다음 비교할 수 있도록 유저에게 제공한다면 유저는 더욱 합리적인 선택을 할 수 있을 것이라는 결론을 내리게 되었습니다.

따라서 저는 Django를 프레임 워크로 하여 '유저의 입력이 있을 때마다' 리뷰를 크롤링 하고 그 정보를 제공하는 웹 서비스를 만들고자 했습니다.


그러나....


수 많은 리뷰 데이터를 어떻게 유저에게 제공해야 할까?


혼자 크롤링하며 헤매던 중 겨우겨우 네이버와 카카오 리뷰 데이터를 크롤링하는 데 성공하여 날짜별 리뷰 추이를 분석하고 워드 클라우드를 만들어 보며 분석을 해보았습니다.

그러나 데이터는 방대했고, 리뷰를 크롤링을 자동화 하기 위해 사용했던 selenium은 매우 느렸습니다. 이에 저는 분석 해본 것으로 만족하기로 하고 끝을 냈습니다.



팀으로 프로젝트를 완성할 기회가 생겼다.


엘리스 AI 트랙에 참여해 교육을 받던 중 팀 프로젝트를 할 기회가 생겼고, 저는 팀으로 한다면 혼자 하려던 '리뷰 비교 분석 서비스'를 완성할 수 있지 않을까 생각했습니다. 다행히 모든 팀원들이 제 아이디어에 동의했고 그렇게 프로젝트를 시작하게 되었습니다.


2. 기술 스택

프론트엔드

  • 프레임워크: React
  • 라이브러리: React-Router-DOM, React-Helmet, React-Scroll
  • 스타일: scss

백엔드

  • 프레임워크: Flask
  • 데이터베이스: Flask-SQLAlchemy, Flask-Restful, MySQL
  • DevOps: Docker, EC2, RDS

데이터 분석

  • 라이브러리: Numpy, Pandas, Matplotlib, Folium, Wordcloud, KoNLpy, parmap

저는 이 중 백엔드를 맡았습니다.


3. 서비스 소개

'리뷰왕' 서비스는 엘리스 교육장 주변인 선릉역 인근의 음식점 데이터를 제공합니다.

서비스 주소 👉 리뷰왕 서비스로 이동하기
깃허브 주소 👉 ReviewKing Github

실제 개발은 깃랩에서 진행하였고, 개발 마무리 후 개인 별 깃허브로 클론하여 가져 왔습니다.


리뷰 결과 페이지


업종별 순위 페이지

오늘 뭐 먹지? 페이지


4. 어려웠던 점과 해결 방법

AWS에 Docker container 이용 서버 배포하기

엘리스에서 VM을 제공해 주었는데, docker container를 생성해 사용하는 데는 다른 설정이 필요했습니다. 이 때문에 백엔드의 경우 AWS의 EC2에 도커 컨테이너를 생성해 배포를 진행하기로 했습니다.

진행은 아래와 같이 이루어졌습니다.

  • 작업 영역의 최상위 디렉토리에 Dockerfile 생성
  • 로컬에서 Docker build 후 docker repository로 push
  • EC2에 image pull and build -> run(container 생성)


프로젝트 시작 전 간단한 사용 방법만 익힌 정도여서 막상 적용해 보려니 너무 어려웠고 이걸 왜 좋다고 하는걸까 싶었는데 써보니 로컬 환경을 가상 머신에 그대로 가져갈 수 있어서 너무 편했습니다.


RDS 생성

처음에는 mysql 역시 container를 생성해 사용하려 하였으나, 용량 문제도 있거니와 이 방법은 많이 사용되는 방법이 아니라는 것을 알게 되었습니다. 더 좋은 방법은 AWS에서 제공하는 RDS를 이용하는 것이었습니다. 이를 이용하면 전 팀원이 제 로컬에 있는 mysql이 아니라 외부 port로 접근하도록 할 수 있었고 용량 문제도 해결이 가능했습니다.
RDS로 접근할 IP 주소도 정할 수 있고 권한도 설정해 줄 수 있어서 좋았습니다.


Flask Timeout error

배포를 하고나니 아래와 같은 오류 메시지를 마주하게 되었습니다.

sqlalchemy.exc.TimeoutError: 
QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30.00 

이는 Queuepool의 pool_size 설정이 필요한 문제였고 이용자 수를 고려해 pool_size를 정할 수 있었습니다. 처음에는 500 정도로 해 놓았었는데 개발하면서 계속 프론트에서 api 요청을 하다 보니 500을 훌쩍 넘어 버렸습니다(이와 함께 프론트에서 페이지를 한 번 열 때 3 번의 요청이 한꺼번에 왔던 문제도 있었는데 잘 해결하였습니다.). 그래서 결국 20000으로 사이즈를 키웠고 아무 문제 없이 잘 진행할 수 있었습니다.





초보 개발자라 아직 부족한 점이 많습니다. 😭 혹시 틀린 부분이 있거나 더 좋은 개발 방법이 있으시다면 공유 혹은 지적 부탁드립니다. 긴 글 읽어 주셔서 감사합니다!

🖋 참고해 주세요!
글쓴이 깃허브 주소
문의 메일 보내기

profile
쿄쿄

0개의 댓글