Skip to content
/ catale Public

[SSAFY 10기 특화프로젝트 1등] 나의 기분과 취향에 맞는 오늘의 칵테일 추천 서비스

Notifications You must be signed in to change notification settings

seom98/catale

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🏆삼성 청년 SW아카데미(SSAFY) 10th 특화 프로젝트 최우수상(1위)🏆

logo

나의 기분과 취향에 맞는 오늘의 칵테일 추천 서비스

✅ 프로젝트 진행 기간

2024.02.19 ~ 2024.04.05(6주)

✅ 프로젝트 소개

🚩 서비스 한줄 소개

칵테일 추천 서비스 "고양이 바텐더와 대화를 통해 매일 자신의 기분에 따른 칵테일을 추천받고, 취향에 맞는 칵테일을 찾을 수 있는 추천 서비스 '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

✅ 산출물

ERD

ERD

시스템 아키텍처

ddd

기능 명세서
와이어 프레임
API 명세서

✅ 기술 스택 세부 명세

JPA (Java Persistence API)

  • JPA는 높은 러닝커브에도 불구하고, 관계형 데이터베이스에 대한 기본적인 이해가 있어 학습과 동시에 프로젝트에 적용 가능했음. 초기 ERD 설계 시 JPA 엔티티 설계를 고려하여, 데이터베이스 모델에 대한 빠른 이해와 후반부 최적화에 크게 기여함.

Kubernetes & Argo CD

  • k8s(microk8s) + Jenkins + argoCD를 활용해 자동화된 DevOps 환경을 구축함. 빌드, 테스트, 배포를 진행하며 개발 편의성을 크게 향상시킬 수 있었음. 추가적으로 GitOps 전략을 사용하여 개발 환경을 개선함.

FastAPI

  • AI 모델(Lightfm), scikit-learn과 같은 파이썬 라이브러리를 이용하여 추천 기능을 개발하고, fastapi가 제공하는 자동 문서화 및 데이터 검증을 통해 효율적인 api 개발을 하기 위해 선택함.

Grafana & Prometheus

  • 수집된 메트릭을 시각화 하여 원하는 정보를 빠르게 파악할 수 있었음. 추가적으로 서비스 장애에 대해 빠르게 파악하고 대응할 수 있었음.

Zustand

  1. 경량성과 성능
    • 작고 빠름: Zustand는 매우 경량화된 라이브러리로, 번들 크기가 작습니다. 이는 초기 로딩 시간과 전체 애플리케이션 성능에 긍정적인 영향을 미칩니다.
    • 빠른 업데이트: 상태 업데이트와 구독 메커니즘이 최적화되어 있어, 상태 변경 시 불필요한 렌더링을 최소화합니다.
  2. 간단한 사용법
    • 직관적인 API: Zustand의 API는 매우 직관적이고 사용하기 쉬워, 개발자가 상태 관리 로직을 빠르게 작성할 수 있습니다.
    • 보일러플레이트 감소: 다른 상태 관리 라이브러리와 비교했을 때, 복잡한 설정이나 보일러플레이트 코드가 거의 필요하지 않습니다.
  3. React와의 자연스러운 통합
    • Hook 기반 설계: React의 Hook과 자연스럽게 통합되며, React 컴포넌트에서 상태를 간편하게 사용하고 관리할 수 있습니다.
    • React의 철학에 부합: 상태 관리 로직을 컴포넌트와 분리하여, 코드의 가독성과 유지보수성을 높일 수 있습니다.

✅ 기능 소개

1. 회원가입 및 로그인 🧑👩

GIF 설명
회원가입

- 이메일이 이미 사용중인 이메일인지 중복 확인을 진행한다.
- 영문 소문자, 숫자 각 1개 이상 조합하여 5-20자만을 비밀번호로 사용할 수 있도록 비밀번호 유효성 검사를 실행한다.
- 영문자,한글, 숫자 및 언더바를 포함할 수 있으며 3-10자 닉네임 유효성 검사를 시행한다.
- 다른 사용자와 닉네임이 중복되지 않도록 닉네임이 이미 사용중인 닉네임인지 중복확인을 진행한다.




