
Architecture
사용자 입력
감정을 담은 글
GPT-4.1-mini
감정 분석 · 시드곡 생성
Last.fm
협업 필터링 확장
iTunes Search
재생 가능 트랙 해석
지역 쿼터 선정
한국:팝:일본 6:3:1
Immerse
감정 심취 20곡
Soothe
감정 완화 20곡
Introduce
사용자가 입력한 일기나 짧은 글을 GPT-4.1-mini로 분석해, 감정에 더 깊이 몰입하는 Immerse와 감정을 부드럽게 전환하는 Soothe 두 가지 모드로 플레이리스트를 큐레이션하는 서비스입니다. Last.fm 협업 필터링으로 추천 폭을 넓히고 iTunes Search API로 30초 미리듣기를 제공하며, Turborepo 기반 모노레포로 프론트엔드와 백엔드를 함께 관리했습니다.
기술적 도전 — Spotify에서 iTunes로
서비스 운영 중 Spotify가 개발자 정책을 변경(Premium 계정 강제, 신규 앱 심사 제한)하면서, 음악 추천 파이프라인을 iTunes Search API로 완전히 이전했습니다. 이 과정에서 한국→미국→일본 순으로 국가를 폴백하는 로직이 rate limit 상황에서 오히려 호출을 3배로 증폭시키고, 일시적 429 오류가 6시간 캐시에 그대로 저장되어 특정 아티스트가 장시간 추천에서 사라지는 결함을 발견해 수정했습니다. 상태 코드를 정상 / 일시적 오류 / rate limit으로 구분해 처리하도록 재설계한 결과, 트래픽이 몰리는 상황에서도 추천 수율 20/20을 유지합니다.
측정 기반 응답시간 최적화
체감이 아닌 실측으로 최적화하기 위해 단계별 타이밍 로그를 추가해 병목을 분해했습니다(GPT 호출 52%, 외부 API 순차 호출 48%). SSE 기반 병렬 처리를 도입해 API 호출 구간을 8.6초에서 4.5초로 줄이고, GPT 출력 아티스트 수를 40명에서 25명으로 줄여 응답시간을 17.9초에서 11.6초로 35% 단축했습니다. 최적화 과정 내내 추천 수율(20/20)이 그대로 유지되는지 매 단계 검증했습니다.
※ 이 수치는 Last.fm 도입(2026.07.25) 이전, 아티스트를 GPT가 직접 큐레이션하던 구조 기준입니다. [timing] 계측 코드는 지금도 동작하지만, 40→25명 자체는 현재의 시드 기반 구조와는 다릅니다.
정량 지표로 검증한 추천 품질
"몰입 모드와 완화 모드가 잘 구분되지 않는 것 같다."는 체감 피드백을 검증하기 위해, 두 플레이리스트 간 장르 라벨 중복률을 측정하는 자체 지표(mode-separation)를 만들었습니다. 이 지표로 기쁨·슬픔 감정에서 두 모드가 실제로 30~70%까지 겹친다는 것을 수치로 확인했고, 원인이 City Pop 같은 일부 장르가 iTunes에서 K-Pop·J-Pop으로 라벨링되며 서로 충돌하는 데 있다는 것을 밝혀 수정했습니다. 12개 감정을 전수 재측정해 한 번의 이상치(50%)가 노이즈였음을 확인하는 등, 감이 아니라 재측정으로 결론을 검증하는 원칙을 지켰습니다.
기쁨
슬픔
놀람
※ 로컬에서 실행 후 감정 분석을 요청하면 서버 콘솔에 [mode-separation] 로그로 재현할 수 있습니다.