날짜 | 내용 |
---|---|
2024.06.21 ~ 2024.06.28 | 프로젝트 계획 및 준비 |
2024.06.24 ~ 2024.07.03 | 백엔드 설계 및 구현 |
2024.06.24 ~ 2024.07.22 | 데이터 크롤링, 데이터 처리, 모델 설계 및 구현 |
2024.07.10 ~ 2024.07.31 | Airflow ETL 프로세스 설계 및 구현, MWAA 환경 구성 |
2024.08.01 ~ 2024.08.08 | Lambda 함수 작성, 모델 배포 및 API 연결 |
2024.07.22 ~ 2024.08.12 | Springboot 배포 및 운영, React 개발 및 배포 |
구성원 | 깃허브 주소 | 역할 |
---|---|---|
이수형 | https://github.com/kisoo4362 | 데이터 엔지니어링, 데이터 수집, 프론트 |
김나영 | https://github.com/nayoung16 | 백엔드, 프론트, 데이터 엔지니어링 |
백승민 | https://github.com/wkflzn | ML, 프론트 |
이석희 | https://github.com/seokkies | 데이터 수집, 백엔드, 프론트 |
- 사용자들이 자신의 캠핑 스타일에 맞는 캠핑장을 쉽게 찾고, 캠핑 계획을 보다 체계적으로 관리할 수 있도록 돕는 것을 목적으로 합니다.
- 사용자 개개인의 취향과 라이프스타일에 맞춘 캠핑장 추천을 통해 만족도 높은 캠핑 경험을 제공하며, 계획을 캘린더에 추가함으로써 더욱 효율적이고 즐거운 캠핑을 지원합니다.
- Language : Python, Java, Javascript, SQL
- Frontend : React.js, Node.js
- Backend : SpringBoot, JPA, Spring Security
- Data Engineering : Apahce Airflow, AWS Lambda
- Infra : Docker, MWAA
- CI/CD : Github Actions, AWS Codedeploy
- Storage : MySQL, RDS, S3
- Data : Pandas, Numpy, Selenium, Beautifulsoup
- ML : Scikit-learn, Tensorflow, KoNLPy
- 에어플로우를 통해 데이터를 수집하고, S3에 데이터를 저장하고 이후 MySQL에 적재
- Lambda를 사용하여 모델 결과를 Springboot에서 받아와 DB, React로 전송하도록 설계
- React와 Springboot는 같은 EC2 서버 내에 배포
고캠핑 데이터의 캠핑장 주소를 기준으로 네이버 플레이스 리뷰 크롤링 진행
Beautifulsoup, Selenium 사용
- 일주일 간격으로 고캠핑 데이터(캠핑장 정보)를 갱신
- 받아온 데이터를 캠핑 기본정보, 기타정보 테이블로 나누어 적재
- 단기예보와 중기예보의 행정구역의 범위가 일치하지않아, 구역을 똑같이 맞춰줘야하는 과정 진행
- 행정구역 범위를 확대시켜, 각 도의 주요 도시를 기준으로 하여 행정구역을 지정
- 데이터 갱신은 하루마다 진행하며, 갱신 방법은 기존 데이터를 전부 제거하고, 새로 갱신된 데이터만 저장
- 중기육상예보조회에서 3~10일 데이터 중 7일까지의 날씨 예보 데이터를 선정
- 중기기온조회 3~10일 데이터 중 7일까지의 예상 최고기온, 최저기온 데이터를 선정하여 사용
- 데이터 형식을 일별로 row 형태로 저장하였으며, 갱신은 오늘 기준 3일~7일 이후의 데이터만을 받아 데이터의 무분별한 증가를 방지
- 사용 모델 : Logistic Regression
- 캠핑 스타일별로 정답지를 생성해두고, 질문에 대한 사용자 답변을 받고 그 값을 숫자로 변환
- 스타일 별 가중치와 비교하여 지정해 둔 스타일별 값과 가장 근접한 캠핑 스타일을 추천
- 캠핑 스타일 + 환경, 활동, 지역 선택을 통해 캠핑장 추천
- 토큰화하여 형태소 분석을 진행하여 네가지 컴포넌트와 캠핑장 정보와의 유사도로 가중치를 부여
- 추천받을때마다 다양한 캠핑장이 나올수 있게 하기 위해 상위 10개 캠핑장 중 랜덤으로 5개 추출
- 크롤링한 네이버 리뷰 데이터를 불용어 처리 및 토큰화를 통해 리뷰에 대한 텍스트 분석을 진행한 후 분석한 내용을 기반으로 긍부정도를 나누어 자체 별점을 수치화
- 사용자가 키워드를 선택하면, 리액트에서 스프링부트로 키워드들이 전달되고 rds에 저장
- 동시에 람다함수가 트리거되어 갱신된 고캠핑 데이터를 rds에서 읽어오고, 미리 학습된 스타일 추천 모델 pkl 파일을 s3에서 읽어옴
- 스타일 추천 모델을 통해 캠핑 스타일이 먼저 예측되고, 이 스타일과 사용자 선택 키워드들을 통해 캠핑장들이 추천되어 다시 스프링부트를 통해 리액트로 전달되는 구조
- 초기에 fastapi로 ML 서버를 구축하고 새로운 EC2에 올리려고 계획하였음
- 서버리스 환경으로 구현하므로써 RDS, S3 등의 AWS 서비스들과 더욱 좋은 접근성을 가지고, 서버 비용을 절약할 수 있었음
- 람다함수를 트리거하기 위해 API Gateway를 사용하여 백엔드와 연결함
- ML 학습 환경을 구성하기 위해 람다 레이어를 사용
- 람다에서 레이어에 사이킷런, 텐서플로 등의 모듈을 올리기 위한 레지스트리 서비스가 필요해 ECR을 사용
- main 브랜치에 push가 생기면, github actions에서 작성한 배포 스크립트에 따라 프로젝트를 빌드하고, 빌드된 프로젝트를 s3에 저장합니다.
- Codedeploy에 빌드된 프로젝트 배포 명령을 내리고, Codedeploy는 도커 이미지를 빌드하여 EC2 서버에 배포합니다.
- Github secrets에서 aws iam 사용자 키를 관리하고, application.properties 파일은 base64로 인코딩하여 관리했습니다.