Skip to content

refactor: spring boot 버전 업에 관한 레거시 변경 및 제거#710

Open
whqtker wants to merge 11 commits intodevelopfrom
refactor/709-spring-boot-version-up
Open

refactor: spring boot 버전 업에 관한 레거시 변경 및 제거#710
whqtker wants to merge 11 commits intodevelopfrom
refactor/709-spring-boot-version-up

Conversation

@whqtker
Copy link
Copy Markdown
Member

@whqtker whqtker commented Apr 1, 2026

관련 이슈

작업 내용

형준 님 작업 체리 픽해서 진행했습니다. #702

추가로 버전 업이랑 관련없으나, 잘못된 설정 등도 같이 작업했습니다. 버전 업 관련 디스커션의 별 한 개 참고하시면 됩니다.

빌드 및 실행까지 검증했습니다 !

특이 사항

리뷰 요구사항 (선택)

sukangpunch and others added 2 commits April 1, 2026 22:27
* refactor: Spring Boot, Java 및 주요 의존성 버전업, commons-lang3 추가

- SpringBoot 버전업 (-> 3.5.11)
- Java 버전업 (-> 21)
- JJWT 버전업 (-> 0.12.6)
- 기존 EnumUtils deprecate 대응을 위해 org.apache.commons:commons-lang3 의존성 추가

* refactor: JJWT deprecated API를 신규 API로 마이그레이션

* chore: ci/cd 파일 및 도커파일Java 17 → 21, Spring Boot 버전 업 반영

* test: @MockBean, @spybean을 @MockitoBean, @MockitoSpyBean으로 마이그레이션

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: 누락된 변경사항 추가

* refactor: 코드래빗 리뷰사항 적용

- 테스트에서 Token 생성 시, TTL을 30초로 수정
- TTL이 너무 짧으면 테스트가 간헐적으로 꺠질 위험 존재
@whqtker whqtker self-assigned this Apr 1, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 1, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1f915071-6003-49ff-ac45-f983820d01ac

📥 Commits

Reviewing files that changed from the base of the PR and between 9f2521c and e31f41b.

📒 Files selected for processing (2)
  • claude.md
  • src/test/resources/application.yml
✅ Files skipped from review due to trivial changes (1)
  • claude.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/test/resources/application.yml

