🚩 서비스 한줄 소개
칵테일 추천 서비스 "고양이 바텐더와 대화를 통해 매일 자신의 기분에 따른 칵테일을 추천받고, 취향에 맞는 칵테일을 찾을 수 있는 추천 서비스 'Catale'"
🚩 기획 배경
- 최근 스타벅스, 투썸플레이스와 같은 시중 카페에도 칵테일 판매를 시작하는 것 등을 통해 사람들의 칵테일에 대한 관심도가 높아졌다는 것을 알 수 있습니다.
- 칵테일 바에 방문했을 때, 각 칵테일의 맛과 향, 재료, 도수 등을 메뉴판만 보고 알기 어렵다는 단점이 있었습니다.
- 칵테일에 대해 알아볼 수 있는 기존의 방식은 검색 또는 바텐더와의 대화였고, 이를 합친 새로운 서비스가 있으면 좋겠다고 생각했습니다.
🚩 기술 스택
| skills | |
|---|---|
| Backend | |
| Frontend | |
| Infra | |
| 모니터링 툴 | |
| 협업 툴 | |
| 디자인 |
- 지정된 감정색과 칵테일 색을 바탕으로 사용자의 오늘의 감정과 원하는 도수에 맞는 칵테일을 추천할 수 있습니다.
- 오늘의 칵테일을 확인하면 추천 받은 칵테일과 오늘의 일기를 볼 수 있고 추천 받은 칵테일과 비슷한 칵테일 리스트를 볼 수 있습니다.
- 각 칵테일은 칵테일의 맛, 도수, 설명 등의 상세 정보와 해당 칵테일의 리뷰를 남길 수 있습니다.
- 지도 탭에서 유성구에 있는 칵테일 바의 정보를 파악할 수 있으며 해당 칵테일 바에서 판매하는 칵테일 매뉴를 도수에 따라 확인할 수 있습니다.
- 검색탭에서 키워드 검색을 통해 원하는 칵테일을 찾거나 옵션 검색을 통해 설정한 옵션에 해당하는 칵테일을 찾을 수 있습니다.
🚩 프로젝트 확장성
Catale을 더욱 개선된 서비스로 발전시키기 위해 세 가지 확장성 또한 고려할 수 있습니다.
- 모델 학습 로직 개선
- 기존 사용자 이외 신규 사용자를 반영한 재학습 로직 추가 구현
- 서비스 지역 확대
- 대전 외 지역의 칵테일 바 정보 업데이트
- 제휴 가맹점 확보
- 칵테일 바와의 제휴를 통한 사용자 혜택 제공
Backend
📦src
┣ 📂main
┃ ┣ 📂java
┃ ┃ ┗ 📂com
┃ ┃ ┃ ┗ 📂catale
┃ ┃ ┃ ┃ ┗ 📂backend
┃ ┃ ┃ ┃ ┃ ┣ 📂domain
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂base
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜BaseEntity.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂cocktail
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜CocktailController.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CocktailGetLikeResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CocktailGetResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CocktailLikeListRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CocktailLikeResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CocktailListResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CocktailSimpleInfoDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CoctailMyreviewResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜GetMemberRecommendDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PreferenceDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜TodayCocktailRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜TodayCocktailResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂entity
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Cocktail.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂custom
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CocktailRepositoryCustom.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜CocktailRepositoryImpl.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜CocktailRepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CocktailService.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜RecommendApiService.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂diary
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜DiaryController.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DiaryGetRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DiaryGetResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DiaryMonthResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MoodCntResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂entity
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Diary.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂custom
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DiaryRepositoryCustom.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜DiaryRepositoryImpl.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜DiaryRepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜DiaryService.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂image
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageController.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MemberImageUpdateRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂entity
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Image.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂custom
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ImageRepositoryCustom.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageRepositoryImpl.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageRepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageService.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂like
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜LikeResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂entity
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Like.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂custom
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜LikeRepositoryCustom.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜LikeRepositoryImpl.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜LikeRepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜LikeService.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂member
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MemberController.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜EmailValidationRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜EmailValidationResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜LoginRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜LoginResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MemberInfo.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MemberInfoDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜NicknameDoubleCheckRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜NicknameRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PasswordRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PasswordValidationRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PostPreferenceRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜SignupRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂entity
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Member.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂custom
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MemberRepositoryCustom.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MemberRepositoryImpl.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MemberRepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MemberService.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂menu
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MenuGetResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂entity
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Menu.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂custom
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuRepositoryCustom.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MenuRepositoryImpl.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MenuRepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂review
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ReviewController.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ReviewGetRequestDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ReviewGetResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ReviewListResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂entity
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Review.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂custom
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ReviewRepositoryCustom.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ReviewRepositoryImpl.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ReviewRepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ReviewService.java
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂store
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreController.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreGetResponseDto.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂entity
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Store.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreRepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreService.java
┃ ┃ ┃ ┃ ┃ ┣ 📂global
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂annotation
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AccessToken.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Nickname.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂config
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MailConfig.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜QuerydslConfig.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜RedisConfig.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜S3Config.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜SecurityConfig.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜SwaggerConfig.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜WebConfig.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂entrypoint
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜JwtAuthenticationEntryPoint.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂exception
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂cocktail
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜CocktailNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂diary
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DiaryCreateException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DiaryDeleteException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜DiaryNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂email
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜FailedMessageTransmissionException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜InvalidAuthCodeException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂image
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜FileTypeIncorrectException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ImageFileNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ImageNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ImageRegisterException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageUpdateException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂jwt
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AccessTokenNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜RefreshTokenNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UnauthorizedAccessException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂member
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DuplicateEmailException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DuplicateNicknameException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜EmailNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜InvalidLoginAttemptException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜InvalidNicknameException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜InvalidPasswordException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MemberNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MissingPathVariableException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PasswordMismatchException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ProfileUpdateException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂review
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ReviewCreateException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ReviewDeleteException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ReviewListNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ReviewNotFoundException.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂filter
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜EmailVerificationFilter.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜JwtAuthenticationFilter.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜TokenExceptionFilter.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜TokenRefreshRequestFilter.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂format
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂code
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ApiResponse.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜FilterResponse.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂response
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ErrorCode.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ResponseCode.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂handler
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜GlobalExceptionHandler.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂initializer
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜RedisInitializer.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂interceptor
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜NicknameValidInterceptor.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂jwt
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂provider
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜TokenProvider.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜RefreshTokenRepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜TokenService.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜RefreshToken.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜TokenInfo.java
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂resolver
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AccessTokenArgumentResolver.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜NicknameValidArgumentResolver.java
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂util
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂cookie
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DevCookieUtil.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ProdCookieUtil.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CookieUtil.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜FilterUtil.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜RedisUtil.java
┃ ┃ ┃ ┃ ┃ ┗ 📜BackendApplication.java
┃ ┗ 📂resources
┃ ┃ ┗ 📜application.yml
┗ 📂test
┃ ┗ 📂java
┃ ┃ ┗ 📂com
┃ ┃ ┃ ┗ 📂catale
┃ ┃ ┃ ┃ ┗ 📂backend
┃ ┃ ┃ ┃ ┃ ┗ 📜BackendApplicationTests.java
Frontend
📦src
┣ 📂api
┃ ┣ 📂common
┃ ┃ ┗ 📜Token.jsx
┃ ┣ 📜Cocktail.jsx
┃ ┣ 📜Diary.jsx
┃ ┣ 📜Image.jsx
┃ ┣ 📜Member.jsx
┃ ┣ 📜Review.jsx
┃ ┗ 📜Store.jsx
┣ 📂assets
┃ ┣ 📂bartender
┃ ┃ ┣ 📜cocktail.png
┃ ┃ ┣ 📜emo1.png
┃ ┃ ┣ 📜emo2.png
┃ ┃ ┣ 📜emo3.png
┃ ┃ ┣ 📜emo4.png
┃ ┃ ┣ 📜emo5.png
┃ ┃ ┣ 📜emobox.png
┃ ┃ ┣ 📜고양이말풍선.png
┃ ┃ ┣ 📜꼬질냥.gif
┃ ┃ ┣ 📜연필.png
┃ ┃ ┣ 📜오늘의칵테일1.png
┃ ┃ ┣ 📜유저말풍선.png
┃ ┃ ┣ 📜자산8.png
┃ ┃ ┣ 📜종이비행기.png
┃ ┃ ┗ 📜파란말풍선.png
┃ ┣ 📂common
┃ ┃ ┣ 📜arrow1.png
┃ ┃ ┣ 📜arrow2.png
┃ ┃ ┣ 📜arrow3.png
┃ ┃ ┣ 📜arrow4.png
┃ ┃ ┣ 📜arrow5.png
┃ ┃ ┣ 📜card.png
┃ ┃ ┣ 📜check.png
┃ ┃ ┣ 📜close.png
┃ ┃ ┣ 📜diary.png
┃ ┃ ┣ 📜edit.png
┃ ┃ ┣ 📜like.png
┃ ┃ ┣ 📜logout.png
┃ ┃ ┣ 📜minus1.png
┃ ┃ ┣ 📜minus2.png
┃ ┃ ┣ 📜noneLike.png
┃ ┃ ┣ 📜noneStar.png
┃ ┃ ┣ 📜pentagon.png
┃ ┃ ┣ 📜plus1.png
┃ ┃ ┣ 📜plus2.png
┃ ┃ ┣ 📜profile.png
┃ ┃ ┣ 📜review.png
┃ ┃ ┣ 📜setting.png
┃ ┃ ┣ 📜star.png
┃ ┃ ┣ 📜store1.png
┃ ┃ ┣ 📜store2.png
┃ ┃ ┣ 📜store3.png
┃ ┃ ┣ 📜store4.png
┃ ┃ ┣ 📜store5.png
┃ ┃ ┣ 📜trash.png
┃ ┃ ┗ 📜웰컴.png
┃ ┣ 📂glass
┃ ┃ ┣ 📜glass1.png
┃ ┃ ┣ 📜glass2.png
┃ ┃ ┣ 📜glass3.png
┃ ┃ ┣ 📜glass4.png
┃ ┃ ┣ 📜glass5.png
┃ ┃ ┣ 📜glass6.png
┃ ┃ ┗ 📜glass7.png
┃ ┣ 📂guide
┃ ┃ ┣ 📜가이드1.jpg
┃ ┃ ┣ 📜가이드2.jpg
┃ ┃ ┣ 📜가이드3.jpg
┃ ┃ ┣ 📜가이드4.jpg
┃ ┃ ┣ 📜가이드5.jpg
┃ ┃ ┣ 📜가이드6.jpg
┃ ┃ ┗ 📜가이드7.jpg
┃ ┣ 📂icon
┃ ┃ ┣ 📜calA.png
┃ ┃ ┣ 📜calB.png
┃ ┃ ┣ 📜Clickno.png
┃ ┃ ┣ 📜Clickyes.png
┃ ┃ ┣ 📜homeA.png
┃ ┃ ┣ 📜homeB.png
┃ ┃ ┣ 📜IconInsta.png
┃ ┃ ┣ 📜IconMap.png
┃ ┃ ┣ 📜IconTel.png
┃ ┃ ┣ 📜IconTime.png
┃ ┃ ┣ 📜mapA.png
┃ ┃ ┣ 📜mapB.png
┃ ┃ ┣ 📜searchA.png
┃ ┃ ┣ 📜searchB.png
┃ ┃ ┣ 📜userA.png
┃ ┃ ┣ 📜userB.png
┃ ┃ ┣ 📜검색돋보기.png
┃ ┃ ┣ 📜동색.png
┃ ┃ ┣ 📜왕관.png
┃ ┃ ┣ 📜은색.png
┃ ┃ ┣ 📜이퀄라이저.png
┃ ┃ ┗ 📜체크이미지.png
┃ ┣ 📂lottie
┃ ┃ ┣ 📜Cocktail1.json
┃ ┃ ┗ 📜Cocktail2.json
┃ ┗ 📂store
┃ ┃ ┣ 📜럭키바.jpg
┃ ┃ ┣ 📜리케리케라운지.jpg
┃ ┃ ┗ 📜사막의하얀꽃.jpg
┣ 📂components
┃ ┣ 📂common
┃ ┃ ┣ 📜Box.jsx
┃ ┃ ┣ 📜Box.module.css
┃ ┃ ┣ 📜Container.jsx
┃ ┃ ┣ 📜Container.module.css
┃ ┃ ┣ 📜ContainerMain.jsx
┃ ┃ ┣ 📜ContainerMain.module.css
┃ ┃ ┣ 📜FileInput.css
┃ ┃ ┣ 📜FileInput.jsx
┃ ┃ ┣ 📜Header.jsx
┃ ┃ ┣ 📜Header.module.css
┃ ┃ ┣ 📜HeaderResult.jsx
┃ ┃ ┣ 📜Headerwb.jsx
┃ ┃ ┣ 📜Headerwb.module.css
┃ ┃ ┣ 📜Nav.jsx
┃ ┃ ┣ 📜Nav.module.css
┃ ┃ ┣ 📜Popup.jsx
┃ ┃ ┣ 📜Popup.module.css
┃ ┃ ┗ 📜ScrollToTop.jsx
┃ ┣ 📂data
┃ ┃ ┣ 📜base.jsx
┃ ┃ ┗ 📜searchtalk.jsx
┃ ┣ 📂diary
┃ ┃ ┣ 📜CocktailDetail.jsx
┃ ┃ ┗ 📜CocktailDetail.module.css
┃ ┣ 📂main
┃ ┃ ┣ 📜Cattalk11.jsx
┃ ┃ ┣ 📜Cattalk20.jsx
┃ ┃ ┣ 📜Cattalkbox.jsx
┃ ┃ ┣ 📜Cattalkbox.module.css
┃ ┃ ┣ 📜CocktailBox.jsx
┃ ┃ ┣ 📜CocktailBox.module.css
┃ ┃ ┣ 📜CocktailBox2.jsx
┃ ┃ ┣ 📜CocktailBox3.jsx
┃ ┃ ┣ 📜CocktailBox3.module.css
┃ ┃ ┣ 📜CocktailBoxBig.jsx
┃ ┃ ┣ 📜CocktailBoxBig.module.css
┃ ┃ ┣ 📜Cocktailsearchbox.jsx
┃ ┃ ┣ 📜Todaycocktail.jsx
┃ ┃ ┣ 📜Todaycocktail.module.css
┃ ┃ ┣ 📜Usercomment.jsx
┃ ┃ ┣ 📜Usercomment.module.css
┃ ┃ ┣ 📜Useremothree.jsx
┃ ┃ ┣ 📜Useremothree.module.css
┃ ┃ ┣ 📜Userreasonbox.jsx
┃ ┃ ┣ 📜Userreasonbox.module.css
┃ ┃ ┣ 📜Userselctbox.jsx
┃ ┃ ┣ 📜Userselctbox.module.css
┃ ┃ ┣ 📜Usertalkbox.jsx
┃ ┃ ┣ 📜Usertalkbox.module.css
┃ ┃ ┣ 📜Usertodayemo.jsx
┃ ┃ ┗ 📜Usertodayemo.module.css
┃ ┣ 📂map
┃ ┃ ┣ 📂data
┃ ┃ ┃ ┗ 📜markerData.jsx
┃ ┃ ┣ 📜map.jsx
┃ ┃ ┣ 📜map.module.css
┃ ┃ ┣ 📜Storebos.module.css
┃ ┃ ┣ 📜Storebox.jsx
┃ ┃ ┣ 📜StoreInfo.jsx
┃ ┃ ┣ 📜StoreInfo.module.css
┃ ┃ ┣ 📜Storemenu.jsx
┃ ┃ ┣ 📜Storemenu.module.css
┃ ┃ ┣ 📜Storepicture.jsx
┃ ┃ ┗ 📜Storepicture.module.css
┃ ┣ 📂my
┃ ┃ ┣ 📜MyFeel.jsx
┃ ┃ ┣ 📜MyFeel.module.css
┃ ┃ ┣ 📜ReviewItem.jsx
┃ ┃ ┗ 📜ReviewItem.module.css
┃ ┣ 📂review
┃ ┃ ┣ 📜Review.jsx
┃ ┃ ┗ 📜Review.module.css
┃ ┗ 📂search
┃ ┃ ┣ 📜Medallist.jsx
┃ ┃ ┣ 📜Medallist.module.css
┃ ┃ ┣ 📜Nonmedallist.jsx
┃ ┃ ┣ 📜Nonmedallist.module.css
┃ ┃ ┣ 📜Searchbase.jsx
┃ ┃ ┣ 📜Searchbase.module.css
┃ ┃ ┣ 📜Searchoption.jsx
┃ ┃ ┗ 📜Searchoption.module.css
┣ 📂pages
┃ ┣ 📂cocktailpage
┃ ┃ ┣ 📜CocktailDetailPage.jsx
┃ ┃ ┣ 📜CocktailDetailPage.module.css
┃ ┃ ┣ 📜CocktailReviewPage.jsx
┃ ┃ ┗ 📜CocktailReviewPage.module.css
┃ ┣ 📂commonpage
┃ ┃ ┣ 📜ErrorPage.jsx
┃ ┃ ┗ 📜ErrorPage.module.css
┃ ┣ 📂diarypage
┃ ┃ ┣ 📜DatePage.jsx
┃ ┃ ┣ 📜DatePage.module.css
┃ ┃ ┣ 📜DiaryPage.jsx
┃ ┃ ┗ 📜DiaryPage.module.css
┃ ┣ 📂mainpage
┃ ┃ ┣ 📂Emodata
┃ ┃ ┃ ┣ 📜Emocolor.jsx
┃ ┃ ┃ ┣ 📜Emotionthree.jsx
┃ ┃ ┃ ┗ 📜Reasonone.jsx
┃ ┃ ┣ 📂Talkdata
┃ ┃ ┃ ┣ 📜Cattalk.jsx
┃ ┃ ┃ ┣ 📜Selecttalk.jsx
┃ ┃ ┃ ┣ 📜Talkarr.jsx
┃ ┃ ┃ ┗ 📜Usertalk.jsx
┃ ┃ ┣ 📜MainPage.jsx
┃ ┃ ┣ 📜MainPage.module.css
┃ ┃ ┣ 📜ResultPage.jsx
┃ ┃ ┗ 📜ResultPage.module.css
┃ ┣ 📂mappage
┃ ┃ ┣ 📜MapPage.jsx
┃ ┃ ┣ 📜MapPage.module.css
┃ ┃ ┣ 📜StoreDetailPage.jsx
┃ ┃ ┗ 📜StoreDetailPage.module.css
┃ ┣ 📂mypage
┃ ┃ ┣ 📜ChangePreferencePage.jsx
┃ ┃ ┣ 📜ChangePreferencePage.module.css
┃ ┃ ┣ 📜LikedCocktailPage.jsx
┃ ┃ ┣ 📜LikedCocktailPage.module.css
┃ ┃ ┣ 📜MonthlyMoodPage.jsx
┃ ┃ ┣ 📜MonthlyMoodPage.module.css
┃ ┃ ┣ 📜MyCocktailPage.jsx
┃ ┃ ┣ 📜MyCocktailPage.module.css
┃ ┃ ┣ 📜MyPage.jsx
┃ ┃ ┣ 📜MyPage.module.css
┃ ┃ ┣ 📜RecommendPage.jsx
┃ ┃ ┗ 📜RecommendPage.module.css
┃ ┣ 📂settingpage
┃ ┃ ┣ 📜DeleteAccountPage.jsx
┃ ┃ ┣ 📜DeleteAccountPage.module.css
┃ ┃ ┣ 📜SettingsPage.jsx
┃ ┃ ┗ 📜SettingsPage.module.css
┃ ┣ 📜Choosecocktail.jsx
┃ ┣ 📜Choosecocktail.module.css
┃ ┣ 📜GuidePage.jsx
┃ ┣ 📜GuidePage.module.css
┃ ┣ 📜PreferencePage.jsx
┃ ┣ 📜PreferencePage.module.css
┃ ┣ 📜SearchPage.jsx
┃ ┣ 📜SearchPage.module.css
┃ ┣ 📜SignInPage.jsx
┃ ┣ 📜SignInPage.module.css
┃ ┣ 📜SignUpPage.jsx
┃ ┣ 📜SignUpPage.module.css
┃ ┣ 📜WelcomePage.jsx
┃ ┗ 📜WelcomePage.module.css
┣ 📂store
┃ ┣ 📜useCocktailStore.jsx
┃ ┣ 📜useSearchStore.jsx
┃ ┗ 📜useUserStore.jsx
┣ 📜App.css
┣ 📜App.jsx
┣ 📜index.css
┣ 📜index.jsx
┣ 📜Main.jsx
┣ 📜service-worker.js
┗ 📜serviceWorkerRegistration.js
FastAPI
📦recommend-server
┣ 📂.idea
┃ ┣ 📂inspectionProfiles
┃ ┃ ┗ 📜Project_Default.xml
┃ ┣ 📜.gitignore
┃ ┣ 📜misc.xml
┃ ┣ 📜modules.xml
┃ ┣ 📜recommend-server.iml
┃ ┗ 📜vcs.xml
┣ 📂app
┃ ┣ 📂common
┃ ┃ ┣ 📂context
┃ ┃ ┃ ┗ 📜ItemFeatures.py
┃ ┃ ┣ 📜config.py
┃ ┃ ┗ 📜__init__.py
┃ ┣ 📂models
┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┣ 📜data_class.py
┃ ┃ ┃ ┗ 📜__init__.py
┃ ┃ ┣ 📂save
┃ ┃ ┃ ┣ 📜catale_dataset.pkl
┃ ┃ ┃ ┣ 📜cocktail - 복사본.csv
┃ ┃ ┃ ┣ 📜cocktail.csv
┃ ┃ ┃ ┣ 📜cocktail_features.csv
┃ ┃ ┃ ┣ 📜cocktail_index.csv
┃ ┃ ┃ ┣ 📜fdsfsd.txt
┃ ┃ ┃ ┣ 📜item_features - 복사본.csv
┃ ┃ ┃ ┣ 📜item_features.csv
┃ ┃ ┃ ┣ 📜rating.csv
┃ ┃ ┃ ┣ 📜test_ratings.csv
┃ ┃ ┃ ┣ 📜train_ratings.csv
┃ ┃ ┃ ┣ 📜user_features - 복사본.csv
┃ ┃ ┃ ┣ 📜user_features.csv
┃ ┃ ┃ ┣ 📜user_index.csv
┃ ┃ ┃ ┣ 📜user_preferences - 복사본.csv
┃ ┃ ┃ ┣ 📜user_preferences.csv
┃ ┃ ┃ ┗ 📜__init__.py
┃ ┃ ┣ 📜catale_dataset.pkl
┃ ┃ ┣ 📜catale_model.pkl
┃ ┃ ┗ 📜__init__.py
┃ ┣ 📂routers
┃ ┃ ┣ 📜recommend.py
┃ ┃ ┣ 📜retrain.py
┃ ┃ ┗ 📜__init__.py
┃ ┣ 📂service
┃ ┃ ┣ 📜recommend_service.py
┃ ┃ ┣ 📜retrain_service.py
┃ ┃ ┣ 📜sample_data_produce.py
┃ ┃ ┗ 📜__init__.py
┃ ┣ 📂util
┃ ┃ ┣ 📜modelutil.py
┃ ┃ ┣ 📜optimizer.py
┃ ┃ ┗ 📜__init__.py
┃ ┣ 📜crud.py
┃ ┣ 📜database.py
┃ ┣ 📜item_similarity.py
┃ ┣ 📜main.py
┃ ┣ 📜schemas.py
┃ ┗ 📜__init__.py
┣ 📂model
┃ ┣ 📂v1
┃ ┃ ┗ 📜user_rating_model_v1.pkl
┃ ┗ 📜user_rating_model_v1.pkl
┣ 📂out
┃ ┗ 📂production
┃ ┃ ┗ 📂recommend-server
┃ ┃ ┃ ┣ 📂common
┃ ┃ ┃ ┃ ┣ 📂context
┃ ┃ ┃ ┃ ┃ ┗ 📜ItemFeatures.py
┃ ┃ ┃ ┃ ┣ 📜config.py
┃ ┃ ┃ ┃ ┗ 📜__init__.py
┃ ┃ ┃ ┣ 📂models
┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┣ 📜data_class.py
┃ ┃ ┃ ┃ ┃ ┗ 📜__init__.py
┃ ┃ ┃ ┃ ┣ 📂save
┃ ┃ ┃ ┃ ┃ ┣ 📜cocktail_features.csv
┃ ┃ ┃ ┃ ┃ ┣ 📜test_ratings.csv
┃ ┃ ┃ ┃ ┃ ┣ 📜train_ratings.csv
┃ ┃ ┃ ┃ ┃ ┣ 📜user_preferences.csv
┃ ┃ ┃ ┃ ┃ ┣ 📜user_rating_model_v1.pkl
┃ ┃ ┃ ┃ ┃ ┗ 📜__init__.py
┃ ┃ ┃ ┃ ┣ 📜modelv1.py
┃ ┃ ┃ ┃ ┗ 📜__init__.py
┃ ┃ ┃ ┣ 📂routers
┃ ┃ ┃ ┃ ┣ 📜recommend.py
┃ ┃ ┃ ┃ ┣ 📜retrain.py
┃ ┃ ┃ ┃ ┗ 📜__init__.py
┃ ┃ ┃ ┣ 📂service
┃ ┃ ┃ ┃ ┣ 📜recommend_service.py
┃ ┃ ┃ ┃ ┣ 📜retrain_service.py
┃ ┃ ┃ ┃ ┣ 📜sample_data_produce.py
┃ ┃ ┃ ┃ ┗ 📜__init__.py
┃ ┃ ┃ ┣ 📂util
┃ ┃ ┃ ┃ ┣ 📜modelutil.py
┃ ┃ ┃ ┃ ┣ 📜optimizer.py
┃ ┃ ┃ ┃ ┗ 📜__init__.py
┃ ┃ ┃ ┣ 📜crud.py
┃ ┃ ┃ ┣ 📜database.py
┃ ┃ ┃ ┣ 📜item_similarity.py
┃ ┃ ┃ ┣ 📜main.py
┃ ┃ ┃ ┣ 📜schemas.py
┃ ┃ ┃ ┗ 📜__init__.py
┣ 📜.env
┣ 📜.env.dev
┣ 📜.env.prod
┣ 📜.gitignore
┣ 📜Dockerfile
┗ 📜requirements.txt
기능 명세서
와이어 프레임
API 명세서
- JPA는 높은 러닝커브에도 불구하고, 관계형 데이터베이스에 대한 기본적인 이해가 있어 학습과 동시에 프로젝트에 적용 가능했음. 초기 ERD 설계 시 JPA 엔티티 설계를 고려하여, 데이터베이스 모델에 대한 빠른 이해와 후반부 최적화에 크게 기여함.
- k8s(microk8s) + Jenkins + argoCD를 활용해 자동화된 DevOps 환경을 구축함. 빌드, 테스트, 배포를 진행하며 개발 편의성을 크게 향상시킬 수 있었음. 추가적으로 GitOps 전략을 사용하여 개발 환경을 개선함.
- AI 모델(Lightfm), scikit-learn과 같은 파이썬 라이브러리를 이용하여 추천 기능을 개발하고, fastapi가 제공하는 자동 문서화 및 데이터 검증을 통해 효율적인 api 개발을 하기 위해 선택함.
- 수집된 메트릭을 시각화 하여 원하는 정보를 빠르게 파악할 수 있었음. 추가적으로 서비스 장애에 대해 빠르게 파악하고 대응할 수 있었음.
- 경량성과 성능
- 작고 빠름: Zustand는 매우 경량화된 라이브러리로, 번들 크기가 작습니다. 이는 초기 로딩 시간과 전체 애플리케이션 성능에 긍정적인 영향을 미칩니다.
- 빠른 업데이트: 상태 업데이트와 구독 메커니즘이 최적화되어 있어, 상태 변경 시 불필요한 렌더링을 최소화합니다.
- 간단한 사용법
- 직관적인 API: Zustand의 API는 매우 직관적이고 사용하기 쉬워, 개발자가 상태 관리 로직을 빠르게 작성할 수 있습니다.
- 보일러플레이트 감소: 다른 상태 관리 라이브러리와 비교했을 때, 복잡한 설정이나 보일러플레이트 코드가 거의 필요하지 않습니다.
- React와의 자연스러운 통합
- Hook 기반 설계: React의 Hook과 자연스럽게 통합되며, React 컴포넌트에서 상태를 간편하게 사용하고 관리할 수 있습니다.
- React의 철학에 부합: 상태 관리 로직을 컴포넌트와 분리하여, 코드의 가독성과 유지보수성을 높일 수 있습니다.
| GIF | 설명 |
|---|---|
![]() |
키워드 검색 - 기본 화면은 좋아요 많은 순의 칵테일 리스트 제공한다. - 찾고자 하는 칵테일 이름 검색을 통한 칵테일 검색할 수 있다. |
![]() |
옵션 검색 - 도수/단맛/신맛/쓴맛/탄산감 설정을 통한 범위 내 칵테일을 필터링 해준다. |











.gif)















