Skip to content

v 3.6.1 - #435

Merged
GulSauce merged 2 commits into
mainfrom
develop
Sep 8, 2026
Merged

GulSauce merged 2 commits into
mainfrom
develop

Conversation

@GulSauce

@GulSauce GulSauce commented Sep 8, 2026

Copy link
Copy Markdown
Member

No description provided.

GulSauce and others added 2 commits September 8, 2026 16:27
* [ICC-415] 🐛 fix: 메서드 불일치 요청이 500으로 응답되던 문제 수정

@ControllerAdvice 의 @ExceptionHandler 가 Spring 내장
DefaultHandlerExceptionResolver 보다 먼저 돌기 때문에,
HttpRequestMethodNotSupportedException 이 캐치올 Exception 핸들러에
잡혀 405 대신 500 + ERROR 로그로 나가고 있었다.

- HttpRequestMethodNotSupportedException 전용 핸들러 추가 (405 + WARN)
- RFC 9110 이 요구하는 Allow 헤더를 지원 메서드로 채움
- ExceptionMessage.METHOD_NOT_ALLOWED 추가

캐치올 500 ERROR 에 진짜 미처리 예외만 남게 되어,
ERROR 로그 기반 알림의 신뢰도가 올라간다.

* [ICC-415] ⚡ perf: 보류 문항 재생성 병렬화 및 생성 흐름 4단계 구조화

보류 문항 재생성이 직렬이라 건당 40~280초가 그대로 누적됐다.
실측 세션 하나에서 9건이 11분 27초를 먹어 전체 16분 11초 중
대부분을 차지했고, 이 때문에 세션이 스테일 정리 임계를 넘겼다.

- 워커가 heldQueue 를 poll 로 나눠 소비하도록 변경
  (항목 간 순서 의존이 없고 conversation 은 읽기 전용)
- 목표 문항 수 초과 저장은 Semaphore 티켓 선점으로 차단,
  산출 실패 시 반납해 다음 항목이 쓰게 한다
- 동시성 상한을 30 으로 상향
  Vertex 는 generateContent 에 동시성 쿼터를 두지 않고(RPM·TPM 만),
  quizCount 최대가 30 이라 작업 개수가 곧 상한이다
- run() 을 캐시 생성 → 퀴즈 생성 → 평가 → 재생성 4단계로 정리하고
  각 단계에 딸린 메서드를 구역으로 모음

같은 조건에서 재생성 구간이 11분 27초 → 약 3분으로 줄어든다.

* [ICC-415] 🐛 fix: 정리 스케줄러가 진행 중인 생성 세트를 삭제하던 문제 수정

STALE_THRESHOLD_MINUTES 가 10분이라 그보다 오래 걸린 생성이
"방치된 GENERATING"으로 판정돼 삭제됐다. 스케줄러는 DB 행만 지우고
생성 스레드에는 아무 신호도 보내지 않으므로, 세션은 이미 사라진 세트에
저장을 시도하다 finalizePartialSuccess 에서 터졌다.

7일 관측: 세션 40건 중 10분 초과 12건, 그중 11건이 결과물 전손.

- 임계를 15분으로 상향 (세션 시한 10분 + 여유)
- 부하 하네스가 같은 쿼리를 태우므로 Mock 구현도 동기화
- 로그·javadoc·테스트 표기의 "10분"을 함께 정정

세션 시계는 세트 createdAt 보다 늦게 출발하고 스케줄러 판정도
주기(1분)만큼 밀리므로, 두 값을 같게 두면 경계에서 다시 재현된다.
그 근거를 상수 주석에 남겼다.

* [ICC-415] 🔧 chore: 운영에서 무효인 chat-timeout-ms 설정 제거

세션급 시한을 의도한 값이었지만, GeminiClientConfig 가
customHttpClient 를 쓰면 SDK 가 HttpOptions.timeout 을 건너뛰므로
운영 경로에서는 아무 효력이 없었다. 값을 조정해도 동작이 변하지 않아
설정과 실제가 어긋나 있었다.

- q-asker.ai.chat-timeout-ms 및 QAskerAiProperties.chatTimeoutMs 삭제
- test/mock 클라이언트의 httpOptions 도 제거
  (실제 호출을 하지 않는 스텁이라 시한을 걸 대상이 없다)

실효 시한은 OkHttpClient 에 직접 건 connect/read/call 세 계층만 남는다.
다시 HttpOptions.timeout 을 붙이려는 시도를 막도록 경고 주석은 유지.

* [ICC-415] 💡 docs: 커넥션 풀·톰캣 기본값 명시 및 prod keepalive 단축

값을 조정할 때 출발점이 무엇이었는지 보이도록, 지금까지 미설정으로
기본값에 맡기던 항목을 그대로 적어뒀다. 동작은 대부분 동일하다.

- database-config.yml: HikariCP 7.0.2 기본값 명시
  가상 스레드라 요청 동시성엔 상한이 없어 실질 처리량은
  maximum-pool-size(10)가 결정한다는 점, minimum-idle 을 숫자로
  박은 이상 풀을 키울 땐 둘을 함께 올려야 한다는 점을 남김
- app-common.yml: Tomcat 11.0.22 기본값 명시
  가상 스레드가 켜져 있어 threads.max/min-spare 는 적용되지 않는다
- prod 만 keepalive-time 60000 으로 오버라이드 (기본 120000)
  무트래픽 시간대에 DB 가 내려갔을 때의 탐지 지연을 절반으로 좁힌다
- CLAUDE.md 설정 파일 설명과 JUnit 버전 갱신
- Alloy 인스턴스 스펙 표기 정정 (8GB → 10GB)
@GulSauce
GulSauce merged commit 120b789 into main Sep 8, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant