전체 글 191

[기술선택근거] LLM 모델 및 추론 강도 선정을 위한 성능 평가

Zelo(제로클릭 커머스)는 채팅 한 줄로 장보기를 끝내는 서비스다. 이 글은 그 안에서 사용자의 말을 "메뉴 계획"으로 정리하는 LLM을 어떤 모델로, 어떤 설정으로 쓸지를 어떻게 정했는지 기록한 것이다. 결론보다 왜 그렇게 측정했는지를 남기는 데 목적이 있다.1. 왜 모델 테스트를 다시 하게 되었나1-1. 서비스에서 LLM이 하는 일사용자가 이렇게 말한다고 하자.토요일에 초등학생 둘이랑 넷이 먹을 건데, 김치볶음밥 재료 3만 원 안에서 준비해 줘LLM은 이 말을 아래처럼 정해진 칸이 있는 객체(MenuPlan) 로 정리한다. 가격과 상품은 정하지 않는다. 그건 서버가 DB를 보고 계산한다.intent = SHOPPING_REQUEST (장보기 요청)menuName ..

AI/LLM 2026.10.23

팀 프로젝트(Zelo) - 리뷰 모델 변경 테스트 및 결정

LLM 모델 설정 변경 근거결론용도모델 · 추론 강도설정 위치일반 (메뉴 계획 · 채팅 설명)gpt-6-luna · lowspring.ai.openai.chat.model, spring.ai.openai.chat.reasoning-effort리뷰 한 줄 요약gpt-5-mini · medium (기존 그대로)zelo.llm.review-summary.model, zelo.llm.review-summary.reasoning-effort리뷰 요약의 medium은 gpt-5-mini의 기본값이다. 일반 설정의 low가 모든 요청에 섞이기 때문에, 예전과 같은 조건으로 보내려고 직접 적었다.시간 제한(zelo.llm.timeout)은 두 용도가 같이 쓴다. 12s로 올리는 것을 함께 제안한다 (아래 3장).1. ..

AI/LLM 2026.10.22

[Troubleshooting] Spring AI 2.0에서 OpenAI 타임아웃이 적용되지 않았던 이유

application.yaml에 OpenAI 타임아웃을 5초로 적어 두었는데, 실제 요청은 60초까지 기다리고 있었다. Spring AI 2.0.1이 요청을 보낼 때마다 타임아웃을 기본값 60초로 다시 덮어쓰기 때문이었고, 요청 옵션에 타임아웃을 직접 넣어 해결했다. 고친 뒤에는 1초로 설정하면 정확히 1.01초에 요청이 끊긴다.배경: 타임아웃이 왜 필요한가식당에서 주문하면서 "15분 안에 안 나오면 취소할게요"라고 정해 두는 것과 같다. 우리 서버가 OpenAI에 질문을 보내면 답이 올 때까지 기다리는데, OpenAI가 느리거나 장애가 나면 무한정 기다릴 수는 없다.사용자는 채팅창에서 계속 빈 화면을 본다.기다리는 동안 서버의 일꾼(요청 스레드)이 하나씩 묶인다. 이런 요청이 쌓이면 주문·결제 같은 다..

AI/Spring AI 2026.10.22

서킷 브레이커 이해하기: 외부 LLM API의 장애가 우리 서비스로 번지지 않도록

Zelo의 장보기 도우미 채팅은 사용자의 메시지를 받아 OpenAI(gpt-5-mini)를 호출하고, 그 결과를 AI 메시지로 저장해 응답한다. 그런데 OpenAI에 장애가 발생하면 어떻게 될까?사용자는 답변을 기다리고, 서버는 응답이 오지 않는 요청을 계속 처리해야 한다. 여기에 재시도까지 더해지면 장애가 발생한 외부 서비스에 요청이 반복해서 전달된다.이때 필요한 것이 서킷 브레이커(Circuit Breaker)이다.이 글에서는 서킷 브레이커가 언제 호출을 차단하고 어떻게 다시 허용하는지 개념을 먼저 정리하고, 각 개념이 우리 프로젝트 코드에서 어떻게 구현되었는지, 왜 그렇게 했는지를 함께 살펴본다.사용 기술: Spring Boot, Spring AI 2.0.1(OpenAI), Resilience4j ..

AI/Spring AI 2026.10.21

[Troubleshooting] OpenAI를 부르는 클래스의 테스트 커버리지가 0%였던 이유

OpenAI를 실제로 부르는 클래스 SpringAiLlmGateway의 테스트 커버리지가 CI에서 0%로 나왔다. 테스트를 분명히 작성했고 로컬에서는 통과했는데도 그랬다. 원인은 "테스트는 있었지만 CI에서는 한 번도 실행되지 않았다"는 것이었고, OpenAI와 통신하는 부품만 Mockito mock으로 바꾼 단위 테스트를 추가해 16줄 중 16줄을 덮었다.배경팀 프로젝트 Zelo(AI가 채팅으로 장보기를 대신해 주는 제로클릭 서비스)에서 AI·LLM 파트를 맡아서 LLM을 부르는 기반을 까는 작업을 하고 PR을 올렸었다.기술: Java 21, Spring Boot 4.1.1, Spring AI 2.0.1, OpenAI gpt-5-miniLlmGateway: LLM에게 묻는 창구 인터페이스SpringAi..

