Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in
  • I intern-homework-was
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
    • Locked files
  • Issues 2
    • Issues 2
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 1
    • Merge requests 1
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Metrics
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • mingyeong.cha
  • intern-homework-was
  • Issues
  • #11
Closed
Open
Issue created Sep 23, 2026 by mingyeong.cha@mingyeong.chaOwner

[bug] LLM 호출 기록 실패 시 성공한 채팅이 error 이벤트로 끝남

name: Bug Report
labels: 'Type : Bug'

버그 내용

LLM 호출 기록(llm_call_logs)이 실패하면, 성공한 채팅이 error 이벤트로 바뀐다.

발생 상황

  • POST /api/chat 스트리밍이 정상 종료되어 done 단계에서 호출 기록을 남길 때
  • 기록이 제약 위반 등으로 실패하는 경우 (예: 제공자가 모델명을 주지 않고 설정값도 비어 model이 null)

실제 결과

  • LlmCallLogger.record() 가 try/catch 로 감싸져 있는데도 예외가 호출자에게 전파된다
  • 응답은 이미 정상 생성됐는데 사용자에게는 error 이벤트가 내려간다
  • 원인: save() 의 INSERT 가 커밋까지 미뤄져(PK 를 자바에서 생성) 제약 위반이 메서드를 빠져나간 뒤 터진다. 같은 빈 안의 catch 로는 잡을 수 없다
  • saveAndFlush 로 바꿔도 부족하다 — flush 실패로 트랜잭션이 롤백 표시되고 커밋 시점에 다시 예외가 난다

추가 정보

  • 재현 로그 PROBE 예외 탈출: DataIntegrityViolationException Caused by: ERROR: null value in column "model" of relation "llm_call_logs" violates not-null constraint
  • 해결: 트랜잭션 경계를 빈으로 분리한다
  • LlmCallLogWriter — @Transactional(REQUIRES_NEW) 로 쓰기만 담당
  • LlmCallLogger — 프록시 호출 후 예외를 삼킨다 (커밋까지 write() 안에서 끝남)
  • 회귀 테스트는 #10 에 포함 (LlmCallLoggerTest)
  • 관련: #9 (closed)
Assignee
Assign to
Time tracking