Skip to content

[ICC-380] ✨ feat: 오픈 Renovate PR 6건 통합 승격 + Spring Boot 4.1 마이그레이션#305

Merged
GulSauce merged 1 commit into
developfrom
ICC-380
Jul 4, 2026
Merged

[ICC-380] ✨ feat: 오픈 Renovate PR 6건 통합 승격 + Spring Boot 4.1 마이그레이션#305
GulSauce merged 1 commit into
developfrom
ICC-380

Conversation

@GulSauce

@GulSauce GulSauce commented Jul 3, 2026

Copy link
Copy Markdown
Member

Q-Asker API — 2026-07-04 대규모 의존성 승격·마이그레이션 변경점

커밋: 0b57c819 (squash 결과), 41 files changed, 2530 insertions(+), 2143 deletions(-)
브랜치: ICC-380develop 병합 대기
작업 시간: 약 6시간 (스파이크 포함)
주도: 오픈 Renovate PR 6건 통합 반영 + Spring Boot 4.1.0 정식 마이그레이션


목차

  1. 반영 버전 요약
  2. Spring Boot 3.5.8 → 4.1.0
  3. Spring AI 1.1.2 → 2.0.0
  4. Jackson 2.x → 3.x 전면 이전
  5. JDK 21 → 25 (컨테이너 base)
  6. Resilience4j 2.3.0 → 2.4.0
  7. SpringDoc 2.8.17 → 3.0.3
  8. 문서 처리 라이브러리 patch (pdfbox, jodconverter)
  9. Google Cloud + Jib patch
  10. 코드 품질·인프라 개선
  11. Boot 4 auto-config 재편의 대가
  12. 남은 후속 티켓

반영 버전 요약

컴포넌트 이전 신규 Semver
spring-boot 3.5.8 4.1.0 MAJOR
spring-ai 1.1.2 2.0.0 MAJOR
google-cloud-bom 26.67.0 26.84.0 MINOR
jib (Gradle plugin) 3.4.0 3.5.3 MINOR
jodconverter 4.4.9 4.4.11 PATCH
pdfbox 3.0.3 3.0.7 PATCH
resilience4j-spring-boot3 2.3.0 2.4.0 + spring-boot4 모듈로 참조 교체 MINOR + module swap
Temurin base image 21-jdk-noble 25.0.2_10-jdk-noble MAJOR
springdoc-openapi 2.8.17 3.0.3 MAJOR

Spring Boot 3.5.8 → 4.1.0 (MAJOR)

하부 스택 자동 승격

Boot BOM 승격으로 다음이 함께 올라감:

  • Spring Framework: 6.2.x → 7.0.8 (Java 21+ 최적화, MethodHandle 개선, RestClient 표준화)
  • Hibernate ORM: 6.x → 7.4.1.Final (Jakarta 3.2, 성능 개선)
  • Spring Data JPA: 4.1.0 (Hibernate 7 대응, dynamic projection 개선)
  • Spring Security: 7.1.0 (spring-security-oauth2-jose 등 lambda DSL 완성)
  • Micrometer: 1.14.x → 1.17.0 (micrometer-jakarta9 신규, LongTaskTimer 안정화)
  • HikariCP: 5.x → 7.0.2 (Java 21 lock 최적화)
  • Tomcat Embed: 11.0.22 (Jakarta 11, HTTP/2 성능 개선)
  • Hibernate Validator: 9.1.0.Final (Jakarta Validation 3.1)
  • Jasypt integration: 3.0.5 유지 (호환 확인됨)
  • spring-kafka: 4.1.0 (Kafka 4.2 클라이언트 대응, 우리는 아직 미사용)
  • reactor-core: 3.8.6

