Skip to content

refactor: 대학 캐시 무효화 정책 추가#660

Open
Gyuhyeok99 wants to merge 2 commits intosolid-connection:developfrom
Gyuhyeok99:refactor/648-invalidate-cache-on-university-update
Open

refactor: 대학 캐시 무효화 정책 추가#660
Gyuhyeok99 wants to merge 2 commits intosolid-connection:developfrom
Gyuhyeok99:refactor/648-invalidate-cache-on-university-update

Conversation

@Gyuhyeok99
Copy link
Contributor

관련 이슈

작업 내용

지난주 논의대로 대학 캐시 무효화 정책을 추가하였습니다.

1. 캐시 무효화 로직 추가

AdminHostUniversityService

  • createHostUniversity, updateHostUniversity, deleteHostUniversity 메서드에 @DefaultCacheOut 어노테이션 적용
  • 무효화 대상 캐시:
    • univApplyInfoTextSearch:* (텍스트 검색 결과 캐시)
    • university:recommend:general (추천 대학 목록 캐시)
    • univApplyInfo:{id} (대학 지원 정보 상세 캐시 - update 시에만)

2. 배치 캐시 삭제 기능 추가

CustomCacheManager

  • evictMultiple(List<String> keys) 메서드 추가
  • 여러 캐시 키를 한 번에 삭제하여 성능 최적화

UnivApplyInfoRepository

  • findIdsByUniversityId(Long universityId) 쿼리 메서드 추가
  • 특정 대학과 연결된 모든 UnivApplyInfo ID 조회

3. 효율적인 상세 캐시 무효화

AdminHostUniversityService

  • evictUnivApplyInfoDetailCaches(Long hostUniversityId) private 메서드 추가
  • 대학 수정 시 해당 대학과 연결된 UnivApplyInfo 상세 캐시만 선택적으로 삭제

특이 사항

리뷰 요구사항 (선택)

  • 검색 캐시는 prefix 기반 삭제 (어떤 검색어가 영향받는지 판단하는 비용이 높음)
  • 추천 캐시는 단일 키 삭제 (항상 동일한 키 사용)
  • 상세 캐시는 영향받는 ID만 선택적으로 삭제 (성능 최적화)

@coderabbitai
Copy link

coderabbitai bot commented Feb 14, 2026

Walkthrough

호스트 대학 관리 서비스에 캐싱 메커니즘이 도입되었습니다. 변경사항은 다음과 같습니다:

  1. 대학 생성, 수정, 삭제 작업에 @DefaultCacheOut 어노테이션을 적용하여 캐싱 동작 추가
  2. 관련된 UnivApplyInfo 캐시를 무효화하는 evictUnivApplyInfoDetailCaches 헬퍼 메서드 구현
  3. CustomCacheManager에 여러 캐시 키를 한 번에 제거하는 evictMultiple 메서드 추가
  4. UnivApplyInfoRepository에 대학 ID로 지원 정보 ID를 조회하는 findIdsByUniversityId 쿼리 메서드 추가
  5. 캐시 무효화 동작을 검증하는 테스트 코드 추가

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested reviewers

  • wibaek
  • sukangpunch
  • lsy1307
  • Hexeong
🚥 Pre-merge checks | ✅ 4 | ❌ 2
❌ Failed checks (2 warnings)
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.
Merge Conflict Detection ⚠️ Warning ❌ Merge conflicts detected (35 files):

