⚠️ 본 레포지토리는 팀 프로젝트 중 제가 담당한 기능을 중심으로 정리한 개인 포트폴리오입니다.
백엔드 관점에서 AI 추천 시스템의 안정성, 성능 최적화, 운영 환경 대응을 고민하며 개발한 프로젝트입니다.
AI 기반 향수 추천 플랫폼 FRAGMNT에서
백엔드 리더로 참여하며 추천 시스템 설계, AI 안정화 아키텍처 구축,
추천 성능 최적화 및 공유 시스템 개발을 담당했습니다.
FRAGMNT는 설문, 키워드, 이미지, 챗봇 데이터를 기반으로
개인 맞춤 향수를 추천하는 AI 기반 추천 플랫폼입니다.
단순 키워드 매칭이 아닌:
을 결합하여 실제 서비스 형태로 구현했습니다.
사용자 설문 데이터를 기반으로
5차원 취향 벡터를 생성하고 향수 프로필과 매칭하는 추천 엔진을 구현했습니다.
사용자 취향 벡터와 향수 프로필 간의
유클리드 거리(Euclidean Distance)를 계산하여 추천 정확도를 향상시켰습니다.
초기에는 사용자 선택 데이터와 향 데이터를 그대로 Gemini AI에 전달하여 추천 결과를 받는 방식을 사용했습니다.
하지만 모든 데이터를 AI에 넘기다 보니 응답까지 약 30초의 지연이 발생했고, 실서비스에서 사용하기 어려운 수준이었습니다.
여러 대안을 검토한 결과, 향수 DB 규모가 크지 않은 상황에서는
데이터가 적을 때 성능이 좋은 유클리드 거리 계산이 적합하다고 판단했습니다.
AI 없이도 벡터 간 거리만으로 빠르게 유사도를 측정할 수 있어 응답 지연 문제를 해결할 수 있었습니다.
def distance(p1, p2):
return math.sqrt(sum((p1[k] - p2[k])**2 for k in p1))
Top-3 후보군 중 랜덤 추천 방식을 도입하여
추천 정확도와 다양성을 동시에 확보했습니다.
유클리드 거리 기반 추천을 적용한 이후, 새로운 문제가 발생했습니다.
비슷한 취향 데이터가 입력되면 항상 동일한 향수가 추천되어 사용자가 반복적인 경험을 느끼는 현상이었습니다.
거리 계산 결과를 완전히 버리지 않으면서도 다양성을 확보하기 위해,
유사도 상위 3개 향수를 선별한 뒤 그 중 하나를 랜덤으로 출력하는 방식을 선택했습니다.
단순히 1위만 고정 추천하는 것보다 추천 신뢰도를 유지하면서도 결과의 다양성을 확보할 수 있었습니다.
return random.choice(sorted_scents[:3])
Gemini API 응답 실패 및 Timeout 상황 대응을 위해
3-Step Retry & Fallback 구조를 설계했습니다.
Gemini API를 사용하면서 외부 서버 상태에 따라 응답 실패 및 Timeout이 자주 발생했습니다.
이 경우 추천 기능 전체가 실패하여 사용자가 아무런 결과도 받지 못하는 상황이 생겼습니다.
단순히 에러를 반환하는 것보다, 재시도 → 모델 전환 → 기본 추천 순의 단계적 대응이 서비스 안정성에 더 적합하다고 판단했습니다.
Gemini AI 입력 전, 유클리드 거리로 유사도 상위 후보군을 먼저 추려
AI에 전달하는 데이터를 최소화했습니다.
모든 향수 데이터를 AI에 전달하면 불필요한 토큰이 낭비되고,
AI 응답 지연 및 Timeout 발생 가능성이 높아졌습니다.
candidates = sorted(scents, key=lambda s: distance(user_vector, s.profile_vector))[:N]
카카오톡 및 SNS 공유를 위한
OG(Open Graph) 메타데이터 제공 시스템을 구현했습니다.
question_id = encode_id(result_id)
expires_at = timezone.now() + datetime.timedelta(days=7)
기존 DB Primary Key가 외부에 그대로 노출될 수 있었고,
공유 데이터의 만료 관리도 필요했습니다.
Gemini AI 응답 생성 과정에서
응답 시간이 길어지며 사용자 경험이 저하되었습니다.
외부 AI 서버 상태에 따라
추천 기능 전체 실패가 발생했습니다.
이번 프로젝트를 통해:
을 깊이 경험할 수 있었습니다.
특히 단순 CRUD 구현보다:
을 고려한 백엔드 설계 역량을 키울 수 있었던 프로젝트였습니다.
초기 설계 단계에서 에러 포맷 규격화, API 응답 구조 표준화, 추천 로직 정확도 개선에 더 많은 시간을 투자했다면 협업 및 유지보수 효율을 더욱 높일 수 있었을 것이라 생각합니다.
하지만 AI 장애 대응, 추천 엔진 설계, 공유 시스템 구현, 운영 안정성 확보, 성능 최적화 등 실제 서비스 수준의 과제들을 직접 경험하며 단순 CRUD를 넘어선 백엔드 아키텍처 역량을 키울 수 있었던 프로젝트였습니다.
FRAGMNT
├── apps
│ ├── analysis
│ ├── chatbot
│ ├── core
│ ├── question
│ ├── scent
│ └── users
├── config
├── docker
├── nginx
├── requirements
└── manage.py