SSAFY 12기 2학기 자율 프로젝트
⌛ 프로젝트 기간 : 2025.04.21 ~ 2025.05.22 (4.5주)
📆 상세 기간 : 기획 1주 + 개발 3.5주
🔗 노션 링크
🖥️ 키오스크 배포 URL
📲 앱 배포 URL
✨ 더 이상 복잡한 주문은 그만! 얼굴 인식 한 번이면 주문, 결제, 적립, 추천까지 한 번에!
커페이스는 얼굴 인식을 통해, 나만의 취향을 기억한 딱 맞는 커피 주문 경험을 제공합니다.
카페 사장님도, 손님도 모두 만족하는 똑똑한 키오스크 솔루션을 만나보세요!
☕ 이런 분들을 위한 스마트 주문 솔루션이에요
메뉴 고민 없이 단골 손님처럼 나를 알아보고 메뉴를 추천받고 싶은 분
얼굴만으로 빠르고 안전한 결제로 시간을 절약하고 싶은 분
여러 카페의 스탬프 적립, 주문 내역, 결제 관리까지 한 번에 하고 싶은 분
직관적인 UI와 편리한 주문을 경험하고 싶은 분
🙆🏻 커페이스만의 특별한 기능
3D depth 카메라로 얼굴을 인식해 자동 로그인 및 개인 맞춤 추천
AI 기반 성별/연령 분석으로 비회원도 맞춤 추천 제공
머리 모션 인식으로 손 없이도 인터페이스 제어
통합 시스템으로 여러 매장 주문 내역·스탬프 적립 현황 실시간 확인
실시간 푸시 알림으로 주문 완료 안내
얼굴만 인식하면 등록된 카드로 자동 결제
👨🏻💻 이렇게 사용해보세요!
1️⃣ 키오스크 앞에 서기만 하면 얼굴인식으로 자동 로그인 완료
2️⃣ 분석한 맞춤 메뉴를 확인하고 원하는 음료 선택
3️⃣ 등록된 카드로 자동결제 또는 QR코드로 간편 결제
4️⃣ 앱에서 실시간 알림을 받고 완성된 음료 픽업
5️⃣ 다음 방문 시, 내 취향에 맞는 추천 메뉴로 더 빠른 주문
🔒 보안도 걱정 없어요!
얼굴 데이터 암호화 및 분산 저장으로 개인정보 보호
3D depth 카메라로 정확하고 안전한 얼굴 인식
이수환 @getbravelee |
권규리 @rnjs010 |
김주찬 @PoloCeleste |
박혜원 @hyeOOO |
서성우 @bamtol2 |
이혜령 @hyerongii |
AI 개발 (팀장) |
프론트 개발 | 인프라/AI 개발 | 백엔드 개발 | 백엔드 개발 | 프론트 개발 |
AI모델 파인튜닝, 얼굴인식, 모션인식, 라이브니스, 얼굴등록 | 키오스크 전체 개발 및 UX/UI 디자인 | 보조모니터 프론트, 얼굴 검증 및 모션 인식 백엔드, 벡터 DB 클러스터링, GPU서버 구축, 인프라 세팅, CI/CD | ERD설계, 유저, 주문, 결제, 알림 | ERD설계, 추천 알고리즘, 키오스크, 앱 선호조사 | 앱 전체 개발 및 UX/UI 디자인, 키오스크 메인/옵션/결제 화면 구현 |
APP
회원가입/로그인 | 홈페이지 비활성화 | 홈페이지 활성화 | 홈페이지 하단 |
---|---|---|---|
문자 인증 회원가입/로그인 기능을 제공합니다. | 정보가 등록되어있지 않은 사용자는 홈화면 기능이 비활성화 됩니다. | 얼굴/결제 정보가 등록된 사용자만 홈화면이 활성화되며 방문한 카페와 횟수를 확인할 수 있습니다. |
홈페이지 하단에는 얼굴 등록과 결제정보등록 버튼이 구성되어있습니다. |
메뉴선호조사 | 옵션선택조사 | 설정 | 카드설정 페이지 |
---|---|---|---|
처음 가입한 사용자의 경우 자신이 좋아하는 메뉴들를 선택하면 추후 추천 알고리즘에 반영됩니다. |
자신이 자주 주문하는 옵션 선택을 선택하면 추후 추천 알고리즘에 반영됩니다. | 설정 페이지 입니다. | 자신이 등록한 결제 카드 정보를 간략하게 확인하고 수정할 수 있습니다. |
얼굴등록 | 카드등록 |
---|---|
전면 카메라로 정면/좌/우/상/하 얼굴을 가이드라인에 맞게 캡쳐하여 등록할 수 있습니다. | 카드번호, 유효기간, CVC, 비밀번호 앞 2자리를 통해 카드 결제 정보를 등록할 수 있습니다. |
키오스크
회원가입/로그인 | 선호조사 | 홈페이지 |
---|---|---|
카페 세부 페이지 | 얼굴 등록 | 카드 등록 |
---|---|---|
얼굴 인식 로그인 및 라이브니스 | 주문-회원 |
---|---|
주문-비회원 | 전체 메뉴 |
---|---|
카메라 기술
- InsightFace 기반 얼굴 임베딩 : Buffalo-L 모델을 사용하여 512차원의 얼굴 특징 벡터(임베딩)를 생성합니다.
- 다방향 얼굴 캡처 : 정면, 좌, 우, 상, 하 총 5개 각도에서 얼굴을 캡처하여 다양한 각도에서의 인식 정확도를 향상시킵니다.
- 벡터 DB 기반 저장 : Qdrant 벡터 데이터베이스를 사용하여 얼굴 임베딩을 COLLECTION_NAME="face_embeddings" 컬렉션에 저장합니다.
- 코사인 유사도 기반 매칭 : 유사도 임계값(SIMILARITY_THRESHOLD=0.7)을 기준으로 얼굴 매칭을 판단합니다.
- 3D 깊이 정보 활용 : Intel RealSense D435f/D455 깊이 카메라를 사용하여 실제 얼굴의 입체감을 측정합니다.
- 깊이 변화 분석 : 얼굴 영역의 깊이 변화가 15mm~100mm 사이일 때 실제 얼굴로 판단합니다.
- 피크-밸리 검사 : 코 주변의 작은 영역과 얼굴 둘레의 평균 깊이 차이를 계산하여 입체감을 확인합니다.
- 평면 피팅 잔차 분석 : 얼굴 영역에 평면을 피팅하고, 잔차의 표준편차가 3mm 이상인 경우 실제 얼굴로 판단합니다.
- 벡터 유사도 검색 : qdrant(벡터 데이터베이스)에 저장된 쿼리 얼굴 임베딩과 저장된 임베딩 간의 코사인 유사도를 계산합니다.
- 다중 얼굴 샘플 평균화 : 사용자별로 저장된 여러 방향의 얼굴 임베딩에 대한 유사도 평균을 계산하여 정확도를 높입니다.
- 임계값 기반 판단 : 평균 유사도가 임계값(0.7)을 초과하는 경우에만 매칭 성공으로 간주합니다.
- 신뢰도 스코어 : 사용자별 평균 유사도를 신뢰도 점수로 제공합니다.
- InsightFace 모델 활용 : Buffalo-L 모델에 내장된 성별 및 나이 추정 기능을 사용합니다.
- 모델 파인튜닝 : UTKFace 데이터셋을 사용하여 CNN 기반 모델을 파인튜닝하여 성별 및 나이 추정 정확도를 향상시킵니다.
- 평균 값 활용 : 여러 프레임에서 감지된 나이 및 성별 정보를 통계적으로 처리하여 안정적인 결과를 제공합니다.
- 다수결 원칙 : 성별 판단에는 다수결 원칙을 적용하여 안정성을 높입니다.
- UTKFace 데이터셋 활용 : 나이, 성별, 인종 정보가 포함된 데이터셋을 사용하여 모델을 훈련합니다.
- 컨볼루션 신경망 구조 : 4개의 컨볼루션 레이어와 배치 정규화, ReLU 활성화 함수를 사용한 구조를 채택합니다.
- 듀얼 헤드 아키텍처 : 나이 예측(회귀 문제)과 성별 분류(이진 분류)를 위한 별도의 헤드를 가진 신경망 구조를 사용합니다.
- ONNX 포맷 변환 : 훈련된 모델을 ONNX 형식으로 변환하여 InsightFace와 통합합니다. insightface 라이브러리와 호환되게 하기 위해서. cpu, gpu 등 다양한 하드웨어 가속기에 최적화된 추론제공.
-
얼굴등록 : 사용자(앱) → 카메라 → 얼굴 캡처 → 5방향 촬영 완료 → 서버로 이미지 전송 → 벡터 임베딩 생성 → Qdrant DB 저장
-
얼굴인식 : 사용자(키오스크) → 카메라 → 이미지 캡처 → 라이브니스 검사(depth 카메라) → GPU 서버로 이미지 전송 → 임베딩 생성 → Qdrant DB 검색 → 유사도 계산 → 결과 반환 → 인증 완료/실패
-
모션감지 : 사용자(키오스크) → MediaPipe FaceMesh → 얼굴 랜드마크 추출 → 3축 회전 계산(pitch, yaw, roll) → 모션 패턴 분석 → 모션 이벤트 발행 → 구독 컴포넌트에서 이벤트 처리 → UI 업데이트/액션 수행
FCM
- 클라이언트 앱이 FCM 서버에 등록 요청을 보내고, 고유한 등록 토큰(Registration Token)을 발급
- 클라이언트 앱은 발급받은 토큰을 자체 백엔드 서버에 전달하여 저장
- 백엔드 서버는 특정 사용자 또는 그룹의 토큰을 이용해 전송할 메시지를 준비
- 백엔드 서버가 메시지와 타겟 토큰을 FCM 서버에 전송
- FCM 서버는 메시지 요청을 수신하고, 토큰을 기반으로 타겟 디바이스를 식별
- FCM 서버는 플랫폼별 전송 레이어(예: Android ATL, iOS APNs, Web Push)를 통해 메시지를 해당 디바이스로 전달
- 클라이언트 단의 FCM SDK가 메시지를 수신하고, 앱 상태(포그라운드/백그라운드)에 따라 알림을 표시하거나 데이터 처리를 수행
- 앱 → fcm 토큰 발급 → FCM 서버
- 키오스크 로그인/주문/결제 시 → 백 서버 → FCM 서버 이벤트 발송
- FCM 서버 → 앱 알림
추천
- 시간, 날씨, 요일, 주차, 월 등 상황적 요소를 고려한 추천
- 사용자의 정보(성별, 나이) 활용
- 사용자 개인 이력 기반 필터링과 컨텍스트 기반 필터링 결합하여 추천
- 복잡한 SQL 쿼리를 통한 효율적인 추천 데이터 추출
Back 폴더 구조 보기
📦main ┣ 📂java ┃ ┗ 📂com ┃ ┃ ┗ 📂ssafy ┃ ┃ ┃ ┗ 📂orderme ┃ ┃ ┃ ┃ ┣ 📂common ┃ ┃ ┃ ┃ ┃ ┗ 📜ApiResponse.java ┃ ┃ ┃ ┃ ┣ 📂config ┃ ┃ ┃ ┃ ┃ ┣ 📜AppConfig.java ┃ ┃ ┃ ┃ ┃ ┣ 📜AsyncConfig.java ┃ ┃ ┃ ┃ ┃ ┣ 📜FCMConfig.java ┃ ┃ ┃ ┃ ┃ ┣ 📜RedisConfig.java ┃ ┃ ┃ ┃ ┃ ┗ 📜SecurityConfig.java ┃ ┃ ┃ ┃ ┣ 📂kiosk ┃ ┃ ┃ ┃ ┃ ┣ 📂controller ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜KioskController.java ┃ ┃ ┃ ┃ ┃ ┣ 📂dto ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂request ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PreferredOptionRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UserPreferenceRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂response ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CategoryResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuDetailResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuOptionCategoryResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuOptionResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PreferenceOptionCategoryResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PreferenceOptionItemResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PreferredMenuCategoryResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PreferredMenuResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜RecommendedMenuResponse.java ┃ ┃ ┃ ┃ ┃ ┣ 📂mapper ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CategoryMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PreferenceMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoresMapper.java ┃ ┃ ┃ ┃ ┃ ┣ 📂model ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Category.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Menu.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuOptionCategory.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OptionCategory.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OptionItem.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Order.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderMenu.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderOption.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜StampPolicy.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜Store.java ┃ ┃ ┃ ┃ ┃ ┗ 📂service ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CategoryService.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuService.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PreferenceService.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreServices.java ┃ ┃ ┃ ┃ ┣ 📂manager ┃ ┃ ┃ ┃ ┃ ┣ 📂controller ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MenuImageController.java ┃ ┃ ┃ ┃ ┃ ┣ 📂dto ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂response ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MenuImageUploadResponse.java ┃ ┃ ┃ ┃ ┃ ┣ 📂S3 ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜S3Uploader.java ┃ ┃ ┃ ┃ ┃ ┣ 📂service ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MenuImageService.java ┃ ┃ ┃ ┃ ┃ ┗ 📂statistics ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂controller ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StatisticsController.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂request ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StatisticsRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂response ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜DailySalesResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜GenderAgePreferenceResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PopularMenuResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜WeeklySalesResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂mapper ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StatisticsMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂scheduler ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StatisticsScheduler.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂service ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StatisticsService.java ┃ ┃ ┃ ┃ ┣ 📂notification ┃ ┃ ┃ ┃ ┃ ┣ 📂controller ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜FcmController.java ┃ ┃ ┃ ┃ ┃ ┣ 📂dto ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂request ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜FcmTokenRegistrationRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜FcmMessageDto.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜FcmSendDto.java ┃ ┃ ┃ ┃ ┃ ┣ 📂mapper ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜FcmTokenMapper.java ┃ ┃ ┃ ┃ ┃ ┣ 📂model ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜FcmToken.java ┃ ┃ ┃ ┃ ┃ ┗ 📂service ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜FcmService.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜NotificationService.java ┃ ┃ ┃ ┃ ┣ 📂order ┃ ┃ ┃ ┃ ┃ ┣ 📂controller ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderController.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜StampController.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UserOrderController.java ┃ ┃ ┃ ┃ ┃ ┣ 📂dto ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂response ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderMenuResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderOptionResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜StampResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜TopMenuResponse.java ┃ ┃ ┃ ┃ ┃ ┣ 📂mapper ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OptionItemMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderMenuMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderOptionMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜StampHistoryMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜StampMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StampPolicyMapper.java ┃ ┃ ┃ ┃ ┃ ┣ 📂model ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuFrequency.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OptionItem.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderMenu.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderOption.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Stamp.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜StampHistory.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StampPolicy.java ┃ ┃ ┃ ┃ ┃ ┗ 📂service ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderService.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜StampService.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UserOrderService.java ┃ ┃ ┃ ┃ ┣ 📂payment ┃ ┃ ┃ ┃ ┃ ┣ 📂controller ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AutoPaymentController.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜PaymentController.java ┃ ┃ ┃ ┃ ┃ ┣ 📂dto ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂request ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AutoPaymentRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CardRegistrationRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuOrderRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OptionOrderRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PaymentApprovalRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PaymentConfirmRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PaymentRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜SetDefaultCardRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂response ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CardCompanyResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PaymentInfoResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜PaymentResponseDto.java ┃ ┃ ┃ ┃ ┃ ┣ 📂exception ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CardNotFoundException.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜CardRegistrationException.java ┃ ┃ ┃ ┃ ┃ ┣ 📂mapper ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OrderMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PaymentInfoMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜PaymentMapper.java ┃ ┃ ┃ ┃ ┃ ┣ 📂model ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CardInfo.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Order.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Payment.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜PaymentInfo.java ┃ ┃ ┃ ┃ ┃ ┗ 📂service ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AutoPaymentService.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CardService.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜PaymentService.java ┃ ┃ ┃ ┃ ┣ 📂recommendation ┃ ┃ ┃ ┃ ┃ ┣ 📂controller ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜RecommendationController.java ┃ ┃ ┃ ┃ ┃ ┣ 📂dto ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂response ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AdvancedMenuRecommendation.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜MenuWithOptionsDto.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜RecommendationResponse.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜RecommendedMenuGroup.java ┃ ┃ ┃ ┃ ┃ ┣ 📂mapper ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜RecommendationMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜WeatherMapper.java ┃ ┃ ┃ ┃ ┃ ┣ 📂model ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜GeoLocation.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜WeatherData.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜WeatherPreference.java ┃ ┃ ┃ ┃ ┃ ┗ 📂service ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜RecommendationService.java ┃ ┃ ┃ ┃ ┣ 📂security ┃ ┃ ┃ ┃ ┃ ┣ 📜CustomUserDetailsService.java ┃ ┃ ┃ ┃ ┃ ┣ 📜JwtAuthenticationFilter.java ┃ ┃ ┃ ┃ ┃ ┗ 📜JwtTokenProvider.java ┃ ┃ ┃ ┃ ┣ 📂store ┃ ┃ ┃ ┃ ┃ ┣ 📂controller ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreController.java ┃ ┃ ┃ ┃ ┃ ┣ 📂dto ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂response ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreResponse.java ┃ ┃ ┃ ┃ ┃ ┣ 📂mapper ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreMapper.java ┃ ┃ ┃ ┃ ┃ ┣ 📂model ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Store.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreVisit.java ┃ ┃ ┃ ┃ ┃ ┗ 📂service ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜StoreService.java ┃ ┃ ┃ ┃ ┣ 📂user ┃ ┃ ┃ ┃ ┃ ┣ 📂controller ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜AuthController.java ┃ ┃ ┃ ┃ ┃ ┣ 📂dto ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂request ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AdminLoginRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AdminRegisterRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜KioskSessionRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜PhoneLoginRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜RefreshTokenRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜VerificationConfirmRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜VerificationRequest.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AdminDto.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UserDto.java ┃ ┃ ┃ ┃ ┃ ┣ 📂mapper ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AdminMapper.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UserMapper.java ┃ ┃ ┃ ┃ ┃ ┣ 📂model ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Admin.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Gender.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜User.java ┃ ┃ ┃ ┃ ┃ ┗ 📂service ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AdminService.java ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜SmsService.java ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UserService.java ┃ ┃ ┃ ┃ ┗ 📜OrdermeApplication.java ┗ 📂resources ┃ ┗ 📂mappers ┃ ┃ ┣ 📂kiosk ┃ ┃ ┃ ┣ 📜CategoryMapper.xml ┃ ┃ ┃ ┣ 📜MenuMapper.xml ┃ ┃ ┃ ┣ 📜PreferenceMapper.xml ┃ ┃ ┃ ┗ 📜StoreMapper.xml ┃ ┃ ┣ 📂manager ┃ ┃ ┃ ┗ 📜StatisticsMapper.xml ┃ ┃ ┣ 📂notification ┃ ┃ ┃ ┗ 📜FcmTokenMapper.xml ┃ ┃ ┣ 📂order ┃ ┃ ┃ ┣ 📜OptionItemMapper.xml ┃ ┃ ┃ ┣ 📜OrderMenuMapper.xml ┃ ┃ ┃ ┣ 📜OrderOptionMapper.xml ┃ ┃ ┃ ┣ 📜StampHistoryMapper.xml ┃ ┃ ┃ ┣ 📜StampMapper.xml ┃ ┃ ┃ ┗ 📜StampPolicyMapper.xml ┃ ┃ ┣ 📂payment ┃ ┃ ┃ ┣ 📜OrderMapper.xml ┃ ┃ ┃ ┣ 📜PaymentInfoMapper.xml ┃ ┃ ┃ ┗ 📜PaymentMapper.xml ┃ ┃ ┣ 📂recommendation ┃ ┃ ┃ ┗ 📜RecommendationMapper.xml ┃ ┃ ┣ 📂store ┃ ┃ ┃ ┗ 📜StoreMapper.xml ┃ ┃ ┗ 📂user ┃ ┃ ┃ ┣ 📜AdminMapper.xml ┃ ┃ ┃ ┗ 📜UserMapper.xml
Front - kiosk 폴더 구조 보기
📦src ┣ 📂assets ┃ ┗ 📜react.svg ┣ 📂components ┃ ┣ 📂ui ┃ ┃ ┣ 📜alert-dialog.tsx ┃ ┃ ┗ 📜button.tsx ┃ ┣ 📜CustomButton.tsx ┃ ┣ 📜CustomDialog.tsx ┃ ┣ 📜GestureDetector.tsx ┃ ┣ 📜Header.tsx ┃ ┣ 📜HighlightText.tsx ┃ ┣ 📜ReasonText.tsx ┃ ┣ 📜slotDigit.tsx ┃ ┗ 📜slotNumber.tsx ┣ 📂features ┃ ┣ 📂adminLogin ┃ ┃ ┣ 📂components ┃ ┃ ┃ ┗ 📜LoginForm.tsx ┃ ┃ ┣ 📂hooks ┃ ┃ ┃ ┗ 📜useAdminLogin.ts ┃ ┃ ┗ 📂services ┃ ┃ ┃ ┗ 📜adminService.ts ┃ ┣ 📂order ┃ ┃ ┣ 📂components ┃ ┃ ┃ ┣ 📂Main ┃ ┃ ┃ ┃ ┣ 📜AnimatedContainer.tsx ┃ ┃ ┃ ┃ ┣ 📜MenuInfo.tsx ┃ ┃ ┃ ┃ ┣ 📜OptionLayerComponent.tsx ┃ ┃ ┃ ┃ ┣ 📜OptionList.tsx ┃ ┃ ┃ ┃ ┣ 📜ProgressBar.tsx ┃ ┃ ┃ ┃ ┗ 📜SlideButtion.tsx ┃ ┃ ┃ ┣ 📂Menu ┃ ┃ ┃ ┃ ┣ 📜AllMenuSection.tsx ┃ ┃ ┃ ┃ ┣ 📜MenuCard.tsx ┃ ┃ ┃ ┃ ┣ 📜OrderSection.tsx ┃ ┃ ┃ ┃ ┗ 📜RecommendSection.tsx ┃ ┃ ┃ ┣ 📂Option ┃ ┃ ┃ ┃ ┣ 📜OptionalOptionSection.tsx ┃ ┃ ┃ ┃ ┣ 📜OptionButton.tsx ┃ ┃ ┃ ┃ ┣ 📜OptionDialog.tsx ┃ ┃ ┃ ┃ ┗ 📜RequiredOptionSection.tsx ┃ ┃ ┃ ┣ 📂pay ┃ ┃ ┃ ┃ ┣ 📜FailContent.tsx ┃ ┃ ┃ ┃ ┣ 📜PayMethodButton.tsx ┃ ┃ ┃ ┃ ┣ 📜ProgressContent.tsx ┃ ┃ ┃ ┃ ┗ 📜SuccessContent.tsx ┃ ┃ ┃ ┣ 📂Receipt ┃ ┃ ┃ ┃ ┣ 📜ReceiptDialog.tsx ┃ ┃ ┃ ┃ ┗ 📜ReceiptItemList.tsx ┃ ┃ ┃ ┣ 📜MainContent.tsx ┃ ┃ ┃ ┣ 📜MenuContent.tsx ┃ ┃ ┃ ┣ 📜PayContent.tsx ┃ ┃ ┃ ┗ 📜PlaceSelectContent.tsx ┃ ┃ ┣ 📂hooks ┃ ┃ ┃ ┣ 📂pay ┃ ┃ ┃ ┃ ┣ 📜useClientKey.ts ┃ ┃ ┃ ┃ ┣ 📜useConfirmPay.ts ┃ ┃ ┃ ┃ ┣ 📜usePreparePay.ts ┃ ┃ ┃ ┃ ┗ 📜useProgressPay.ts ┃ ┃ ┃ ┣ 📜useAllMenu.ts ┃ ┃ ┃ ┣ 📜useAutoPay.ts ┃ ┃ ┃ ┣ 📜useCategory.ts ┃ ┃ ┃ ┣ 📜useCoupon.ts ┃ ┃ ┃ ┣ 📜useNewRecommend.ts ┃ ┃ ┃ ┣ 📜useOption.ts ┃ ┃ ┃ ┣ 📜useRecommendMenu.ts ┃ ┃ ┃ ┗ 📜useSlideAnimation.ts ┃ ┃ ┗ 📂services ┃ ┃ ┃ ┣ 📂pay ┃ ┃ ┃ ┃ ┣ 📜confirmPayService.ts ┃ ┃ ┃ ┃ ┣ 📜keyService.ts ┃ ┃ ┃ ┃ ┗ 📜preparePayService.ts ┃ ┃ ┃ ┣ 📜allMenuService.ts ┃ ┃ ┃ ┣ 📜autoPayService.ts ┃ ┃ ┃ ┣ 📜categoryService.ts ┃ ┃ ┃ ┣ 📜couponService.ts ┃ ┃ ┃ ┣ 📜newRecommendService.ts ┃ ┃ ┃ ┣ 📜optionService.ts ┃ ┃ ┃ ┗ 📜recommendMenuService.ts ┃ ┗ 📂userLogin ┃ ┃ ┣ 📂components ┃ ┃ ┃ ┣ 📜NewStartScreen.tsx ┃ ┃ ┃ ┗ 📜NumKeyPad.tsx ┃ ┃ ┣ 📂hooks ┃ ┃ ┃ ┣ 📜useExtendSession.ts ┃ ┃ ┃ ┣ 📜useLogin.ts ┃ ┃ ┃ ┣ 📜useLogout.ts ┃ ┃ ┃ ┗ 📜useWeather.ts ┃ ┃ ┗ 📂services ┃ ┃ ┃ ┣ 📜extendSessionService.ts ┃ ┃ ┃ ┣ 📜faceRecogService.ts ┃ ┃ ┃ ┣ 📜logoutService.ts ┃ ┃ ┃ ┣ 📜phoneLoginService.ts ┃ ┃ ┃ ┗ 📜weatherService.ts ┣ 📂fonts ┃ ┣ 📜SUIT-Variable.woff2 ┃ ┗ 📜SUITE-Variable.woff2 ┣ 📂hooks ┃ ┗ 📜useDragScroll.ts ┣ 📂interfaces ┃ ┣ 📜OrderInterface.ts ┃ ┣ 📜PayInterface.ts ┃ ┣ 📜RecommendInterface.ts ┃ ┗ 📜UserInterface.ts ┣ 📂lib ┃ ┣ 📜axios.ts ┃ ┣ 📜changeCamera.ts ┃ ┣ 📜changeDisplay.ts ┃ ┣ 📜cookie.ts ┃ ┗ 📜utils.ts ┣ 📂pages ┃ ┣ 📂adminLogin ┃ ┃ ┗ 📜AdminLoginPage.tsx ┃ ┣ 📂order ┃ ┃ ┗ 📜OrderPage.tsx ┃ ┣ 📂pay ┃ ┃ ┣ 📜FailPage.tsx ┃ ┃ ┣ 📜PayPage.tsx ┃ ┃ ┗ 📜SuccessPage.tsx ┃ ┣ 📂userLogin ┃ ┃ ┗ 📜UserLoginPage.tsx ┃ ┗ 📜LoadingPage.tsx ┣ 📂stores ┃ ┣ 📜adminStore.ts ┃ ┣ 📜directOrderStore.ts ┃ ┣ 📜loginStore.ts ┃ ┣ 📜orderStore.ts ┃ ┣ 📜payStore.ts ┃ ┣ 📜recommendStore.ts ┃ ┗ 📜stepStore.ts ┣ 📂styles ┃ ┣ 📜colors.ts ┃ ┣ 📜fonts.tsx ┃ ┣ 📜RippleEffect.tsx ┃ ┗ 📜typography.ts ┣ 📂utils ┃ ┣ 📜calculateAge.ts ┃ ┣ 📜convertMenuToOrder.ts ┃ ┣ 📜formatOptionLabel.ts ┃ ┣ 📜generateReasonPart.ts ┃ ┗ 📜maskUserName.ts ┣ 📜App.tsx ┣ 📜config.ts ┣ 📜index.css ┣ 📜main.tsx ┗ 📜vite-env.d.ts
Front - userApp 폴더 구조 보기
📦src ┣ 📂assets ┃ ┣ 📂drinks ┃ ┃ ┣ 📜cookie.png ┃ ┃ ┣ 📜greentea.png ┃ ┃ ┗ 📜strawberry.png ┃ ┣ 📂icons ┃ ┃ ┣ 📜icon-cookie.png ┃ ┃ ┣ 📜icon-greentea.png ┃ ┃ ┗ 📜icon-strawberry.png ┃ ┣ 📜face-scan.gif ┃ ┣ 📜ice.png ┃ ┣ 📜loading.gif ┃ ┣ 📜lock.png ┃ ┣ 📜logo.png ┃ ┣ 📜phone.png ┃ ┣ 📜scroll-down.gif ┃ ┣ 📜shield-check.gif ┃ ┣ 📜shield.png ┃ ┗ 📜wallet.png ┣ 📂components ┃ ┣ 📂ui ┃ ┃ ┣ 📜button.tsx ┃ ┃ ┣ 📜drawer.tsx ┃ ┃ ┗ 📜input.tsx ┃ ┣ 📜AuthRedirect.tsx ┃ ┣ 📜DetailHeader.tsx ┃ ┣ 📜LoadingMessage.tsx ┃ ┣ 📜MainButton.tsx ┃ ┣ 📜ProtectedRoute.tsx ┃ ┗ 📜WavyHeader.tsx ┣ 📂features ┃ ┣ 📂home ┃ ┃ ┣ 📂components ┃ ┃ ┃ ┣ 📂home ┃ ┃ ┃ ┃ ┣ 📜HomeMainButton.tsx ┃ ┃ ┃ ┃ ┣ 📜HomeSelectDrinks.tsx ┃ ┃ ┃ ┃ ┣ 📜HomeTitleLock.tsx ┃ ┃ ┃ ┃ ┗ 📜HomeTitleUnlock.tsx ┃ ┃ ┃ ┗ 📂order ┃ ┃ ┃ ┃ ┣ 📜OrderHistorySection.tsx ┃ ┃ ┃ ┃ ┣ 📜StampSection.tsx ┃ ┃ ┃ ┃ ┗ 📜TopOrdersSection.tsx ┃ ┃ ┗ 📂services ┃ ┃ ┃ ┣ 📜homeService.ts ┃ ┃ ┃ ┗ 📜storeService.ts ┃ ┣ 📂login ┃ ┃ ┣ 📂components ┃ ┃ ┃ ┣ 📜LoginCodeComponents.tsx ┃ ┃ ┃ ┣ 📜LoginComponents.tsx ┃ ┃ ┃ ┣ 📜LoginSelectModal.tsx ┃ ┃ ┃ ┣ 📜MainLoginButton.tsx ┃ ┃ ┃ ┗ 📜MainTopSection.tsx ┃ ┃ ┣ 📂hooks ┃ ┃ ┃ ┗ 📜useAuth.ts ┃ ┃ ┗ 📂services ┃ ┃ ┃ ┗ 📜authService.ts ┃ ┣ 📂register ┃ ┃ ┣ 📂components ┃ ┃ ┃ ┣ 📂capture ┃ ┃ ┃ ┃ ┣ 📜ActionButton.tsx ┃ ┃ ┃ ┃ ┣ 📜CameraView.tsx ┃ ┃ ┃ ┃ ┣ 📜CapturedImages.tsx ┃ ┃ ┃ ┃ ┣ 📜CaptureHeader.tsx ┃ ┃ ┃ ┃ ┣ 📜FaceGuidelines.tsx ┃ ┃ ┃ ┃ ┣ 📜StageIndicator.tsx ┃ ┃ ┃ ┃ ┣ 📜StatusMessage.tsx ┃ ┃ ┃ ┃ ┗ 📜styles.ts ┃ ┃ ┃ ┗ 📂intro ┃ ┃ ┃ ┃ ┣ 📜FaceRegisterCheckModal.tsx ┃ ┃ ┃ ┃ ┣ 📜FaceRegisterMainButton.tsx ┃ ┃ ┃ ┃ ┣ 📜PayRandomKeyPad.tsx ┃ ┃ ┃ ┃ ┗ 📜PayRegisterComponents.tsx ┃ ┃ ┣ 📂hooks ┃ ┃ ┃ ┗ 📜useFaceDetection.tsx ┃ ┃ ┗ 📂services ┃ ┃ ┃ ┣ 📜captureService.ts ┃ ┃ ┃ ┗ 📜payService.ts ┃ ┣ 📂setting ┃ ┃ ┗ 📂components ┃ ┃ ┃ ┗ 📜CardComponent.tsx ┃ ┗ 📂survey ┃ ┃ ┣ 📂components ┃ ┃ ┃ ┣ 📜MenuSelectContent.tsx ┃ ┃ ┃ ┣ 📜OptionSelectContent.tsx ┃ ┃ ┃ ┗ 📜SurveyHeader.tsx ┃ ┃ ┗ 📂services ┃ ┃ ┃ ┗ 📜surveyService.ts ┣ 📂fonts ┃ ┣ 📜SUIT-Variable.woff2 ┃ ┗ 📜SUITE-Variable.woff2 ┣ 📂interfaces ┃ ┣ 📜FaceRegisterInterfaces.ts ┃ ┣ 📜HomeInterfaces.ts ┃ ┣ 📜LoginInterfaces.ts ┃ ┣ 📜PayRegisterInterfaces.ts ┃ ┣ 📜StoreInterfaces.ts ┃ ┗ 📜SurveyInterfaces.ts ┣ 📂lib ┃ ┗ 📜utils.ts ┣ 📂mocks ┃ ┣ 📜mockStore.ts ┃ ┗ 📜testStore.ts ┣ 📂pages ┃ ┣ 📂home ┃ ┃ ┣ 📜HomePage.tsx ┃ ┃ ┗ 📜StorePage.tsx ┃ ┣ 📂login ┃ ┃ ┣ 📜LoginConfirmPage.tsx ┃ ┃ ┣ 📜LoginVerifyPage.tsx ┃ ┃ ┗ 📜MainPage.tsx ┃ ┣ 📂register ┃ ┃ ┣ 📜FaceRegisterCapturePage.tsx ┃ ┃ ┣ 📜FaceRegisterConfirmPage.tsx ┃ ┃ ┣ 📜FaceRegisterPage.tsx ┃ ┃ ┗ 📜PayRegisterPage.tsx ┃ ┣ 📂setting ┃ ┃ ┣ 📜SettingPage.tsx ┃ ┃ ┗ 📜SettingPayPage.tsx ┃ ┗ 📂survey ┃ ┃ ┗ 📜SurveyPage.tsx ┣ 📂services ┃ ┣ 📜api.ts ┃ ┗ 📜notificationService.ts ┣ 📂stores ┃ ┣ 📜authStore.ts ┃ ┗ 📜visitedStoreStore.ts ┣ 📂styles ┃ ┣ 📜colors.ts ┃ ┣ 📜fonts.tsx ┃ ┗ 📜typography.ts ┣ 📂utils ┃ ┣ 📜captureUtils.ts ┃ ┣ 📜cookieAuth.ts ┃ ┣ 📜firebaseUtils.ts ┃ ┗ 📜storeUtils.ts ┣ 📜App.tsx ┣ 📜config.ts ┣ 📜firebaseConfig.ts ┣ 📜index.css ┣ 📜main.tsx ┗ 📜vite-env.d.ts