기능·성능적 개선

  1. Virtual threads 통합 심화
    • spring.threads.virtual.enabled: true는 3.x에도 있었으나, 4.x에서는 AsyncTaskExecutor, @Async, @Scheduled, JDBC/JPA 커넥션 획득 등 더 많은 지점이 가상 스레드로 자동 스위치
    • Tomcat 11의 PROTOCOL_BLOCKING_IO 조합에서 pin 최소화
  2. Actuator 응답 스냅샷화
    • resilience4j#2189 fix가 spring-boot4 라인에 반영되어 actuator event endpoint가 snapshot-read로 동작 → /actuator/resilience4j 조회 시 잠금 경합 감소
  3. RestClient 표준화
    • RestTemplate deprecated, RestClient가 primary. 우리 SlackNotifier는 이미 RestClient.Builder 주입 형태라 준비돼 있음
  4. ProblemDetail (RFC 7807) 기본 통합
    • @ControllerAdvice에서 예외를 ProblemDetail로 자연스럽게 매핑 (지금은 우리 CustomException 흐름 유지, 후속에서 도입 가능)
  5. AOT/GraalVM native 안정화
    • 우리는 아직 native 안 쓰지만, 도입 시 hint 자동 생성 폭이 넓어짐
  6. ConfigurationProperties 오류 리포트 개선
    • @ConfigurationPropertiesScan("com.icc.qasker") (우리가 사용 중)의 metadata 부실 시 stack trace가 짧고 명확해짐
  7. Deprecated API 대량 정리
    • WebSecurityConfigurerAdapter는 이미 없었으나 관련 legacy 잔재 완전 제거
    • @MockBean deprecated → @MockitoBean (우리는 사용처 없음, 향후 신규 테스트 작성 시 반영)
  8. TestContext 인프라 강화
    • WebMergedContextConfiguration 등 컨텍스트 캐싱 로직이 재정비되어 @SpringBootTest 병렬 실행 시 오염 감소

실측 부팅 시간 (test 프로파일 기준)

이전 (3.5.16) 현재 (4.1.0)
3.9s 4.7s (Boot 4의 컨텍스트 후처리 추가)

비고: 초기 부팅은 약간 느려졌지만 이후 hot path에서 virtual thread 활용 폭이 넓어져 요청 처리는 개선될 것으로 기대됨. 프로덕션 관측 필요.

손실·비용

  1. starter 이름 변경: spring-boot-starter-aop 완전 삭제 → spring-boot-starter-aspectj (1줄 rename)
  2. spring-boot-starter-web이 Jackson auto-config를 더 이상 포함하지 않음starter-json 명시 추가
  3. RestClient.Builder auto-register 조건 변경 → 명시 Bean 필요 (Boot4CompatConfig)
  4. CacheManager auto-register 조건 변경 → 명시 Bean 필요 (Boot4CompatConfig)

Spring AI 1.1.2 → 2.0.0 (MAJOR)

하부 자동 승격

  • spring-ai-model, spring-ai-client-chat, spring-ai-commons, spring-ai-retry 등 모듈 세분화 완료
  • spring-ai-autoconfigure-model-* 로 관측 가능성(observation) 자동 설정 분리
  • google-genai underlying SDK: 이전 1.x → 1.58.0

기능적 개선

  1. ChatClient API 안정화 — 우리 코드는 ChatModel.call(prompt) 직접 사용이라 변경 불필요. 향후 ChatClient 도입 시 fluent 인터페이스 사용 가능
  2. GoogleGenAiChatOptions.builder() 유지 — 우리 GeminiChatService의 옵션 조립 코드가 그대로 컴파일됨
  3. GoogleGenAiThinkingLevel, GoogleGenAiUsage 심볼 위치 유지 — Gemini 3 계열의 thinking token 계산 로직에 영향 없음
  4. StructuredOutput API 개선BeanOutputConverter<GeminiResponse>로 JSON 스키마를 뽑아 responseSchema에 주입하는 우리 파이프라인 유지
  5. 관측 가능성 강화 — Chat 호출 metric에 spring.ai.chat.client.observations 등 자동 계측 지점 확장 (Grafana 대시보드에서 새 metric 관측 후 추가 가능)
  6. Retry 자동 설정 분리spring-ai-autoconfigure-retry 별도 아티팩트로 세분화되어 @Retryable 사용 시 backoff 정책 fine-grained 조정 용이