Walkthrough

  1. Java 및 빌드 도구 업그레이드. CI/CD 워크플로우, Dockerfile, build.gradle에서 JDK/타겟을 17→21로 올리고 Spring Boot 및 플러그인 버전을 상향했습니다.
  2. JJWT 마이그레이션. 프로덕션 코드와 테스트에서 JJWT의 새로운 빌더/파서/키 API로 전환해 토큰 생성·서명·검증 방식을 변경했습니다.
  3. Apple OAuth 관련 변경. Apple 토큰 생성/파싱 로직을 JJWT 새 API와 표준 Base64 디코딩으로 갱신했습니다.
  4. 테스트 어노테이션 업데이트. 다수의 테스트에서 @MockBean/@SpyBean@MockitoBean/@MockitoSpyBean 계열로 교체했습니다.
  5. 설정 및 리소스 조정. application.yml 계층 일부 재배치(톰캣 스레드 설정 이동, MVC 매칭 전략 제거) 및 여러 프로필의 cloud/jpa/driver 설정 제거가 포함됩니다.
  6. Redis 직렬화 명시. RedisTemplate의 Jackson2JsonRedisSerializer를 명시적 ObjectMapper 인스턴스로 생성하도록 변경했습니다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested reviewers

  • wibaek
  • Gyuhyeok99
  • lsy1307
  • Hexeong
  • sukangpunch
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive PR 설명은 관련 이슈(#709)와 체리픽 참조(#702)를 포함하고 있으나, 템플릿의 '작업 내용', '특이 사항', '리뷰 요구사항' 섹션이 대부분 미작성 상태입니다. 템플릿의 필수 섹션들을 보다 구체적으로 작성해주세요. 특히 '작업 내용'에서 변경사항의 기능 단위 설명과 '특이 사항'에서 프로젝트 실행에 미치는 영향을 명시해 주세요.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 Spring Boot 버전 업과 관련된 레거시 변경 및 제거라는 핵심 내용을 명확하게 요약하고 있습니다.
Linked Issues check ✅ Passed 연결된 이슈 #709는 Spring Boot 버전 업에 따른 레거시 변경 및 제거를 목표로 하고 있으며, 실제 변경사항(Java 17→21, Spring Boot 3.1.5→3.5.11, JJWT 라이브러리 마이그레이션 등)이 이를 충족합니다.
Out of Scope Changes check ✅ Passed PR에 포함된 변경사항 중 일부는 버전 업과 직접 관련 없는 수정사항(설정 제거, 테스트 애노테이션 변경, 경로 매칭 메커니즘 업데이트)을 포함하고 있으나, 이는 PR 설명에서 언급된 '버전 업과 관련없으나 잘못된 설정 등'에 부합합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/709-spring-boot-version-up

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 and usage tips.

@whqtker whqtker changed the title refactor: spring boot 버전 업에 관한 레거리 변경 및 제거 refactor: spring boot 버전 업에 관한 레거시 변경 및 제거 Apr 1, 2026
@whqtker whqtker added 진행 중 자유롭게 merge 가능 labels Apr 1, 2026
@whqtker whqtker marked this pull request as ready for review April 2, 2026 00:44
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (5)
src/test/java/com/example/solidconnection/university/service/UnivApplyInfoQueryServiceTest.java (1)

195-213: 기존 TODO 주석 관련 확인 필요

이 테스트는 Redis 관련 에러로 인해 임시 비활성화된 상태입니다. 이 PR의 변경 사항은 아니지만, Spring Boot 버전 업그레이드 후 Redis 설정이 변경되었을 수 있으므로 이 테스트가 다시 활성화 가능한지 확인해 보시는 것을 권장드립니다.

이 이슈를 추적하기 위한 별도 이슈를 생성해 드릴까요?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/test/java/com/example/solidconnection/university/service/UnivApplyInfoQueryServiceTest.java`
around lines 195 - 213, The test method 캐시가_적용된다() was commented out due to
Redis errors; re-enable it by restoring the `@Test` annotation and fix the
underlying Redis test setup used by
univApplyInfoQueryService.searchUnivApplyInfoByText so the cache is available
during tests (either configure an embedded Redis, Testcontainers Redis, or mock
the cache manager in the test context), then verify the repository interaction
assertion that univApplyInfoRepository.findAllByText(text, term.getId()) is
called only once still holds; update test configuration
(application-test.properties or test `@Import`) to match the Spring Boot upgrade
Redis settings and add a follow-up issue if you cannot make the Redis test infra
stable now.
src/main/java/com/example/solidconnection/common/filter/HttpLoggingFilter.java (1)

66-74: PathPattern 매칭 로직이 올바르게 구현되었습니다.

  1. AntPathMatcher에서 PathPattern으로 전환

    • Spring Boot 3.x의 기본 매칭 전략에 맞게 PathPattern API를 사용하여 전환되었습니다.
  2. 구현 로직 검증

    • PathContainer.parsePath()PathPattern.matches()의 조합이 올바릅니다.
  3. 향후 고려 사항 (선택적)

    • 현재 application.ymlserver.servlet.context-path가 설정되어 있지 않아 문제가 없습니다.
    • 다만, 향후 context-path가 설정될 경우 req.getRequestURI()는 context-path를 포함하므로 /actuator/** 패턴과 매칭되지 않을 수 있습니다.
    • 필요시 req.getServletPath()를 사용하거나 context-path를 제거한 경로로 매칭하는 것을 고려할 수 있습니다.
🛡️ context-path 대응을 위한 선택적 개선안
 private boolean isExcluded(HttpServletRequest req) {
-    PathContainer path = PathContainer.parsePath(req.getRequestURI());
+    String contextPath = req.getContextPath();
+    String uri = req.getRequestURI();
+    String pathWithoutContext = uri.startsWith(contextPath) 
+            ? uri.substring(contextPath.length()) 
+            : uri;
+    PathContainer path = PathContainer.parsePath(pathWithoutContext);
     for (PathPattern p : EXCLUDE_PATTERNS) {
         if (p.matches(path)) {
             return true;
         }
     }
     return false;
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/com/example/solidconnection/common/filter/HttpLoggingFilter.java`
around lines 66 - 74, The isExcluded method currently parses req.getRequestURI()
which includes any configured context-path, so matching against PathPattern
instances in EXCLUDE_PATTERNS may fail if a context-path is set; update
isExcluded to derive the path to match by using req.getServletPath() (or by
stripping req.getContextPath() from req.getRequestURI()) before calling
PathContainer.parsePath, then keep the loop over EXCLUDE_PATTERNS and
PathPattern.matches as-is so patterns like /actuator/** continue matching
correctly.
src/test/java/com/example/solidconnection/security/filter/SignOutCheckFilterTest.java (1)

102-105: HS256 키 길이 요구사항을 명시적으로 검증하는 로직을 추가해 주세요.

현재 테스트 설정의 JWT 시크릿(1234567-1234-1234-1234-12345678901)은 34바이트로, HS256에 필요한 최소 32바이트 요구사항을 충족합니다. 다만, 다음과 같은 이유로 명시적 검증을 추가하면 좋습니다:

  1. 런타임 보호: 시크릿이 32바이트 미만으로 변경되면 Keys.hmacShaKeyFor()에서 즉시 실패하게 되는데, 사전에 검증 로직을 두면 이를 방지할 수 있습니다.

  2. 의도의 명확화: 설정이나 테스트 코드에서 최소 길이 요구사항을 명시하면, 향후 유지보수 시 누군가 실수로 짧은 값으로 변경하는 것을 방지할 수 있습니다.

  3. 여러 테스트 파일 영향: SignOutCheckFilterTest, TokenAuthenticationFilterTest, TokenAuthenticationProviderTest 등 여러 테스트에서 동일 패턴을 사용하고 있으므로, JwtProperties 또는 테스트 고정 설정에서 검증하면 효과적입니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/test/java/com/example/solidconnection/security/filter/SignOutCheckFilterTest.java`
around lines 102 - 105, 테스트와 설정에서 HS256 키 최소 길이(32바이트)를 명시적으로 검증하도록 추가하세요:
JwtProperties의 secret 반환부(예: JwtProperties.secret()) 또는 공용 유틸(예:
validateHmacSecretLength(String))에 길이 검증 로직을 넣어 값이 null이거나 UTF_8 바이트 길이가 32보다
작으면 적절한 예외를 던지도록 하고, 테스트들(SignOutCheckFilterTest, TokenAuthenticationFilterTest,
TokenAuthenticationProviderTest)에서는 Keys.hmacShaKeyFor(...) 호출 전에 이 검증 메서드를
호출하거나 JwtProperties가 이미 검증되었음을 보장하도록 변경하세요.
src/test/java/com/example/solidconnection/security/filter/TokenAuthenticationFilterTest.java (1)

45-46: 주석 내용 수정이 필요합니다.

주석에서 "MockBean"이라고 언급하고 있지만, 실제로는 @MockitoBean으로 변경되었습니다. 주석을 일치시키면 코드 이해도가 높아집니다.

✏️ 주석 수정 제안
-    `@MockitoBean` // 이 테스트코드에서 사용자를 조회할 필요는 없으므로 MockBean 으로 대체
+    `@MockitoBean` // 이 테스트코드에서 사용자를 조회할 필요는 없으므로 MockitoBean 으로 대체
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/test/java/com/example/solidconnection/security/filter/TokenAuthenticationFilterTest.java`
around lines 45 - 46, 주석이 "@MockitoBean" 대신 "MockBean"을 언급하고 있으므로 주석을 수정해
일치시키세요: TokenAuthenticationFilterTest 클래스에서 siteUserDetailsService 필드에 붙은
`@MockitoBean` 어노테이션을 참조하여 주석 텍스트를 "이 테스트코드에서 사용자를 조회할 필요는 없으므로 `@MockitoBean` 으로
모킹"처럼 변경해 코드와 주석이 일치하도록 업데이트하세요.
src/main/java/com/example/solidconnection/auth/token/JwtTokenProvider.java (1)

48-50: 서명 키 캐싱을 고려해 볼 수 있습니다. (선택 사항)

getSigningKey()가 토큰 생성/검증 시마다 호출되어 매번 새 SecretKey 객체를 생성합니다. 성능이 크리티컬한 환경에서는 초기화 시점에 캐싱하는 것을 고려해 볼 수 있습니다.

💡 캐싱 적용 예시
 `@Component`
 `@RequiredArgsConstructor`
 public class JwtTokenProvider implements TokenProvider {

     private final JwtProperties jwtProperties;
+    private SecretKey signingKey;
+
+    `@PostConstruct`
+    private void initSigningKey() {
+        this.signingKey = Keys.hmacShaKeyFor(
+            jwtProperties.secret().getBytes(StandardCharsets.UTF_8)
+        );
+    }

-    private SecretKey getSigningKey() {
-        return Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8));
+    private SecretKey getSigningKey() {
+        return signingKey;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/com/example/solidconnection/auth/token/JwtTokenProvider.java`
around lines 48 - 50, getSigningKey() currently creates a new SecretKey on every
call (in JwtTokenProvider), which can be cached to avoid repeated allocations:
compute the SecretKey once (e.g., in the JwtTokenProvider constructor or an
eagerly initialized final field) using
Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)) and
reuse that field in getSigningKey(); if you prefer lazy init, use a thread-safe
pattern (volatile + synchronized or an AtomicReference) to ensure a single
SecretKey instance is created and reused for token creation/verification.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@build.gradle`:
- Around line 3-5: Update the plugin versions in build.gradle: bump id
'org.springframework.boot' from '3.5.11' to '3.5.13' and keep id
'io.spring.dependency-management' at '1.1.7'; retain id 'org.flywaydb.flyway' at
'10.15.0' but ensure you apply Flyway 10.x migration changes (verify flyway
configuration keys, explicitly set SQL migration folder and separate
database-specific module dependencies) before committing; also consider updating
any Testcontainers dependency elsewhere in the project to 2.0.4 if present.

In `@claude.md`:
- Around line 10-11: The document has inconsistent Spring Boot version numbers:
the top-level versions were updated to "3.5.11" but the "Core Framework" section
still shows "3.1.5"; search for the string "3.1.5" and replace it with "3.5.11"
(including the "Core Framework" heading and any other occurrences) so all
version references match, and verify the header/summary and any "Spring Boot"
mentions use "3.5.11" consistently.

---

Nitpick comments:
In `@src/main/java/com/example/solidconnection/auth/token/JwtTokenProvider.java`:
- Around line 48-50: getSigningKey() currently creates a new SecretKey on every
call (in JwtTokenProvider), which can be cached to avoid repeated allocations:
compute the SecretKey once (e.g., in the JwtTokenProvider constructor or an
eagerly initialized final field) using
Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)) and
reuse that field in getSigningKey(); if you prefer lazy init, use a thread-safe
pattern (volatile + synchronized or an AtomicReference) to ensure a single
SecretKey instance is created and reused for token creation/verification.

In
`@src/main/java/com/example/solidconnection/common/filter/HttpLoggingFilter.java`:
- Around line 66-74: The isExcluded method currently parses req.getRequestURI()
which includes any configured context-path, so matching against PathPattern
instances in EXCLUDE_PATTERNS may fail if a context-path is set; update
isExcluded to derive the path to match by using req.getServletPath() (or by
stripping req.getContextPath() from req.getRequestURI()) before calling
PathContainer.parsePath, then keep the loop over EXCLUDE_PATTERNS and
PathPattern.matches as-is so patterns like /actuator/** continue matching
correctly.

In
`@src/test/java/com/example/solidconnection/security/filter/SignOutCheckFilterTest.java`:
- Around line 102-105: 테스트와 설정에서 HS256 키 최소 길이(32바이트)를 명시적으로 검증하도록 추가하세요:
JwtProperties의 secret 반환부(예: JwtProperties.secret()) 또는 공용 유틸(예:
validateHmacSecretLength(String))에 길이 검증 로직을 넣어 값이 null이거나 UTF_8 바이트 길이가 32보다
작으면 적절한 예외를 던지도록 하고, 테스트들(SignOutCheckFilterTest, TokenAuthenticationFilterTest,
TokenAuthenticationProviderTest)에서는 Keys.hmacShaKeyFor(...) 호출 전에 이 검증 메서드를
호출하거나 JwtProperties가 이미 검증되었음을 보장하도록 변경하세요.

In
`@src/test/java/com/example/solidconnection/security/filter/TokenAuthenticationFilterTest.java`:
- Around line 45-46: 주석이 "@MockitoBean" 대신 "MockBean"을 언급하고 있으므로 주석을 수정해 일치시키세요:
TokenAuthenticationFilterTest 클래스에서 siteUserDetailsService 필드에 붙은 `@MockitoBean`
어노테이션을 참조하여 주석 텍스트를 "이 테스트코드에서 사용자를 조회할 필요는 없으므로 `@MockitoBean` 으로 모킹"처럼 변경해 코드와
주석이 일치하도록 업데이트하세요.

In
`@src/test/java/com/example/solidconnection/university/service/UnivApplyInfoQueryServiceTest.java`:
- Around line 195-213: The test method 캐시가_적용된다() was commented out due to Redis
errors; re-enable it by restoring the `@Test` annotation and fix the underlying
Redis test setup used by univApplyInfoQueryService.searchUnivApplyInfoByText so
the cache is available during tests (either configure an embedded Redis,
Testcontainers Redis, or mock the cache manager in the test context), then
verify the repository interaction assertion that
univApplyInfoRepository.findAllByText(text, term.getId()) is called only once
still holds; update test configuration (application-test.properties or test
`@Import`) to match the Spring Boot upgrade Redis settings and add a follow-up
issue if you cannot make the Redis test infra stable now.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 5744898f-e319-47ce-8b5a-6f02fa2b907b

📥 Commits

Reviewing files that changed from the base of the PR and between 3fae55e and cb3df94.

📒 Files selected for processing (30)
  • .github/workflows/ci.yml
  • .github/workflows/dev-cd.yml
  • .github/workflows/prod-cd.yml
  • Dockerfile
  • build.gradle
  • claude.md
  • src/main/java/com/example/solidconnection/auth/client/AppleOAuthClient.java
  • src/main/java/com/example/solidconnection/auth/client/AppleOAuthClientSecretProvider.java
  • src/main/java/com/example/solidconnection/auth/token/JwtTokenProvider.java
  • src/main/java/com/example/solidconnection/common/filter/HttpLoggingFilter.java
  • src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java
  • src/main/resources/application.yml
  • src/main/resources/config/application-cloud.yml
  • src/main/resources/config/application-db.yml
  • src/test/java/com/example/solidconnection/admin/service/AdminHostUniversityServiceTest.java
  • src/test/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManagerTest.java
  • src/test/java/com/example/solidconnection/auth/service/JwtTokenProviderTest.java
  • src/test/java/com/example/solidconnection/auth/service/oauth/OAuthServiceTest.java
  • src/test/java/com/example/solidconnection/auth/service/signup/SignUpTokenProviderTest.java
  • src/test/java/com/example/solidconnection/chat/service/ChatServiceTest.java
  • src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java
  • src/test/java/com/example/solidconnection/mentor/service/MentorApplicationServiceTest.java
  • src/test/java/com/example/solidconnection/news/service/NewsCommandServiceTest.java
  • src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java
  • src/test/java/com/example/solidconnection/security/authentication/TokenAuthenticationProviderTest.java
  • src/test/java/com/example/solidconnection/security/filter/SignOutCheckFilterTest.java
  • src/test/java/com/example/solidconnection/security/filter/TokenAuthenticationFilterTest.java
  • src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java
  • src/test/java/com/example/solidconnection/university/service/UnivApplyInfoQueryServiceTest.java
  • src/test/resources/application.yml
💤 Files with no reviewable changes (3)
  • src/main/resources/config/application-cloud.yml
  • src/test/resources/application.yml
  • src/main/resources/config/application-db.yml

Comment on lines +3 to +5
id 'org.springframework.boot' version '3.5.11'
id 'io.spring.dependency-management' version '1.1.7'
id 'org.flywaydb.flyway' version '10.15.0'
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

What is the latest stable version of Spring Boot 3.5.x as of April 2026?

💡 Result:

The latest stable version of Spring Boot 3.5.x as of April 2, 2026, is 3.5.13.

Citations:


🌐 Web query:

Flyway 10.15.0 release notes breaking changes from 9.x to 10.x

💡 Result:

Flyway 10.15.0 has no breaking changes listed in its release notes. The breaking changes from Flyway 9.x to 10.x occurred primarily in Flyway 10.0.0 and subsequent minor releases within the 10.x series. Key breaking changes for the 9.x to 10.x upgrade: - Removed deprecated flyway.check.reportFilename; use flyway.reportFilename instead. Report generation is now off by default (enable with reportEnabled). - 'SQL' folder removed as a default location for migration scripts (bad practice; specify locations explicitly). - flyway.plugins parameter namespace retired (backwards compatible but deprecate usage; e.g., flyway.plugins.clean -> sqlserver.clean.mode). - Database modules separated from flyway-core into individual modules (update dependencies for affected databases). - For Redgate distribution: licenseKey, undoSqlMigrationPrefix, and cherryPick configurations moved. - cherryPick now requires a configuration extension object via plugin registry (API users). - License key logic moved to 'flyway-key-licensing' module. Flyway 10.15.0 (2024-06-11) notes only bug fixes and minor changes, no breaking changes. Sources: Official Redgate Flyway release notes, upgrade guide, and V10 announcement.

Citations:


🌐 Web query:

Spring dependency-management plugin 1.1.7 latest version

💡 Result:

The latest version of the Spring Dependency Management Plugin (io.spring.dependency-management) is 1.1.7, released on December 17, 2024. This is confirmed by the official Gradle Plugin Portal, Maven Central repositories, the plugin's documentation, and the GitHub releases page. As of 2026-04-02, no newer version is indicated in these authoritative sources.

Citations:


🏁 Script executed:

# Search for testcontainers and other key dependency versions in build.gradle
cat build.gradle | grep -E "version|testcontainers|flyway|spring" | head -30

Repository: solid-connection/solid-connect-server

Length of output: 1414


🌐 Web query:

Testcontainers 2.0.2 release latest version

💡 Result:

The latest version of Testcontainers for Java is 2.0.4, released on 2026-03-19. Testcontainers 2.0.2 was released on 2025-11-13. As of 2026-04-02, 2.0.4 is the most recent release, confirmed by the official documentation, GitHub releases, and Maven repositories.

Citations:


플러그인 버전 확인 및 업데이트 제안

확인 결과, 명시된 모든 버전이 실제로 존재하며 안정적입니다. 다만 다음과 같은 점들을 고려해 주세요:

  1. Spring Boot 3.5.11 → 3.5.13 업데이트 권장

    • 현재 사용 중인 3.5.11은 유효하지만, 최신 안정판 3.5.13이 릴리스되었습니다 (2패치 최신).
  2. Spring Dependency Management 1.1.7

    • 최신 안정판입니다 (2024년 12월 17일 릴리스). 유지해도 무방합니다.
  3. Flyway 10.15.0 마이그레이션 주의

    • Flyway 10.15.0 자체는 안정적이지만, 9.x에서 10.x로 업그레이드할 때 다음 변경 사항을 검토하세요:
      • 설정 파일 경로 변경 (예: flyway.plugins.* → database 모듈 설정)
      • SQL 마이그레이션 폴더 위치 명시 필요
      • 데이터베이스별 모듈 의존성 분리
  4. Testcontainers 2.0.2 → 2.0.4 업데이트 권장

    • 현재 2.0.2는 유효하지만, 최신 버전 2.0.4 (2026년 3월 19일 릴리스)로 업데이트 가능합니다.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@build.gradle` around lines 3 - 5, Update the plugin versions in build.gradle:
bump id 'org.springframework.boot' from '3.5.11' to '3.5.13' and keep id
'io.spring.dependency-management' at '1.1.7'; retain id 'org.flywaydb.flyway' at
'10.15.0' but ensure you apply Flyway 10.x migration changes (verify flyway
configuration keys, explicitly set SQL migration folder and separate
database-specific module dependencies) before committing; also consider updating
any Testcontainers dependency elsewhere in the project to 2.0.4 if present.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/main/java/com/example/solidconnection/common/config/redis/RedisConfig.java (1)

49-56: ⚠️ Potential issue | 🟠 Major

objectRedisTemplate() 빈에 설정되지 않은 기본 ObjectMapper 사용으로 인한 직렬화/역직렬화 오류 위험

deprecated 생성자를 새로운 버전으로 대체한 방향은 올바르지만, 기본 new ObjectMapper()를 사용하면 다음과 같은 문제가 발생할 수 있습니다:

  1. Java 8 날짜/시간 타입 미지원

    • SiteUser의 LocalDateTime 필드(nicknameModifiedAt), LocalDate 필드(quitedAt)
    • UserBan의 ZonedDateTime 필드(expiredAt, unbannedAt)
    • 이들 타입이 캐시될 경우 역직렬화 오류 발생 가능
  2. 타입 정보 부재

    • 복잡한 객체의 다형성 역직렬화 불가능
    • GenericJackson2JsonRedisSerializer와 달리 @class 정보 미포함
  3. 코드베이스 일관성 부족

    • CustomCacheManager와 ThunderingHerdCachingAspect에서는 GenericJackson2JsonRedisSerializer 사용 중
    • 동일한 용도인데 서로 다른 직렬화 방식 적용
🔧 권장 수정안 1: GenericJackson2JsonRedisSerializer 사용 (권장)
     `@Bean`
     public RedisTemplate<String, Object> objectRedisTemplate() {
         RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
         redisTemplate.setKeySerializer(new StringRedisSerializer());
-        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(new ObjectMapper(), Object.class));
+        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
         redisTemplate.setConnectionFactory(redisConnectionFactory());
         return redisTemplate;
     }

불필요한 import도 제거합니다:

-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
🔧 권장 수정안 2: ObjectMapper에 필수 모듈 등록
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
     `@Bean`
     public RedisTemplate<String, Object> objectRedisTemplate() {
         RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
         redisTemplate.setKeySerializer(new StringRedisSerializer());
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.registerModule(new JavaTimeModule());
+        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
-        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(new ObjectMapper(), Object.class));
+        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(objectMapper, Object.class));
         redisTemplate.setConnectionFactory(redisConnectionFactory());
         return redisTemplate;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/com/example/solidconnection/common/config/redis/RedisConfig.java`
around lines 49 - 56, The objectRedisTemplate() bean currently constructs a
plain new ObjectMapper which lacks JavaTime and type metadata support, causing
deserialization errors for LocalDate/LocalDateTime/ZonedDateTime and polymorphic
types and is inconsistent with other serializers; update objectRedisTemplate()
to use GenericJackson2JsonRedisSerializer (to include type info) or configure a
shared ObjectMapper that registers JavaTimeModule,
JavaTimeModule/JavaTimeModule-support, and enables default typing as used by
CustomCacheManager and ThunderingHerdCachingAspect so the RedisTemplate uses the
same serializer strategy as the rest of the codebase.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In
`@src/main/java/com/example/solidconnection/common/config/redis/RedisConfig.java`:
- Around line 49-56: The objectRedisTemplate() bean currently constructs a plain
new ObjectMapper which lacks JavaTime and type metadata support, causing
deserialization errors for LocalDate/LocalDateTime/ZonedDateTime and polymorphic
types and is inconsistent with other serializers; update objectRedisTemplate()
to use GenericJackson2JsonRedisSerializer (to include type info) or configure a
shared ObjectMapper that registers JavaTimeModule,
JavaTimeModule/JavaTimeModule-support, and enables default typing as used by
CustomCacheManager and ThunderingHerdCachingAspect so the RedisTemplate uses the
same serializer strategy as the rest of the codebase.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: a7ae23e7-6bc9-4048-a6b8-d52947e74679

📥 Commits

Reviewing files that changed from the base of the PR and between cb3df94 and 9f2521c.

📒 Files selected for processing (1)
  • src/main/java/com/example/solidconnection/common/config/redis/RedisConfig.java

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

리팩터링 진행 중 자유롭게 merge 가능

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor: spring boot 버전 업에 따른 레거시 변경 및 제거

2 participants