로그인

- 이메일과 비밀번호로 로그인

2. 회원가입 직후 추가정보입력 및 가이드 📄

GIF 설명
칵테일 취향선택1

- 신규회원일 경우 기본값으로 설정될 본인의 칵테일 취향정보를 입력할 수 있다.
- 자신의 취향에 맞는 도수, 단맛, 신맛, 쓴맛, 탄산 정도를 6단계로 나누어 선택할 수 있다.
칵테일 취향선택2

- 자신의 취향에 맞는 칵테일 선택할 수 있다.
- 해당 취향 선택은 추후 칵테일 추천 데이터로 활용된다.
Catale 가이드 페이지

- 신규회원일 경우 취향선택이 끝나면 가이드 페이지를 통해 Catele 사용방법 확인할 수 있다.

3. 오늘의 칵테일 추천

GIF 설명
오늘의 기분 선택

- 오늘의 칵테일 추천받기 버튼을 누르면 바텐더와의 대화를 통해 칵테일 추천을 시작한다.
- 매우나쁨, 나쁨, 보통, 좋음, 매우좋음 5가지 중 오늘의 나의 기분 선택할 수 있다.
- 선택한 기분은 월별로 통계를 내어 마이페이지에서 원형 그래프로 제공된다.
오늘의 감정 선택

- 기분선택 후 오늘의 감정을 세가지 선택할 수 있다.
- 아니야 다시 선택할래 버튼을 누르면 감성 세가지 다시 선택 가능하다.
- 선택한 감정은 이미 지정된 감정 색깔을 통해 비슷한 색을 가진 칵테일을 추천하도록 한다.
감정에 영향을 준 이유 선택 / 오늘의 코멘트

- 감정에 영향을 준 이유를 선택지에서 선택할 수 있으며 원하는 선택지가 없으면 직접 쓸 수 있다.
- 오늘의 감정에 대한 한줄 코멘트 작성할 수 있으며 작성을 원하지 않을 경우 건너뛰기를 할 수 있다.
- 감정에 영향을 준 이유와 오늘의 코멘트는 일기내용에 포함된다.
취향도수 선택 / 블랜딩

- 회원 정보에 등록된 취향 도수를 기준점으로 추천받고 싶은 칵테일의 도수를 선택할 수 있다.
- 추천되는 칵테일에 영향을 미친다.
오늘의 칵테일 추천 결과

- 등록한 감정과 칵테일의 색 조합, 선택 도수 정보를 기반으로 오늘의 칵테일을 선정하여 오늘의 칵테일로 보여준다.
- 선정된 오늘의 칵테일과의 속성을 비교하여 유사도가 높은 칵테일들을 선별하고 비슷한 칵테일 목록으로 제공한다.
- 재추천이 가능하며 마지막으로 추천받은 칵테일과 쟉성한 일기를 기준으로 캘린더에 기록된다.

4. 칵테일 검색

GIF 설명
키워드 검색

- 기본 화면은 좋아요 많은 순의 칵테일 리스트 제공한다.
- 찾고자 하는 칵테일 이름 검색을 통한 칵테일 검색할 수 있다.
옵션 검색

- 도수/단맛/신맛/쓴맛/탄산감 설정을 통한 범위 내 칵테일을 필터링 해준다.

5. 칵테일 상세 및 리뷰작성하기

GIF 설명
칵테일 상세

- 칵테일의 이름, 사진, 아이콘과 오각형 그래프를 통해 칵테일의 도수, 맛, 탄산감정보과 칵테일 설명, 칵테일 재료정보 제공한다.
- 해당 칵테일을 판매하고 있는 유성구의 칵테일바 리스트를 소개한다.
칵테일 리뷰

- 사용자는 개인이 느낀 칵테일의 맛(쓴맛, 신맛, 탄산, 단맛)을 기록하고 별점과 한줄평가를 남길 수 있다.
- 초기의 맛 세팅은 칵테일의 기본 맛 정보를 기준으로 세팅되어 있다.
- 별점은 1개부터 5개 까지 남길 수 있다.
- 한줄 평가와 별점을 적지 않을 경우 리뷰를 남길 수 없다.
자신이 쓴 리뷰만 삭제 가능하다.