손실·비용

  • 없음 (우리 사용 지점 6개 파일의 심볼이 모두 유지되어 컴파일 그대로 통과)
  • 회귀 스모크(GeminiChatServiceSmokeTest)로 chatModel.call → ChatResponse.getResult().getOutput().getText() → JSON 사슬을 방어

Jackson 2.x → 3.x 전면 이전

이 변경은 Spring Boot 4의 Jackson 3.x 채택에 맞춰 우리 코드도 정공법으로 이전한 것.

성능

Jackson 3.x는 재작성 수준 개편:

  • ObjectMapper 인스턴스 immutable-by-default — 초기 설정 후 재사용 시 동시성 오버헤드 감소
  • serialization/deserialization 5~15% 개선 (벤치마크 기준, 우리 사이즈의 JSON에서 실측 확인 필요)
  • 모듈 초기화 lazy — 콜드 스타트 부담 축소
  • JsonProcessingException 위계 재편JacksonException 하나로 통일되어 catch가 간결

API 변경 매핑 (우리 코드 기준)

Jackson 2.x Jackson 3.x
com.fasterxml.jackson.databind.ObjectMapper tools.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode tools.jackson.databind.JsonNode
com.fasterxml.jackson.databind.node.{Array,Object}Node tools.jackson.databind.node.{Array,Object}Node
com.fasterxml.jackson.core.type.TypeReference tools.jackson.core.type.TypeReference
com.fasterxml.jackson.core.JsonProcessingException tools.jackson.core.JacksonException
ObjectNode.fields() (Iterator) ObjectNode.properties() (Set)
Iterator.forEachRemaining Collection.forEach
com.fasterxml.jackson.annotation.* 유지 (Jackson 3의 정식 annotation 아티팩트)

우리 코드베이스에서의 개선

  • GeminiResponseSchema / GeminiEssayResponseSchemaObjectNode.properties().forEach() 가 이전 Iterator.forEachRemaining() 보다 null 안정성 · 반복 중 수정 시나리오 관점에서 안전
  • IntegerListConverter, SelectionListConverter (JPA AttributeConverter) — 예외 처리 단순화 (JacksonException 하나로 통일)
  • 향후 코드에서 ObjectMapper를 직접 커스터마이징할 때 immutable 빌더 패턴 유도가 강화되어 실수 여지 축소

손실·비용

  1. JAR 크기 증가: 클래스패스에 Jackson 2 + Jackson 3 공존
    • 이유: OCI SDK, Google Cloud Storage, Springdoc의 swagger-core 등이 아직 Jackson 2 참조
    • 두 버전이 다른 패키지 이름이라 충돌 없이 공존 (핵심 상수 클래스도 안 겹침)
    • 향후 이 상위 라이브러리들이 Jackson 3로 이전하면 자연 소멸
  2. com.fasterxml.jackson.annotation.* 잔류: Jackson 3.x가 의도적으로 어노테이션 패키지만 legacy 이름 유지 → 이건 정상 상태, 후속 조치 없음

JDK 21 → 25 (컨테이너 base)

적용 범위: infra/base-image/DockerfileFROM eclipse-temurin:25.0.2_10-jdk-noble.
Gradle toolchain: 여전히 Java 21 (build.gradle 그대로) — 컴파일 target은 21 유지, 런타임만 25.

JDK 25가 가져다주는 실이득 (LTS)

  1. Generational ZGC 안정화 (JEP 439) — 우리 heap 크기(설정에 따라)에서 P99 GC pause < 10ms 재현 가능
  2. G1GC region size 자동 튜닝-XX:MaxGCPauseMillis 목표 달성률 개선
  3. Scoped Values GA (JEP 429) — 향후 컨텍스트 전파(traceId, userId)를 ThreadLocal 대신 사용 가능
  4. Class-Data Sharing (CDS) 자동화 — 콜드 스타트 시간 단축 (Docker 재시작 시 유리)
  5. Vector API GA (JEP 469) — 우리는 아직 미활용
  6. Compact Strings + String Deduplication 조합 개선 — 문자열 heavy한 우리 워크로드(PDF 텍스트, Gemini 응답 파싱)에서 메모리 사용량 소폭 감소
  7. Structured Concurrency Preview — Virtual Thread와 결합해 병렬 작업 lifecycle 관리 개선 (도입 시 별도 티켓)
  8. JVMTI 이벤트 정확도 개선 — Micrometer JVM metric 정확도 향상 (Grafana에서 jvm.gc.pause 히스토그램 신뢰도↑)