⚔️ .gitignore (content)
⚔️ claude.md (content)
⚔️ src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java (content)
⚔️ src/main/java/com/example/solidconnection/admin/university/service/AdminHostUniversityService.java (content)
⚔️ src/main/java/com/example/solidconnection/cache/ThunderingHerdCachingAspect.java (content)
⚔️ src/main/java/com/example/solidconnection/cache/manager/CustomCacheManager.java (content)
⚔️ src/main/java/com/example/solidconnection/common/config/redis/RedisConfig.java (content)
⚔️ src/main/java/com/example/solidconnection/common/exception/ErrorCode.java (content)
⚔️ src/main/java/com/example/solidconnection/community/post/service/PostCommandService.java (content)
⚔️ src/main/java/com/example/solidconnection/community/post/service/PostQueryService.java (content)
⚔️ src/main/java/com/example/solidconnection/community/post/service/UpdateViewCountService.java (content)
⚔️ src/main/java/com/example/solidconnection/mentor/controller/MentorMyPageController.java (content)
⚔️ src/main/java/com/example/solidconnection/mentor/domain/Mentor.java (content)
⚔️ src/main/java/com/example/solidconnection/mentor/service/MentorMyPageService.java (content)
⚔️ src/main/java/com/example/solidconnection/scheduler/UpdateViewCountScheduler.java (content)
⚔️ src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java (content)
⚔️ src/main/java/com/example/solidconnection/university/domain/HostUniversity.java (content)
⚔️ src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java (content)
⚔️ src/main/java/com/example/solidconnection/util/RedisUtils.java (content)
⚔️ src/test/java/com/example/solidconnection/admin/service/AdminHostUniversityServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/community/post/service/PostQueryServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/concurrency/PostViewCountConcurrencyTest.java (content)
⚔️ src/test/java/com/example/solidconnection/mentor/service/MentorMyPageServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/mentor/service/MentorQueryServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/university/fixture/UnivApplyInfoFixture.java (content)
⚔️ src/test/java/com/example/solidconnection/university/fixture/UniversityFixture.java (content)
⚔️ src/test/java/com/example/solidconnection/university/fixture/UniversityFixtureBuilder.java (content)
⚔️ src/test/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/university/service/UnivApplyInfoQueryServiceTest.java (content)
⚔️ src/test/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendServiceTest.java (content)

These conflicts must be resolved before merging into develop.
Resolve conflicts locally and push changes to this branch.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 PR의 주요 변경사항인 대학 캐시 무효화 정책 추가를 명확하게 나타내고 있습니다.
Description check ✅ Passed PR 설명이 관련 이슈, 작업 내용을 상세히 기술하고 있으며, 리뷰 요구사항도 포함되어 있습니다.
Linked Issues check ✅ Passed PR의 모든 변경사항이 issue #648의 목표인 대학 정보 업데이트 시 캐시 무효화 요구사항을 충족합니다 [#648].
Out of Scope Changes check ✅ Passed 모든 변경사항이 캐시 무효화 정책 추가라는 issue #648의 범위 내에 있으며, 범위를 벗어난 변경은 없습니다.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
⚔️ Resolve merge conflicts (beta)
  • Auto-commit resolved conflicts to branch refactor/648-invalidate-cache-on-university-update
  • Post resolved changes as copyable diffs in a comment

No actionable comments were generated in the recent review. 🎉

🧹 Recent nitpick comments
src/main/java/com/example/solidconnection/admin/university/service/AdminHostUniversityService.java (1)

129-130: 캐시 무효화 전략의 일관성을 검토하세요.

  1. 타이밍 불일치 확인됨

    • @DefaultCacheOut AOP는 메서드 실행 전에 캐시를 삭제합니다 (트랜잭션 시작 전)
    • 수동으로 호출하는 evictUnivApplyInfoDetailCaches(id)는 트랜잭션 커밋 전에 캐시를 삭제합니다
    • 두 메커니즘이 다른 타이밍에 동작합니다
  2. 현재 코드의 위험도는 낮음

    • Line 130 이후 DTO 변환만 진행되므로 예외 발생 가능성이 실질적으로 낮습니다
    • 그러나 이후 로직이 추가되면 캐시 삭제 후 롤백되는 문제가 발생할 수 있습니다
  3. 권장사항

    • @DefaultCacheOut으로 통일하여 evictUnivApplyInfoDetailCaches() 수동 호출 제거 검토
    • 또는 evictUnivApplyInfoDetailCaches()를 트랜잭션 커밋 후 실행되도록 개선 (예: TransactionSynchronizationManager 활용)

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.

Copy link
Member

@whqtker whqtker left a comment

Choose a reason for hiding this comment

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

확인했습니다 ~!!

if (keys != null && !keys.isEmpty()) {
redisTemplate.delete(keys);
}
}
Copy link
Member

Choose a reason for hiding this comment

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

CacheManager 인터페이스에 해당 추상 메서드 작성해주세요 !!

}
}

private void evictUnivApplyInfoDetailCaches(Long hostUniversityId) {
Copy link
Member

Choose a reason for hiding this comment

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

마지막으로 해당 메서드를 호출하는 곳이 updateHostUniversity이기에 해당 메서드 밑에 선언부를 위치시켜주세요 !

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.

refactor: 대학 정보 업데이트 시 캐시 무효화

2 participants