6. 주변 칵테일바 조회

GIF 설명
칵테일바 목록

- 유성구 기준 칵테일바 관련 정보와 위치와 가게의 목록조회를 확인할 수 있다.
- 지도에서 칵테일바에 해당하는 마커를 선택하면 해당 칵테일바로 바로 갈수 있게 스크롤이 내려간다.




칵테일바 상세

- 특정 칵테일바를 선택하면 칵테일바의 상세정보를 확인 할 수 있다.
- 칵테일바의 위치, 이름, 주소, 영업시간 정보와 칵테일바에서 판매하는 칵테일메뉴와 가격, 시그니처 칵테일 정보를 제공한다.

7. 캘린더

GIF 설명
월별기록

- 사용자가 추천받은 칵테일을 월별로 확인할 수 있다.
- 각각의 날짜에 있는 칵테일은 사용자가 추천받은 칵테일이고, 날짜의 테두리는 그날의 감정색을 나타낸다.
- <와 > 를 눌러 월이동을 할 수 있다.




일별기록

- 월별기록에서 기록이 존재하는 특정날짜를 클릭하면 해당날짜에 추천받은 칵테일을 확인할 수 있다.
- 상단에서 칵테일의 설명과 칵테일의 맛정보를 확인하고, 하단에서 그날의 감정이 일기형식으로 적혀진 것을 확인 할 수 있다.

8. 마이페이지

GIF 설명
설정페이지

- 프로필 변경을 원할 때 원하는 사진으로 프로필 사진을 바꿀 수 있다.
- 닉네임을 원하는 이름으로 변경할 수 있다.
- 비밀번호 변경을 통해 보안을 강화할 수 있다.
나의 취향

- 첫 회원가입 시 설정한 취향정보를 확인할 수 있다.
- 취향을 수정하고 싶은 경우 취향 변경 탭을 통해 나의 취향을 변경할 수 있다.
- 취향 칵테일 보러가기에서 나의 취향과 비슷한 취향을 가진 사용자들이 좋아하는 칵테일을 추천한다.
내가 마신 칵테일

- 리뷰를 남긴 칵테일의 리스트를 제공한다. 리스트는 별점 높은 순, 낮은 순, 최신 날짜 순, 오래된 날짜 순으로 정렬할 수 있다.
- 칵테일마다 칵테일 아이콘, 이름, 설명정보와 칵테일 별 내가 적은 리뷰 리스트를 확인할 수 있다.
좋아요한 칵테일

- 좋아요를 누른 칵테일의 아이콘과 칵테일 이름 리스트를 제공한다.
- 칵테일 아이콘을 누르면 칵테일 상세정보 페이지를 확인할 수 있다.
기분 통계 / 로그아웃

- 오늘의 칵테일을 추천 받으며 선택한 기분을 취합한 값을 매 월 원형 그래프로 시각화 한다.
- 매 월 각 기분이 몇 번 선택되었는지 확인할 수 있다.
- 로그아웃 버튼을 통해 로그아웃을 진행할 수 있다.

✅ 멤버 소개

고은석 최준호 서만기
- k8s를 이용한 인프라 구축
- CI/CD 파이프라인 설계
- 실시간 모니터링 시스템 구축
- 대화 알고리즘
- UI/UX 디자인 개발
- API 연결
- 프로젝트 디자인
- asset 일러스트 작업
- API 연결
최소영 심규리 유호정
- Light FM 사용 추천 알고리즘 구현
- 회원 API 구현 및 보안 설계
- Fast API 파이썬 서버 설계
- API 명세서, ERD 작성
- 다이어리, 스토어, 메뉴, 리뷰 API 구현
- 전체 API 기능 테스트 및 버그 수정
- 기능 명세서, ERD 작성
- 칵테일, 이미지, 좋아요 API 구현
- amazon S3 파일 업로드 구현

About

[SSAFY 10기 특화프로젝트 1등] 나의 기분과 취향에 맞는 오늘의 칵테일 추천 서비스

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 7