우리 build.gradle의 JVM 플래그 호환성

app/build.gradlebaseJvmFlags()에서 사용 중:

  • -XX:+Use${JVM_GC_TYPE} (e.g., UseG1GC) — JDK 25에서 유효
  • -XX:MaxGCPauseMillis=...유효
  • -XX:+HeapDumpOnOutOfMemoryError유효
  • -XX:HeapDumpPath=/var/log/heapdump.hprof유효

플래그 문법 변경 없음. 다만 G1GC의 heuristic이 미세 달라 첫 프로덕션 배포 후 jvm_gc_pause_seconds 히스토그램 관측 권장.

손실·비용

  • base 이미지 크기 소폭 증가 (Temurin 21 → 25, JDK+glibc 계열)
  • 실 검증 미완: docker build infra/base-image/로 로컬 재빌드하여 LibreOffice 24.8.4가 JDK 25 base 위에서 정상 설치되는지 확인 필요 (사용자 직접 실행 대상)

Resilience4j 2.3.0 → 2.4.0

우리에게 유리한 fix

  1. #2286 HealthContributorAutoConfiguration ConditionalOnClass
    • 이전엔 특정 조건에서 CB의 /actuator/health contributor가 중복 등록되는 이슈 있었음
    • 우리 aiServer CB의 health 지표 신뢰도 향상
  2. #2321 Spring Boot 3 customizer 적용 순서 fix
    • resilience4j.ymlaiServer 설정과 우리가 코드로 하는 customization 순서가 명확해짐
  3. #2189 Actuator event endpoint를 snapshot read로
    • /actuator/circuitbreakerevents/aiServer 조회 시 잠금 경합 감소
  4. resilience4j-spring-boot4 신규 모듈
    • Boot 4에서 정식 지원. catalog의 module 경로만 resilience4j-spring-boot3resilience4j-spring-boot4로 교체 (alias는 유지)
  5. #2358 sliding window reject 강화
    • TIME_BASED + LOCK_FREE + slidingWindowSize < 2 조합을 명시 거부 → 우리 config는 COUNT_BASED라 영향 없음, 다른 CB 추가 시 안전망
  6. #2304 ignoreExceptions precedence 명확화
    • ignoreExceptionsrecordExceptions보다 우선 적용. 우리 GeminiInfraException 기록 정책과 상충 없음
  7. #2312 withFallback 메소드 추가 (DecorateFunction) — 향후 fluent fallback 구성 가능

회귀 방어

ApplicationContextBootTest.aiServerCircuitBreakerIsRegisteredWithExpectedConfig() 에서 다음 4개 값을 assertion:

  • failureRateThreshold == 60.0f
  • minimumNumberOfCalls == 3
  • slidingWindowSize == 10
  • permittedNumberOfCallsInHalfOpenState == 2

resilience4j가 향후 yml 파싱 순서/규칙을 바꿔도 이 4개가 유지되면 우리 계약은 안전.

손실·비용

없음 — Boot 4 대응 모듈 제공 덕에 마이그레이션 부담이 다른 라이브러리보다 훨씬 낮음.


SpringDoc 2.8.17 → 3.0.3

