프로젝트 / Pillution

Pillution

문진으로 건강 상태와 생활 습관을 분석해 영양 성분과 제품을 추천하고, 구독 배송과 상담까지 잇는 헬스케어 서비스

기간
2025.01.17 ~ 2025.02.21
인원
5명 (기능 단위로 나눠 각자 백엔드·화면 모두 개발)
담당
문진 · 추천 알고리즘 · 실시간 상담 · 결제 · 인증 · CI/CD
기술
Spring BootSpring SecurityJPAJWTOAuth2 (카카오)JUnitRedisWebSocket (STOMP)MariaDBPortOneReactRedux ToolkitMUIViteGitHub ActionsAWS EC2AWS RDSNginxSwagger
링크
GitHub시연 영상

개요

사용자 맞춤 문진으로 건강 상태와 생활 습관을 분석해 필요한 영양 성분과 제품을 추천하는 헬스케어 웹 서비스입니다. 추천 제품은 구독으로 주기 배송되고, 실시간 상담과 쪽지로 꾸준히 피드백을 받을 수 있습니다.

핵심인 문진 로직과 추천 알고리즘 설계·구현을 주도했고, 실시간 상담·쪽지, 결제, 인증을 맡았습니다. Redux Toolkit 상태 관리와 React 컴포넌트를 설계해 복잡한 백엔드 로직과 화면을 이었습니다.

맡은 일

  • 사용자 문진
  • 맞춤 영양제 추천 알고리즘
  • 실시간 채팅 상담
  • 쪽지·알림
  • 장바구니
  • 주문·결제
  • 카카오 로그인
  • 배포 자동화(CI/CD)

핵심 성과

추천 알고리즘
응답을 점수화하고 정규화·가중치를 적용하는 구조
실시간 채팅
WebSocket + Redis Pub/Sub 기반 상담
결제 처리
구독 상품과 일반 상품의 결제 흐름을 백엔드에서 나눔
상태 관리
Redux 전역 상태로 화면 흐름 통합
자동 배포
GitHub Actions 기반 CI/CD 파이프라인

문제와 해결

문제 1
상담원 두 명이 같은 채팅을 동시에 수락하던 문제
문제
상담 요청이 여러 상담원에게 동시에 가면 두 명 이상이 함께 수락하는 일이 생김
원인
Redis Pub/Sub 으로 알린 뒤 수락 요청이 동시에 들어올 때 서버에 동시성 제어가 없었음
해결
트랜잭션 안에서 상태가 WAIT 일 때만 수락되게 막고, 다른 상담원 화면에는 자동 취소 알림
결과
중복 매칭이 사라지고 실시간성을 지키는 구조가 됨
문제 2
구독 여부에 따라 결제 흐름이 섞이던 문제
문제
기존 구독자가 상품을 더하면 이중 결제가 되거나, 일반 사용자가 구독 결제로 들어감
원인
구독 여부에 따른 분기를 화면에만 맡기고 백엔드에는 없었음
해결
백엔드에서 장바구니의 구독 상품과 사용자 상태를 확인해 PortOne 정기 결제·일반 결제를 나눠 부름
결과
두 결제 흐름이 분리되고 이중 결제가 사라짐
문제 3
추천 점수가 한쪽으로 치우치던 문제
문제
특정 조건 조합(예: 고연령 + 특정 증상)에서 일부 성분이 지나치게 높게 추천됨
원인
가중치가 고정돼 있었고 응답 점수 정규화가 빠져 있었음
해결
응답 점수를 0~5 로 정규화하고, 가중치를 다시 맞추고, 생활습관 보정 로직을 더함
결과
추천 결과를 설명할 수 있게 되었고, 사용자 피드백으로 고쳐 나갈 수 있는 구조가 됨
문제 4
채팅 메시지를 두 번 받던 문제
문제
같은 메시지를 두 번 받는 현상
원인
WebSocket 재연결 때 클라이언트가 같은 메시지를 다시 보냈고, 서버는 구분 없이 그대로 전달
해결
서버에서 메시지마다 UUID 를 붙여 중복을 거르고, Redis 세션으로 연결 상태를 관리
결과
중복 수신이 사라지고 데이터 무결성이 좋아짐

회고 및 개선 방향

시스템 구조
추천 로직이 한 서비스 안에 몰려 재사용이 어려웠다. 추천을 별도 서비스로 나누고 API Gateway, 캐싱 전략을 생각했다
정적 알고리즘의 한계
고정 가중치는 사용자 변화에 둔하다. 복용 이력, 만족도, 재구매 데이터를 반영하는 학습 기반 추천으로 바꾸고 싶다
테스트 자동화
점수 계산, 결제, 구독 분기처럼 흐름이 복잡한데 테스트가 부족했다. 예외 시나리오 중심의 통합 테스트를 갖추려 한다
AI 연계
식단, 운동, 수면까지 넓히고 대화형 문진이나 AI 상담을 붙여 보고 싶다