fix(backend): Spring 6.1 RestClient bean 모호성 기동 실패 해소 #79

병합
htlee hotfix/backend-parameters-flag 에서 develop 로 1 commits 를 머지했습니다 2026-04-17 07:42:10 +09:00
소유자

증상

운영 rocky-211 kcg-ai-backend 가 2026-04-17 07:33 재기동 후 다음 에러로 크래시 루프:

APPLICATION FAILED TO START
Parameter 0 of constructor in PredictionProxyController required a single bean,
but 2 were found: predictionRestClient, signalBatchRestClient

PR #A(2026-04-17) 에서 RestClientConfig 로 두 Bean 을 분리한 이후 잠복해 있던 문제로, PR #72 머지 시점부터 재기동만 안 해서 겉보기엔 정상 동작 중이었음. 오늘 릴리즈(#72/#73/#75) 이후 restart 시 발현.

원인

PredictionProxyController / VesselAnalysisProxyController필드@Qualifier("predictionRestClient") 가 달려있지만, Lombok @RequiredArgsConstructor 가 만든 constructor parameter 에는 해당 annotation 이 복사되지 않음. Spring 6.1 이후는 parameter level annotation 으로 bean 을 식별하도록 바뀌어 모호성이 해결되지 않음.

수정

  1. backend/pom.xmlmaven-compiler-plugindefault-compile / default-testCompile configuration 에 <parameters>true</parameters> 명시 추가. spring-boot-starter-parent 의 기본값이 executions override 로 덮이지 않도록 함.
  2. backend/src/main/java/lombok.config (신규) — lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier. Lombok 이 필드의 @Qualifier 를 생성된 constructor parameter 에 복사해 Spring 이 해당 bean 을 식별 가능하게 함.

검증

  • javap -v PredictionProxyController.class 에서 생성자의 RuntimeVisibleParameterAnnotations@Qualifier("predictionRestClient") 복사 확인
  • 재빌드 후 rocky-211 에 배포·재시작 → Started KcgAiApplication in 7.333 seconds + Tomcat started on port 18080 (http) 정상 기동
  • 운영 /api/analysis/gear-collisions/stats 엔드포인트 응답(인증 없이 401 UNAUTHENTICATED — 라우팅 정상)

배포 상태

이미 운영 jar 에 수정 반영 완료. 이 PR 은 소스 추적 동기화 목적.

## 증상 운영 rocky-211 `kcg-ai-backend` 가 2026-04-17 07:33 재기동 후 다음 에러로 **크래시 루프**: ``` APPLICATION FAILED TO START Parameter 0 of constructor in PredictionProxyController required a single bean, but 2 were found: predictionRestClient, signalBatchRestClient ``` PR #A(2026-04-17) 에서 `RestClientConfig` 로 두 Bean 을 분리한 이후 잠복해 있던 문제로, PR #72 머지 시점부터 재기동만 안 해서 겉보기엔 정상 동작 중이었음. 오늘 릴리즈(#72/#73/#75) 이후 restart 시 발현. ## 원인 `PredictionProxyController` / `VesselAnalysisProxyController` 의 **필드** 에 `@Qualifier("predictionRestClient")` 가 달려있지만, Lombok `@RequiredArgsConstructor` 가 만든 constructor parameter 에는 해당 annotation 이 복사되지 않음. Spring 6.1 이후는 parameter level annotation 으로 bean 을 식별하도록 바뀌어 모호성이 해결되지 않음. ## 수정 1. `backend/pom.xml` — `maven-compiler-plugin` 의 `default-compile` / `default-testCompile` configuration 에 `<parameters>true</parameters>` 명시 추가. spring-boot-starter-parent 의 기본값이 executions override 로 덮이지 않도록 함. 2. `backend/src/main/java/lombok.config` (신규) — `lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier`. Lombok 이 필드의 `@Qualifier` 를 생성된 constructor parameter 에 복사해 Spring 이 해당 bean 을 식별 가능하게 함. ## 검증 - `javap -v PredictionProxyController.class` 에서 생성자의 `RuntimeVisibleParameterAnnotations` 에 `@Qualifier("predictionRestClient")` 복사 확인 - 재빌드 후 rocky-211 에 배포·재시작 → `Started KcgAiApplication in 7.333 seconds` + `Tomcat started on port 18080 (http)` 정상 기동 - 운영 /api/analysis/gear-collisions/stats 엔드포인트 응답(인증 없이 401 UNAUTHENTICATED — 라우팅 정상) ## 배포 상태 이미 운영 jar 에 수정 반영 완료. 이 PR 은 **소스 추적 동기화** 목적.
htlee added 1 commit 2026-04-17 07:41:32 +09:00
증상: rocky-211 의 kcg-ai-backend 가 `No qualifying bean of type RestClient,
but 2 were found: predictionRestClient, signalBatchRestClient` 로 기동 실패 반복.
PR #A 의 RestClientConfig 도입 이후 잠복해 있던 문제로, PredictionProxyController /
VesselAnalysisProxyController 의 필드 @Qualifier 가 Lombok `@RequiredArgsConstructor`
가 만든 constructor parameter 로 복사되지 않아 Spring 6.1 의 bean 이름 fallback 이
실패한 것.

- backend/pom.xml — default-compile / default-testCompile 의 configuration 에
  `<parameters>true</parameters>` 추가. spring-boot-starter-parent 기본값을 executions
  override 과정에서 덮어쓰지 않도록 명시.
- backend/src/main/java/lombok.config — `lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier`.
  Lombok 이 필드의 @Qualifier 를 생성된 constructor parameter 로 복사해야 Spring 이
  파라미터 레벨 annotation 으로 해당 bean 을 식별할 수 있음.

검증: javap 로 PredictionProxyController 생성자의 RuntimeVisibleParameterAnnotations 에
@Qualifier("predictionRestClient") 가 실제 복사되었는지 확인, 재빌드/재배포 후 rocky-211
기동 성공("Started KcgAiApplication in 7.333 seconds") + Tomcat 18080 정상 리스닝.
claude-bot 이 변경사항을 승인하였습니다. 2026-04-17 07:42:09 +09:00
claude-bot left a comment
멤버

운영 복구 hotfix 승인 (via /release follow-up)

운영 복구 hotfix 승인 (via /release follow-up)
htlee merged commit b1bd6e507a into develop 2026-04-17 07:42:10 +09:00
htlee 삭제된 브랜치 hotfix/backend-parameters-flag 2026-04-17 07:42:10 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

마감일이 설정되지 않았습니다.

의존성

No dependencies set.

Reference: gc/kcg-ai-monitoring#79
No description provided.