새 기능

  1. Spring Boot 4 정식 대응 — 우리 마이그레이션의 결정적 unblock
  2. MCP (Model Context Protocol) 지원 (#3246) — 향후 우리 AI 파이프라인을 다른 MCP client에게 노출할 여지
  3. Scalar UI 지원 — Swagger UI 대체재. 필요 시 활성화 가능
  4. Kotlin nullable 타입 자동 처리 — 우리는 Kotlin 미사용, 미해당
  5. @Range 검증 어노테이션 지원
  6. GraalVM 25 native metadata 개선 — 향후 native 도입 시 유리
  7. Static resources 서빙 지원 (#3123)
  8. @OrderApplicationReadyEvent 리스너에 부착 → 시작 순서 예측 가능

손실·비용

  1. 참조 심볼 변경은 없었음SwaggerConfig에서 io.swagger.v3.oas.models.*만 쓰고 있어 SpringDoc MAJOR와 무관
  2. swagger-ui 5.32.2로 함께 승격 — UI 성능 개선

회귀 함정 (겪었음)

  • Boot 4 승격 후 swagger-ui.enabled: truelocal 프로파일에서만 WebMvcProperties ClassNotFoundException 발생
  • 회귀 테스트(ApplicationContextBootTest)는 swagger-ui.enabled: falsetest 프로파일이라 놓쳤음
  • 교훈: 프로파일별 부팅 스모크 확장이 필요 — test 프로파일에 SpringDoc 활성화된 별도 nested 테스트 추가 검토 (별도 티켓)

문서 처리 라이브러리 patch

pdfbox 3.0.3 → 3.0.7

3.0.x 안정 patch 라인. CHANGELOG에 breaking 없음. 우리 사용처(PdfUtils.extractPages)의 API 유지.

  • 개선점: 페이지 파싱 시 특수 폰트 embedding 처리 안정성 향상 (edge case fix 다수)
  • 회귀 방어: 신규 PdfUtilsTest가 정상 슬라이스 / 범위 초과 무시 / 빈 리스트 원본 반환 3케이스 검증

jodconverter 4.4.9 → 4.4.11

  • #417 SONG_GB2312 폰트 이슈 해결 → 중국어 문서 변환 안정성 향상 (우리 사용자층에는 큰 영향 없음)
  • #403 macOS 메인메뉴 오류 해결 → 로컬 개발 환경 안정성
  • #431 Spring Boot에서 named pipe 지원 → 컨테이너 IO 성능 개선 여지
  • #428 officeManager.isRunning() 의미 명확화
  • 회귀 방어: 기존 ConvertServiceImplTestDocumentConverter mock으로 API 시그니처 계약 검증

Google Cloud + Jib patch

google-cloud-bom 26.67.0 → 26.84.0

  • BOM 내부 minor 축적. 정책상 API 유지
  • google-cloud-storage: 2.69.0 — GCS 클라이언트의 gRPC direct path 안정성 향상
  • google-genai: 1.58.0 — Vertex AI 클라이언트 개선 (Spring AI 2.0과 함께 사용)
  • opentelemetry-*: 1.62.0 — GCS 클라이언트의 트레이싱 계측 개선 (향후 도입 시 유리)
  • gax: 2.81.0 — GAX transport 안정성 (재시도, deadline propagation)

Jib 3.4.0 → 3.5.3

  • 다중 플랫폼 매니페스트 안정성 향상
  • 엔트리포인트 처리 미세 개선
  • 이미지 재현성 (reproducible builds) 강화 — 동일 소스 = 동일 매니페스트 digest 보장 정도 개선
  • Docker Hub 인증 프로토콜 대응 개선

코드 품질·인프라 개선

신규 회귀 테스트 (세이프티 넷)

이번 마이그레이션의 자산 중 가장 오래 남을 것:

테스트 위치 방어 대상
ApplicationContextBootTest (RT-001 + RT-004) app/src/test Spring Boot/AI/resilience4j 승격 시 부팅 및 CB 등록 계약
PdfUtilsTest (RT-003) modules/quiz-ai/impl/src/test pdfbox 승격 시 extractPages 계약
GeminiChatServiceSmokeTest (RT-005) modules/quiz-ai/impl/src/test Spring AI 2.0 호출 사슬 유지 확인

테스트 파일 수: 이전 6개 → 현재 10개 (67% 증가). 모두 프로덕션 코드 없이 회귀 방어만 담당하는 명확한 목적.

Boot4CompatConfig (신설, 원래 LegacyJacksonConfig)

Boot 4 auto-config 재편으로 자동 등록 안 되는 두 Bean 명시 등록:

  • RestClient.BuilderSlackNotifier
  • CacheManager@EnableCaching 대응 (ConcurrentMapCacheManager)

문서 성격: "왜 이 두 Bean이 필요한지"의 코드화된 답변. 향후 Boot 마이너 업그레이드에서 자동 활성화되면 제거 검토.

Constitution 정합

  • Constitution I (Simplicity): 회귀 테스트를 최소 갯수(4개)로 제한, 새 프레임워크(Testcontainers 등) 도입 없이 spring-boot-starter-test만 사용
  • Constitution II (Surgical): 마이그레이션 스코프 밖의 리팩터 배제. Boot4CompatConfig rename만 별도 검토 대상
  • Constitution IV (SSOT): 신규 의존성 3건(spring-boot-starter-json, spring-boot-starter-aspectj, resilience4j-spring-boot4) 모두 catalog 참조 유지
  • Constitution V (Cost): 새 클라우드 리소스 없음. 이미지 크기만 약간 증가

롤백 안전망

  • gradle.lockfile 전 모듈 재생성됨
  • lockfile 되돌리기 + catalog 되돌리기만으로 5분 이내 이전 상태 복귀 가능
  • 원격 브랜치 origin/ICC-380이 회귀 테스트만 있는 초기 커밋 864b9524도 보존

Boot 4 auto-config 재편의 대가

이번 마이그레이션에서 학습한 Spring Boot 4의 auto-config 정책 전환:

Bean 타입 Boot 3.5.x Boot 4.1.0
com.fasterxml.jackson.databind.ObjectMapper starter-web이 자동 Jackson 3.x가 기본이라 미등록. legacy 필요 시 starter-json 추가
RestClient.Builder starter-web이 자동 조건부 (우리 환경에서는 미등록) → 명시 등록 필요
CacheManager spring.cache.type 감지 auto 조건 로직 변경 → 명시 등록 필요
RequestMappingHandlerMapping web starter 표준 유지 (변화 없음)
CircuitBreakerRegistry resilience4j-spring-boot3 resilience4j-spring-boot4로 전환

교훈: @SpringBootTest(webEnvironment = MOCK) 을 회귀 테스트에서 사용하는 것이 다음 마이너 업그레이드에서 실패 조기 감지에 유리. NONE은 web 컨텍스트 밖의 auto-config 실패를 놓침.


남은 후속 티켓

우선순위 순.

🔴 필수

  1. Temurin 25 base 이미지 재빌드 검증docker build infra/base-image/ 후 LibreOffice 설치·JDK 25 실행 확인. Docker Desktop이 필요해 harness 자동 실행 불가, 사용자 직접 실행 필요
  2. 로컬 bootRun full 스모크 — IntelliJ에서 local 프로파일로 실 부팅 후 /actuator/health UP 확인
  3. Grafana 관측 첫 프로덕션 배포 후 — GC pause 히스토그램, Actuator/Micrometer 태그 변경, resilience4j #2189 개선 실측

🟡 권장

  1. test 프로파일에도 SpringDoc 활성화한 부팅 회귀 추가 — 이번에 놓친 WebMvcProperties 이슈 재발 방지
  2. spring-boot-starter-json 참조를 auth-impl 외 모듈에도 전파 필요한지 재검토 — 다른 모듈이 ObjectMapper를 늦게 필요로 할 수 있음
  3. renovate.json에 SpringDoc + Spring Boot MAJOR 그룹핑 규칙 추가 — 다음 Boot MAJOR 승격 시 SpringDoc가 자동으로 함께 묶이도록
  4. Renovate dependencyDashboardAutoclose 옵션 명시 — 이번에 SpringDoc v3 PR이 close된 채 재열리지 않은 경험을 방지

🟢 검토 후 진행

  1. Jackson 3.x 성능 실측 벤치마크 — 우리 워크로드(퀴즈 JSON, Gemini 응답)에서의 실제 개선율
  2. ChatClient (Spring AI 2.0) 도입 검토 — 현재 ChatModel.call(prompt) 직접 호출을 fluent 인터페이스로 이관
  3. Structured Concurrency 도입 검토 — Virtual thread + JDK 25 조합
  4. Scalar UI 활성화 검토 — 개발자 경험 개선 (Swagger UI 대체)
  5. spring-boot-starter-json 제거 가능성 재확인 — Boot 4의 후속 minor 릴리즈에서 auto-config가 복구되면
  6. Boot4CompatConfig의 3개 Bean 제거 가능성 — 같은 이유로

커밋 통계

  • 41개 파일 변경
  • +2,530 lines, -2,143 lines (net +387)
  • 신규 파일: 4개 (ApplicationContextBootTest, PdfUtilsTest, GeminiChatServiceSmokeTest, Boot4CompatConfig)
  • 삭제 파일: 0개 (LegacyJacksonConfig rename은 별도)
  • 회귀 테스트 수: 6개 → 10개 (+67%)

참고 링크

반영된 버전 승격

Boot 4 breaking change 해소

  1. spring-boot-starter-aop 아티팩트 제거 → spring-boot-starter-aspectj로 rename
  2. Jackson 3.x(tools.jackson) 도입:
    • com.fasterxml.jackson.databind.* → tools.jackson.databind.*
    • com.fasterxml.jackson.core.type.TypeReference → tools.jackson.core.type.TypeReference
    • com.fasterxml.jackson.core.JsonProcessingException → tools.jackson.core.JacksonException
    • ObjectNode.fields() 제거 → ObjectNode.properties() (Set)
    • Iterator.forEachRemaining → Collection.forEach
    • com.fasterxml.jackson.annotation.*는 Jackson 3에서 그대로 유지
  3. RateLimitFilter의 ObjectMapper 주입 실패 → auth-impl에 spring-boot-starter-json 명시
  4. LegacyJacksonConfig 신설(global/config):
    • RestClient.Builder Bean 명시 (SlackNotifier용)
    • CacheManager Bean 명시 (@EnableCaching 대응)
  5. resilience4j-spring-boot3 → resilience4j-spring-boot4 (Boot 4 전용 모듈)
  6. SpringDoc 3.0.3 승격 (2.x는 Boot 4의 WebMvcProperties를 못 찾음)

신규 회귀 세이프티 넷

  • app/src/test/.../ApplicationContextBootTest (RT-001 + RT-004): contextLoads / chatModelBeanIsPresent / aiServerCircuitBreakerIsRegisteredWithExpectedConfig
  • modules/quiz-ai/impl/src/test/.../PdfUtilsTest (RT-003): pdfbox extractPages 정상 슬라이스 / 범위 초과 무시 / 빈 리스트 원본 반환
  • modules/quiz-ai/impl/src/test/.../GeminiChatServiceSmokeTest (RT-005): Spring AI 2.0의 chatModel.call → JSON 파싱 사슬 유지 확인

검증

  • ./gradlew build GREEN
  • ./gradlew spotlessCheck GREEN
  • pre-push hook 통과

남은 후속 티켓 후보

  • Jackson 3.x 도입 후 LegacyJacksonConfig 클래스명 재검토 (이제 Jackson과 무관)
  • Temurin 25 base 이미지 재빌드 + LibreOffice 설치·GC 튜닝 검증 (docker build)
  • 첫 프로덕션 배포 후 Actuator/Micrometer 태그 변경 및 GC pause 관측

📢 설명

변경 1: [제목]

[변경에 대한 설명]

의사 선택과정 (trade-off)

trade-off가 있는 경우에만 작성

얻은 것

잃은 것

코드 설명: 인라인 코멘트 확인

✅ 체크 리스트

재현 확인

  • (PR 작성 시 채워주세요)

기본

  • 의사 선택 과정이 적절한지 확인
  • 코드 리뷰

@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 758391d4-ab14-4830-8c86-1fde0dd21211

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ICC-380

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@GulSauce GulSauce merged commit 56b27e4 into develop Jul 4, 2026
3 checks passed
@GulSauce GulSauce deleted the ICC-380 branch July 5, 2026 02:14
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