-
카카오클라우드 - 클라우드 개발자 교육 20주차 후기(4/6 ~ 4/10)bootcamp 2026. 4. 20. 14:09
대규모 재설계 — 이번 주 하루에 평균 커밋 40개
이번 주 커밋 요약
| 서비스 | 커밋 수 | 핵심 키워드 |
| Agent | 20건+ | Movie Match v3 (LLM 리랭커) · JWT HS512 · 추천 품질 popularity-aware · Clarification AI 카드 |
| Backend | 45건+ | 통계 12탭 · 결제 안전성 · 포인트 인벤토리 · OCR 실관람 인증 · 고객센터 챗봇 · 쿼터 check/consume 분리 |
| Client | 40건+ | 랜딩페이지 · 포인트 아이템 인벤토리 · Match v3 UI · OCR 모달 · 공지 UX 개편 · axios 공통 refresh |
| Recommend | 15건+ | Movie Match Co-watched CF · Elasticsearch 검색 · cast_members 컬럼 정합 |
| Admin | 12건+ | MovieSearchPicker 공통화 · vLLM 상태 카드 · 모니터링 접속 가이드 · 데이터 탭 정합화 |랜딩페이지 신규
`1430f93 feat: 랜딩페이지 신규 + 커뮤니티/홈/영화상세 기능 보강` + `88460a4 refactor: 랜딩페이지 UI 개선 + DiagramModal 신규` + `cdac579 feat(landing): 모바일 햄버거 메뉴 + 반응형 레이아웃 개선`
비로그인 유저가 처음 들어오면 "몽글픽이 뭐 하는 서비스인지" 를 3초 안에 이해시켜야 하는데, 기존엔 홈으로 바로 밀어넣어서 이탈률이 높았어요.랜딩페이지를 신설하고:
- Hero 섹션: "AI 가 골라주는 맞춤 영화"
- 기능 소개 4카드 (AI 추천 / 둘이 고르기 / 커뮤니티 / 도장깨기)
- DiagramModal — "몽글픽 아키텍처 한눈에" 라는 기술 스택 다이어그램을 클릭 시 띄움. 카카오 클라우드 교육 심사위원용 피치 의식
통계 12탭
관리자가 대시보드에서 볼 수 있는 지표:
1. overview — DAU/MAU/매출 요약
2. trends — 일/주/월 추이
3. recommendation — 추천 클릭률, 만족도
4. search — 검색어 TOP 100, 제로결과 쿼리
5. behavior — 세션 길이, 퍼널
6. retention — 코호트 리텐션 D1/D7/D28
7. revenue — 상품별/등급별 매출
8. subscription — 플랜별 구독자 수, 해지율
9. point-economy — 포인트 수급/소비 밸런스
10. ai-service — AI 호출 건수, 쿼터 소진율
11. community — 게시글/댓글/신고 추이
12. engagement / content-performance / funnel / churn-risk (서브탭)결제 안전성 수정 — 이게 진짜 핵심
운영에서 4/13 사용자 하루 구독 결제 "실패" 8건 이 그대로 노출되는 걸 발견. 원인 추적:
1. 사용자가 "구독하기" 버튼 클릭 → Backend `POST /payment/orders` 호출 → `Payment(status=PENDING)` 레코드 생성
2. Toss 결제창 오픈 → 사용자가 X 눌러 이탈
3. 30분 후 Scheduled job 이 PENDING → FAILED 전환
4. 사용자 "결제 내역" 탭에 "실패 8건" 표시 → 사용자 혼란
수정 (`de843f0 fix(payment): 사용자용 결제 내역에 PENDING/FAILED 숨김 — COMPLETED/REFUNDED 만 노출`):
- 사용자 노출: `COMPLETED` + `REFUNDED` 만
- 관리자 노출: 전체 상태
- `PENDING` → `FAILED` 전환은 유지하되 사용자에겐 숨김
트랜잭션 전파 버그도 같이 잡음
`57c649f fix(reward): 트랜잭션 전파 REQUIRES_NEW → REQUIRED + 도메인 예외 rethrow`
리워드 지급 로직이 `REQUIRES_NEW` 로 독립 트랜잭션 걸고 있었어요. 의도는 "메인 결제가 실패해도 리워드는 살리자" 였는데, 실제론:
- 결제 성공 → 리워드 지급 실패 → 트랜잭션 분리라 **결제는 커밋되고 리워드는 롤백
- 사용자 "결제했는데 포인트 안 들어와요!" CS 폭증 예정!!!
`REQUIRED` 로 바꿔서 한 트랜잭션으로 묶음. 리워드 실패 시 결제까지 롤백 → 사용자가 재시도하면 됨. 도메인 예외 rethrow 해서 상위에서 처리.Movie Match v3 재설계
하루에 Agent 만 5커밋, Backend 10+, Client 15+. 역대급으로 바쁜 하루.
3단계 구조
```
START → movie_loader → feature_extractor → query_builder → rag_retriever
→ llm_reranker(Solar) → match_scorer → explanation_generator → END
```
Step 1 — 인프라 기반 (`239ad10`)
- config.py 에 MATCH 관련 상수 확장 (`MATCH_TOP_K`, `MATCH_TIMEOUT`, `MATCH_LLM_MODEL`)
- `hybrid_search()` 에 **치명 버그 수정** — `vote_count` 필드명이 `rating` 으로 잘못 참조되고 있었음 (이게 2차 패치 4/15 E 항목으로 다시 튀어나옴)
- Prometheus 메트릭 `match_requests_total`, `match_duration_seconds`, `match_llm_reranker_*`, `match_cowatch_*` 추가
Step 2 — LLM 리랭커 + Co-watched CF (`69a6033`)
- `chains/match_llm_reranker.py` — Solar API 배치 스코어링
- `api/recommend_client.py` — Co-watched CF 호출
Solar 프롬프트 구조:
```
두 영화 A, B 를 모두 좋아한 커플에게 후보 영화 C 를 추천할 때,
0~1 점수로 "둘 다 만족할 가능성" 을 매겨라.
점수만 JSON 으로: {"score": 0.83}
```
배치 크기 10개씩 병렬 호출. 10초 타임아웃 초과 시 fallback.
Step 3 — 가중합 스코어링 공식 (`b203f40`)
```python
final = 0.5 * llm + 0.3 * harmonic + 0.2 * cf
harmonic_sim = harmonic_mean(s1, s2) * (0.7 + 0.3 * (1 - abs(s1 - s2)))
```
왜 harmonic_mean 인가.
두 유저 취향이 한쪽만 강하게 맞으면 산술평균은 높게 나옵니다:
- `(0.9, 0.1) → 평균 0.5`
- `(0.5, 0.5) → 평균 0.5`
둘 다 평균은 같지만 커플 관점에선 전자가 훨씬 나쁨 (한 명만 만족). harmonic_mean 은:
- `(0.9, 0.1) → harmonic 0.18`
- `(0.5, 0.5) → harmonic 0.50`
낮은 값에 페널티를 줘서 "둘 다 고르게 맞는" 영화를 위로 올려요. 추가로 `(0.7 + 0.3 * (1 - |s1-s2|))` 보정으로 격차가 크면 더 감점.
Step 4 — Top-K 복귀 (`f2c31d1`)
초기 Match v3 는 `MATCH_TOP_K=3` 으로 출시했는데, 실 UX 검증에서 **"커플이 고를 땐 5편이 더 낫다"** 는 피드백. 3→5 로 복귀.
Recommend 쪽 Co-watched CF EP
`0ad0183 feat(match): Movie Match Co-watched CF API — /api/v2/match/co-watched 신규`
```sql
SELECT m.movie_id, COUNT(*) as cowatch_count
FROM reviews r1
INNER JOIN reviews r2 ON r1.user_id = r2.user_id
INNER JOIN reviews r3 ON r1.user_id = r3.user_id
WHERE r1.movie_id = :movie_a AND r2.movie_id = :movie_b
AND r3.movie_id NOT IN (:movie_a, :movie_b)
AND r3.rating >= 4.0
JOIN movies m ON r3.movie_id = m.movie_id
GROUP BY m.movie_id
ORDER BY cowatch_count DESC
LIMIT 50
```
- Redis 5분 TTL 캐시
- 평점 4.0 이상만 집계 (단순 시청 ≠ 추천)
- 결과 없을 수도 있음 (Cold Start 무비) → Agent 쪽 fallback
전체 메트릭
```
match_requests_total{status="success|failure"}
match_duration_seconds (histogram, buckets: 1/3/5/10/30)
match_llm_reranker_duration_seconds
match_llm_reranker_errors_total
match_cowatch_cache_hit_total / match_cowatch_cache_miss_total
match_candidate_source_total{source="vector|es|neo4j|cowatch"}
```========배포=======
실제로 터진 사고 3건
① Broken pipe — 카카오 클라우드 프록시점프 경유로 1.1GB Agent tar 를 네트워크 이슈로 장시간 전송하다 SSH timeout.
```bash
# 실패
tar czf - . | ssh -J bastion target "cat > /tmp/agent.tar.gz"
# 수정
rsync --partial --progress -e "ssh -J bastion" agent.tar.gz target:/tmp/
```
`rsync --partial` 로 중단 지점부터 재개 가능하게.
② VM2 디스크 94% 사용률 — Agent 이미지 1.1GB 로드하는데 공간 부족. 임시로 `docker image prune -a --filter "until=168h"` 로 구 이미지 청소. 근본적으로는 Agent Dockerfile 을 slim 으로 리팩토링해야 함 (현재 `python:3.12` + 전체 deps + mock 데이터까지 포함).
③ `.env` 누락으로 Backend 16회 재시작 — CLAUDE.md 에 `"env.prod 수정 후 반드시 cp .env.prod .env"` 경고가 있었는데 놓침. 컨테이너가 `JWT_SECRET=null` 로 시작 → 10초 후 crash → restart → 반복. 로그 보고 나서야 발견. 멍청멍청주간 회고
### 지표
- PR: 조직 레포 40+건 머지
- 운영 배포: 1회 (5-서비스 일괄)
- 신규 기능: Movie Match v3 · OCR 인증 · 고객센터 챗봇 · 포인트 인벤토리 · Clarification AI 카드 · 공지 UX 개편
### 잘한 것
- Movie Match v3 재설계 — 피드백 반영해서 LLM 리랭커 + Co-watched CF 로 진정한 커플 추천 구현
- JWT 이슈 근본 원인까지 추적 — 진단 로그 없었으면 일주일 더 걸렸을 것
- 추천 품질 2차 패치 — 1차로 끝내지 않고 운영 지표 보면서 2차 개편 진행
- Clarification 구조화 출력 — Solar `with_structured_output` 활용한 첫 프로덕션 케이스
### 못한 것
- 하루에 너무 많이 몰아넣음 — 4/15 하루에 22+12+26+5+4 파일 변경. 리뷰 품질 떨어짐
- 배포 자동화 부재 — `.env` 누락 같은 휴먼 에러 방지 불가
- VM2 디스크 관리 방치 — 매 배포마다 prune 해야 함
- OCR 자동 추출 미완 — 수동 검토만 가능한 반쪽 기능
### 다음 주 목표 (발표 주간)
- 중간 발표 PPT + 대본 준비
- 테스트 현황 발표 대응 문서 작성
- 예상 Q&A 10선 준비
- 운영 배포 자동화 스크립트 (`scripts/deploy-prod.sh`) — 발표 후——————————————————————————
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 3기(B-log) 리뷰로 작성 되었습니다.'bootcamp' 카테고리의 다른 글
카카오클라우드 - 클라우드 개발자 교육 22주차 후기 (4/20 - 4/24) (0) 2026.04.24 카카오클라우드 - 클라우드 개발자 교육 21주차 후기 (4/13 ~ 4/17) (1) 2026.04.20 카카오클라우드 - 클라우드 개발자 교육 19주차 후기(3/30 ~ 4/3) (0) 2026.04.20 카카오클라우드 - 클라우드 개발자 교육 18주차 후기 (0) 2026.03.29 카카오클라우드 - 클라우드 개발자 교육 17주차 후기 (0) 2026.03.29