- 하루 삼시세끼, “오늘 점심 뭐 먹지?” 고민해 본 사람들이 고민하는 사람들을 위해 만들어 보는 웹 서비스
- 주제 : 점심 추천 웹 서비스 (for 직딩, 일반인)
- 기간 : 2022.06.03 (금) ~ 2022.06.13 (월)
- Team : 김선민 (Github), 김민기 (Github), 박재현 (Github), 황신혜 (Github)
Schedule Management : Git Project Link, 간트차트 Link
API Design : Notion-link
- main : LocalHost 실행 branch
- publish : EC2 Hosting 실행 Branch
$ pip install -r requirements.txt
$ python recommandtion/crawling.py # Crawing Data
$ python auto_publish.py # Data Migrations & Run Server
$ python auto_db_insert.py # Insert Restaurant DB
# publish branch version
$ sh auto_delete_db.sh
$ sh auto_publish.sh
- 요기요 홈페이지 카테고리별 음식점 데이터 크롤링 (python crawling.py)
- 생성된 restaurant_OO.csv 파일 (OO 부분은 카테고리, 50개의 음식점 정보 저장)들 합쳐서 최종 restaurant.csv 생성
- (main Branch)
python auto_publish.py
하여 migrations, migrate 진행 - (main Branch)
python auto_db_insert.py
하여 크롤링 데이터(restaurant.csv)들 DB에 저장 - (publish branch)
sh auto_delete_db.sh
하여 migrations, sqlite3 db 초기화 - (publish branch)
sh auto_publish.sh
하여 DB Migrations 및 크롤링 데이터(restaurant.csv) DB 저장
┌─today_lunch
├── today_lunch // project
│ ├── urls.py
│ ├── settings.py // setting
│ └── ...
├── users // app
│ ├── models.py // DB Model - User
│ ├── views.py
│ └── ...
├── restaurant // app
│ ├── models.py // DB Model - Restaurant, Category
│ ├── views.py
│ └── ...
├── star // app
│ ├── models.py // DB Model - Star
│ ├── views.py
│ └── ...
├── mypage // app
│ ├── models.py // DB Model - Diary
│ ├── views.py
│ └── ...
├── recommandation
│ ├── crawling.py // Crawling
│ ├── db_uploader.py // Restaurant data insert
│ ├── recommand.py // User Based Recommandation
│ └── restaurant.csv // restaurant data
├── static
│ ├── css/ // css
│ └── img/ // images
├── templates
│ ├── init/ // Init Page
│ ├── users/ // Join, Login Page
│ ├── main/ // Main Page
│ ├── mypage/ // Profile Page
│ └── ...
│
├── db.sqlite3 // DB
├── manage.py // 메인
├── auto_db_insert.py
└── auto_publish.py
- 시작 페이지 회원가입, 로그인 페이지 이동
- 회원가입/로그인 기능
- 회원가입 vaildation
- 카카오지도 API를 이용한 주소 검색 기능
- 페이지 이동(홈, 평점페이지, 마이페이지, 로그아웃)
- 로그인 후 스코어링 페이지 이동
- 로그인 User 평점 이력 없는 음식점 5개 출력
- 음식점 마다 별 1개 ~ 5개 선택해서 평점 부여 및 저장
- '별점 저장하기' 클릭 시 평점 부여한 음식점들만 평점 등록됨
- '평가 그만하기' 클릭 시 메인 페이지로 이동
- 사용자 정보(이름, 주소) 출력
- 추천 컨텐츠 1) 오늘의 추천
- 어제 평점이 가장 높았던 음식점 1개 추천
- 추천 컨텐츠 2) '사용자님과 가장 유사한 OOO님의 추천 음식점입니다!'
- User-Baed Filtering을 이용한 나와 가장 비슷한 유저의 top 5 음식점 출력
- OOO님 클릭 시 유사도 팝오버 출력
- 추천 컨텐츠 3) '점심 뭐 먹지? TOP 5'
- 카테고리별 평균 평점이 가장 높은 음식점 TOP 5 (전체, 한식, 중식, 일식, 양식)
- 각 음식점들의 '상세보기'
- 네이버 지도에 해당 음식점 검색 결과 출력
- 점심일지 캘린더 형태 출력
- 점심일지 등록
- 빈 날짜 호버 시 '등록'버튼 출력, 클릭시 모달 출력
- 점심일지 등록 모달
- 음식점 선택 (+ 검색 가능)
- 별점 선택 (1 ~ 5)
- 등록 내용 바탕으로 DB Update 및 추천 알고리즘 Upgrade
- 점심일지 수정/삭제
- 등록된 점심일지 부분 클릭시 모달 창 출력
- 수정/삭제 내용 바탕으로 DB Update 및 추천 알고리즘 Upgrade
- 삭제 클릭시 해당 점심일지 삭제됨
- AWS EC2 이용한 외부 Publish 배포
- S3에 정적 이미지 파일들 관리 및 EC2에 Mount하여 구현
추천시스템이 작동하는 main 페이지 최초 접속 시 접속이 매우 느린상황 발생 (이후 이동은 캐시가 저장되어 빠르나, 새로운 회원, 캐시 없어진 경우 접속느림)
DB의 Star테아블의 데이터를 DataFrame으로 만들어서 이를 통한 추천을 해주는 과정에서 DB의 데이터가 쌓이면 쌓일수록 DataFrame을 생성하는 속도가 느려지는 것으로 확인
- Recommend 클래스를 정의하여 DataFrame을 init하는 함수와 실제 유사도를 계산하는 부분들을 나눠서 각각 함수화하여 main접속 시 유사도만 계산될 수 있도록하여 속도 개선
- 싱글톤 패턴을 이용하여 유사도 계산 시 하나의 인스턴스만 사용하여 리소스를 절약하도록하고 서버가 실행될 때 미리 해당 인스턴스를 생성하도록 init.py에서 클래스선언
- 해당 인스턴스를 현재 DB에 맞게 실시간으로 갱신 시켜주기 위해 Thread를 이용하여 10초마다 init()함수 실행되도록 설정
최초 서버가 실행될 때 이전보다 많은 시간이 소요되긴 하지만 클라이언트 입장으로써 접속지연같은 불편함을 개선할 수 있었다. 10초마다 갱신도 자연스럽게 되면서 서비스를 이용함에 있어서 접속 지연을 개선할 수 있었다.