ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오클라우드 - 클라우드 개발자 교육 18주차 후기
    bootcamp 2026. 3. 29. 21:31

     

    이번 주는 프로젝트의 핵심 기능 구현이 폭발적으로 이루어진 주간이었습니다. 4개 서비스에 걸쳐 총 108개 커밋이 푸시되었으며, 포인트/결제 시스템 전체 구현, JWT 인증 체계 구축, 프론트엔드 대규모 페이지 개발, Hybrid LLM 전환, 코드 리뷰 및 보안 강화까지 수행했습니다.

     포인트/결제/쿼터 시스템을 하루 만에 전체 구현한 주입니다. AI Agent가 이미 Backend의 포인트 API를 호출하도록 구현되어 있었으나,  Backend에는 엔티티만 존재하고 실제 서비스 계층이 없는 상태였기에 이를 완성했습니다

     

    Backend 전체에서 공통으로 사용할 인프라 계층을 구축했습니다.                                                                                                  
                      
      - ErrorCode + BusinessException: 에러 코드 체계화 (P001~P005 포인트, A001~A007 인증)                                                                          
      - GlobalExceptionHandler: @RestControllerAdvice로 일관된 에러 응답
      - ApiResponse<T>: 성공/실패 래퍼 DTO                                                                                                                          
      - ServiceKeyAuthFilter: AI Agent ↔ Backend 간 X-Service-Key 헤더 인증                                                                                         
      - SecurityConfig: JWT 필터 + ServiceKey 필터 등록, /api/v1/auth/** permitAll  

     

    등급별 쿼터 설계:                                                                                                                                             
                                                                                                                 
      │   등급   │ 일일 AI │ 무료 일일 │ 입력 글자수 │ 누적 포인트 조건 │                                   
      │ BRONZE   │ 3회     │ 0         │ 200자       │ 0~999            │                                                                               
      │ SILVER   │ 10회    │ 2회       │ 500자       │ 1,000~4,999      │                                                                                 
      │ GOLD     │ 30회    │ 5회       │ 1,000자     │ 5,000~19,999     │                                                                            
      │ PLATINUM │ 무제한  │ 10회      │ 2,000자     │ 20,000+          │

     

    Toss Payments REST API 기반 결제 시스템을 구현했습니다.                                                                                                       
      
      - DDL + 엔티티: subscription_plans, user_subscriptions, payment_orders 3개 테이블                                                                             
      - 구독 상품 4종: monthly_basic(3,900원/3,000P) ~ yearly_premium(79,000원/100,000P)
      - TossPaymentsClient: RestClient 기반, Basic Auth 인증                                                                                                        
      - 결제 흐름: Client 주문 생성 → Toss 결제창 → Backend @Transactional 확인 → 포인트 적립

     

    포인트/결제처럼 금전과 관련된 도메인은 정합성이 매우 중요합니다. 비관적 락(SELECT FOR UPDATE)으로 동시 차감을 방지하고, 이중 기장(balance=캐시,               
      history=원장)으로 데이터 무결성을 보장하는 패턴을 적용했습니다. INSERT-ONLY 이력 테이블을 사용하면 감사 추적(audit trail)도 자연스럽게 해결됩니다.

     

    E2E 테스트 수행 및 후속 수정                                                                                                                                  
                      
      Claude Computer Use와 playwright를 활용한 자동화 E2E 테스트 20건을 수행했습니다.                                                                                           
      - 결과: 14 PASS, 3 PARTIAL, 1 FAIL, 2 SKIP
      - 후속 수정: 404 페이지 미구현(TC-20) 즉시 수정, MYPAGE 경로 수정, 위시리스트 API 분리

     

     

    팀원 PR 충돌 해결 (3건)                                                                                                                                       
                                                                                                                                                                    
      팀원들의 PR에서 발생한 코드 충돌을 해결하고 머지했습니다.                                                                                                     
      - 이민수 (Client PR #3): 커뮤니티 테스트 변경 충돌
      - 정한나 (Client PR #9): 검색타입 + FastAPI 연동 충돌                                                                                                         
      - 정한나 (Recommend PR #4): config.py + 의존성 충돌  

     

     

     

     

    1. Hybrid LLM 전환 + 고객센터 API + E2E V4 검증
                                                                                                                                                                    
      수행 내용
                                                                                                                                                                    
      Hybrid LLM 아키텍처 전환 (Phase M-LLM)
                                                                                                                                                                    
      프로젝트의 가장 큰 기술적 전환점이었습니다. 기존 로컬 전용(EXAONE 32B, 40GB VRAM) 모드에서 Hybrid 모드로 전환하여, 응답 시간을 3분+ → ~10초로 대폭            
      단축했습니다.
                                                                                                                                                                    
      Hybrid LLM 아키텍처:
      Agent (localhost:8000) — LLM_MODE=hybrid
        ├→ Solar API (api.upstage.ai)    — 의도분류, 감정분석, 선호추출, 추천이유
        ├→ Ollama EXAONE 1.2B (LoRA)    — 일반대화, 후속질문 (몽글이 페르소나)                                                                                      
        └→ Ollama (fallback)             — Solar/vLLM 장애 시                                                                                                       
                                                                                                                                                                    
      몽글이 LoRA 파인튜닝 결과:                                                                                                                                    
               
      │      단계       │                     내용                     │    결과    │                                                                               
      │ 학습 데이터     │ 467쌍 (페르소나 207 + 질문 160 + 도메인 100) │ 생성 완료  │
      │ Mac MLX 학습    │ 500 iter, loss 1.7→0.4                       │ 41.1 tok/s │           
      │ T4 PyTorch 학습 │ 81 step, loss 0.34                           │ 5분 38초   │                               
      │ 평가            │ 속도 41.1 tok/s, 페르소나 일치율 77%        │ PASS       │

     

      성능 비교:                                                                                                                                                    
                                                                                                                     
      │      지표      │ V3 (local_only) │ V4 (hybrid) │ 개선율 │                                                                                                
      │ 채팅 응답 시간 │ 3분+ (타임아웃) │ ~10초       │ 18배↑  │
      │ GPU VRAM 사용  │ ~40GB           │ ~2.4GB      │ 94%↓   │                                                                                          
      │ 일반 대화 속도 │ ~5 tok/s        │ ~41 tok/s   │ 8배↑   │                                                                                                                                                                                                 

     

    결론 : 파인튜닝 실패. llm을 파인튜닝해 페르소나를 부여 하는것보단 model_prompt 등을 통해 페르소나를 부여하고, 현재 프로젝트의 요구사항에서 모델 파인튜닝 기법을 사용하려면 다른 목적을 가지고 튜닝을 해야할것 같다.
                      
      Backend: 고객센터 + 시청이력 API + JWT 쿠키 전환                             
      - 고객센터 API 8건: FAQ 목록/상세, 도움말, 티켓 생성/목록/상세/답변, 카테고리                                                                                 
      - 시청이력 API: CRUD + 통계 엔드포인트
      - JWT 쿠키 전환: Access Token을 HttpOnly 쿠키로 전환하여 XSS 공격 벡터 제거                                                                                   
      - Swagger 마스터키: 개발 환경에서만 활성화되는 인증 바이패스 (운영 차단)                                                                                      
                                                                                                                                                                    
      구독 상품 + 결제 버그 수정 (4건)          
      │           문제           │          근본 원인          │             수정             │
      │ 구독 상품 0건 표시       │ is_active NULL (DDL 미지정) │ DB 강제 설정                 │
      │ DB 수정 후에도 0건       │ @Cacheable Redis 캐시       │ 캐시 어노테이션 제거         │                                                                    
      │ Redis 캐시 삭제 후 500   │ Serializable 미구현         │ implements Serializable 추가│       
      │ 결제 페이지 React 크래시 │ keyframe 문자열 보간        │ css 헬퍼 래핑                │                                                                 
                      
      E2E 테스트 V4 결과                                                                                                                                            
                     
      │  항목   │      V3       │      V4       │
      │ PASS    │ 80.0% (28/35) │ 93.3% (14/15) │
      │ PARTIAL │ 11.4% (4/35)  │ 0%            │                                                                                                   
      │ FAIL    │ 0%            │ 0%            │                                                                                                                                                                                                                            
      
      V3에서 해결된 핵심 이슈:                                                                                                                                      
      - 채팅 3분+ 타임아웃 → ~10초 (Hybrid LLM)
      - 고객센터 FAQ 404 → Backend API 8건 구현                                                                                                                     
      - 구독 상품 로딩 실패 → 4종 정상 렌더링  
                                                                                                                                                                    
      Client UX 개선                                                                                                                                                
      
      - 몽글이 캐릭터 UI: 채팅 화면에 몽글이 캐릭터 아바타 적용                                                                                                     
      - Clarification UI: 후속 질문 시 힌트 칩 버튼 인터랙션 개선
      - 새 대화 버튼: 채팅 세션 초기화 기능 추가                                                                                                                    
      - 뒤로가기 버튼: 채팅 화면 헤더에 네비게이션 추가                                                                                                             
      - Modal 시스템: 공통 Modal 컴포넌트 구축                                                                                                                      
                                                                                                            
      Hybrid LLM 전략이 핵심이었습니다. 모든 작업을 거대 모델(32B) 하나에 맡기면 GPU 비용과 응답 시간이 폭증합니다. 작업별로 적절한 모델을 배정하면 — 분류/추출은   
      API(Solar), 대화는 경량 모델(1.2B LoRA), 추천 이유는 대형 모델 — 비용과 성능을 동시에 최적화할 수 있습니다. 

     

      

    —————————————————————————— 
    본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 3기(B-log) 리뷰로 작성 되었습니다.

Designed by Tistory.