[featuer] 백엔드 스케쥴러 ShedLock 도입하여 중복 스케쥴링 방지#1186
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning
|
| Cohort / File(s) | Summary |
|---|---|
빌드 의존성 backend/build.gradle |
net.javacrumbs.shedlock:shedlock-spring:7.6.0 및 ...:shedlock-provider-mongo:7.6.0 의존성 추가. |
Mongo 설정 / ShedLock 활성화 backend/src/main/java/moadong/global/config/MongoConfig.java |
클래스에 @EnableSchedulerLock(defaultLockAtMostFor = "2m", defaultLockAtLeastFor = "30s") 추가 및 public LockProvider lockProvider(MongoClient) 빈 추가하여 new MongoLockProvider(mongoClient.getDatabase("shedLock")) 반환. |
스케줄러 잠금 적용 backend/src/main/java/moadong/club/service/RecruitmentStateChecker.java |
@SchedulerLock(name = "RecruitmentStateChecker", lockAtMostFor = "1m", lockAtLeastFor = "1s") 추가 및 fixedRate를 1시간(60601000)에서 10분(10601000)으로 변경. |
Sequence Diagram(s)
mermaid
sequenceDiagram
participant Scheduler as RecruitmentStateChecker
participant LockProvider as MongoLockProvider
participant Mongo as MongoDB
Scheduler->>LockProvider: lock request (name="RecruitmentStateChecker")
LockProvider->>Mongo: create/verify lock document
Mongo-->>LockProvider: lock acquired
LockProvider-->>Scheduler: grant lock
Scheduler->>Scheduler: performTask()
Scheduler->>LockProvider: release/extend lock (as needed)
LockProvider->>Mongo: update/release lock document
Estimated code review effort
🎯 2 (Simple) | ⏱️ ~10 minutes
Possibly related PRs
- [fix] 스케줄러는 db를 참조하여 모집현황을 갱신한다 #401: RecruitmentStateChecker 및 스케줄링 관련 변경으로 동일 스케줄러에 대한 수정/중복성 방지 맥락에서 관련됨.
- [feature] 액세스 토큰 및 리프레시 토큰의 만료 시간을 수정하고, 로그인, 관리자 계정 관련의 동시성 문제를 해결한다 #713: RecruitmentStateChecker 및 MongoConfig 변경 이력이 있어 ShedLock 및 Mongo 관련 설정 변경과 코드 수준으로 겹침.
Suggested reviewers
- Zepelown
- PororoAndFriends
🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
| Check name | Status | Explanation | Resolution |
|---|---|---|---|
| Docstring Coverage | 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. |
✅ Passed checks (4 passed)
| Check name | Status | Explanation |
|---|---|---|
| Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. |
| Title check | ✅ Passed | 제목에 오타 '[featuer]'가 있으나, 전체적으로 ShedLock 도입을 통한 중복 스케줄링 방지라는 변경사항의 핵심을 명확히 전달한다. |
| Linked Issues check | ✅ Passed | 코드 변경사항이 MOA-637의 목표인 'ShedLock 도입을 통한 중복 스케줄링 방지'를 충족한다. ShedLock 의존성 추가, 설정 구현, 스케줄러에 분산 잠금 적용이 모두 포함되어 있다. |
| Out of Scope Changes check | ✅ Passed | 모든 변경사항이 ShedLock 도입과 스케줄 주기 변경이라는 정의된 범위 내에 있으며, 연관된 목표를 벗어나는 수정사항은 없다. |
✏️ 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
- Commit unit tests in branch
feature/#1185-add-shedlock-MOA-637
No actionable comments were generated in the recent review. 🎉
🧹 Recent nitpick comments
backend/src/main/java/moadong/club/service/RecruitmentStateChecker.java (1)
29-41:performTask()로직 자체는 문제없습니다.ShedLock 락 설정만 조정되면 전체 흐름에 이슈는 없어 보입니다. 다만, 클럽 수가 증가할 경우
findAll()+ 개별save()의 성능이 병목이 될 수 있으므로 중장기적으로saveAll()배치 저장이나 변경된 클럽만 필터링하는 방식을 고려해 보시는 것을 권장합니다.,
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.
Comment @coderabbitai help to get the list of available commands and usage tips.
Test Results72 tests 72 ✅ 16s ⏱️ Results for commit b152c91. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@backend/src/main/java/moadong/club/service/RecruitmentStateChecker.java`:
- Around line 27-28: The ShedLock timings on RecruitmentStateChecker (the
`@Scheduled` method performTask()) are too short — remove the method-level
lockAtMostFor/lockAtLeastFor attributes on the `@SchedulerLock` annotation so the
MongoConfig defaults (defaultLockAtMostFor = "2m" and defaultLockAtLeastFor =
"30s") apply, or if you prefer to keep overrides, increase lockAtMostFor to a
value comfortably above expected run time (e.g., >= 2m) and set lockAtLeastFor
to a higher value (tens of seconds) to match the 10-minute schedule; update the
`@SchedulerLock` on performTask() accordingly.
🧹 Nitpick comments (2)
backend/src/main/java/moadong/global/config/MongoConfig.java (2)
21-24: 하드코딩된 데이터베이스 이름"shedLock"대신 애플리케이션 설정을 활용하는 것을 권장합니다.현재
MongoClient에서 직접"shedLock"데이터베이스를 가져오고 있어, 애플리케이션의 기본 MongoDB 데이터베이스와 별도의 DB가 생성됩니다. 이미 빈으로 등록된MongoDatabaseFactory를 활용하면 애플리케이션과 동일한 데이터베이스 내에 ShedLock 컬렉션이 생성되어 관리가 더 용이합니다.♻️ MongoDatabaseFactory 활용 제안
`@Bean` - public LockProvider lockProvider(MongoClient mongoClient) { - return new MongoLockProvider(mongoClient.getDatabase("shedLock")); + public LockProvider lockProvider(MongoDatabaseFactory mongoDatabaseFactory) { + return new MongoLockProvider(mongoDatabaseFactory.getMongoDatabase()); }별도 DB를 의도적으로 사용하는 것이라면, 최소한 데이터베이스 이름을
application.yml에서 설정 가능하도록 외부화하는 것을 고려해 주세요.
13-13:@EnableSchedulerLock기본값은 적절합니다.
defaultLockAtMostFor = "2m",defaultLockAtLeastFor = "30s"설정은 10분 주기 스케줄러에 합리적인 기본값입니다. 다만, 이 어노테이션은 스케줄링 설정에 가까우므로MongoConfig보다는 별도의 스케줄링 설정 클래스에 두는 것이 관심사 분리 측면에서 더 적절할 수 있습니다.
backend/src/main/java/moadong/club/service/RecruitmentStateChecker.java
Outdated
Show resolved
Hide resolved
|
락이 디비에 있는건가요? |
맞습니다~ |
#️⃣연관된 이슈
#1185
📝작업 내용
ShedLock을 추가해 k8s 환경의 레플리카에 동시에 스케쥴링이 되지않게 방지하였습니다
또한 기존 모집상태를 추적하던 스케쥴러의 1시간이 길다고 판단되어 10분으로 줄였습니다
중점적으로 리뷰받고 싶은 부분(선택)
논의하고 싶은 부분(선택)
🫡 참고사항
Summary by CodeRabbit