[기술선택근거] AI 채팅에 REST와 SSE를 선택한 이유

AI 쇼핑 채팅에 REST와 SSE를 선택한 이유사용자 요청은 REST로 처리하고, 실시간 진행 상황과 결과 전달에는 SSE를 활용한다.이번 프로젝트에서 AI와 대화하며 상품을 찾고, 견적을 받은 뒤 주문까지 연결하는 채팅 기능을 맡았다.채팅 구현 방식으로 REST, SSE, STOMP를 비교했다. 기술의 특징을 먼저 살펴보고, 우리 기능에 필요한 통신 방식이 무엇인지 기준으로 구현 방향을 정했다.01. REST — 요청을 보내고 응답을 받는다REST는 자원을 중심으로 API를 설계하는 아키텍처 스타일이다. 일반적으로 HTTP의 GET, POST 등의 메서드로 데이터를 조회하거나 생성한다.채팅에서는 사용자가 메시지를 보내면 서버가 AI와 도구를 호출하고, 완성된 답변을 HTTP 응답으로 반환하는 방식으로..

[Troubleshooting] SonarCloud 자동 분석과 GitHub Actions CI 분석 충돌 해결하기

1. 문제 상황GitHub Actions에서 테스트용 PostgreSQL을 준비한 뒤, SonarCloud 분석 과정에서 새로운 오류가 발생했다.워크플로에서는 다음 명령어로 빌드와 분석을 실행하고 있었다../gradlew build sonar --info발생한 오류 메시지는 다음과 같다.You are running CI analysis while Automatic Analysis is enabled.해석하면 “자동 분석이 활성화된 상태에서 CI 분석을 실행하고 있다”는 의미다.앞서 발생했던 PostgreSQL 연결 오류는 테스트 실행 환경의 문제였다. 이번에는 SonarCloud에 설정된 분석 방식과 GitHub Actions에서 실행하는 분석 방식이 충돌한 것이었다.원인을 이해하기 위해 먼저 각 도구의..

[TIL] 팀 프로젝트(Zelo) - 테스트 프로젝트 진행 및 초기세팅

한 줄 요약이번 주 팀 프로젝트는 참 재미있었다. 프로젝트: Zelo - 제로 클릭 커머스날짜: 2026-10-16오늘의 활동: 회의 / 문서 작업 / 구현 / 리뷰 / 테스트내 역할: 채팅 · 리뷰 추천 · LLM 통솔1. 오늘 한 일테스트 프로젝트 진행- 소나큐브 / 코드레빗 작동 확인- LLM 작동확인 및 모델 선택 - claude.md / agent.md 파일 생성본 프로젝트 세팅2. 논의한 내용과 결정 사항안건 1. 논의: 테스트 프로젝트에서 실제 서비스에서 쓸 LLM 모델을 코드레벨에서 비교해보기로 했다.결정: Open AI를 사용하기로 결정이유: 프로젝트 특성상 임베딩 모델을 사용할 수도 있기 떼문에 대한 기능을 지원하는 안건 2. 논의: 조금 더 저럼한 nano를 쓸 것인지, 조금 더 상위..

[Troubleshooting] GitHub Actions에서 발생한 Hibernate Dialect 오류 해결하기

1. 문제: SonarQube 분석 과정에서 테스트 실패테스트 Spring Boot 프로젝트에 SonarQube 분석을 적용하던 중 GitHub Actions에서 빌드가 실패했다.워크플로는 다음 명령어로 빌드와 분석을 실행하고 있었다../gradlew build sonar --info실패한 부분은 SonarQube의 코드 분석 자체가 아니라, build에 포함된 테스트 실행 단계였다. contextLoads() 테스트가 Spring 애플리케이션을 시작하는 과정에서 다음 오류가 발생했다.org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'entityManagerFactory'Unable to create..

[TIL] 팀 프로젝트(Zelo) - SA문서 작업 완료

한 줄 요약어렵고, 막막한데 재미있다! 프로젝트: 제로클릭 커머스날짜: 2026-10-15오늘의 활동: 회의 / 문서 작업 / 구현 / 리뷰내 역할: AI 채팅·리뷰 추천1. 오늘 한 일API 명세서 작성완료서비스 플로우차트 작성완료개발 협업 플로우 맞추기(진행)2. 논의한 내용과 결정 사항안건 1. 논의: 지라가 현업에서 많이 쓰인다고 해서 사용을 하기로 했었으나, 그것이 정말 효율적인가결정: 안 쓰기로 결정이유: 백엔드 코드에 관한 부분만 쓴다면 깃허브로만 쓰는 것이 훨씬 더 편안하고 효율적이다.지라를 쓸 것이라면 기획, 프론트부터 융합이 잘 되게 사용해야하는데 전반적인 의견은 백엔드에만 집중하자는 쪽이었기 때문이다.그리고 지라를 사용하면 외부에 공개가 안 되기 때문에 취업시에 약간의 아쉬움이 있을 ..