Skip to content

[FEATURE] 워터마크 재처리 스케줄러 추가#119

Closed
Jong0128 wants to merge 12 commits into
devfrom
feat/#116-watermark-scheduler
Closed

[FEATURE] 워터마크 재처리 스케줄러 추가#119
Jong0128 wants to merge 12 commits into
devfrom
feat/#116-watermark-scheduler

Conversation

@Jong0128

@Jong0128 Jong0128 commented Jul 11, 2026

Copy link
Copy Markdown
Collaborator

🚀 Related issue

Closes #116

#️⃣ Summary

  • 비동기 워터마크 처리가 실패했거나 중간에 멈춘(PROCESSING) 파일을 주기적으로 재처리하는 스케줄러를 추가했습니다.

🔧 Changes

  • WatermarkRetryScheduler — 10분 주기로 미완료 워터마크 재처리
  • CommissionDraftFile — 재시도 카운트(watermarkRetryCount) 및 워터마크 상태 전이 메서드 추가
  • findWatermarkRetryTargetIds + claimForRetry — 재처리 대상을 원자적으로 선점(PROCESSING 전이 + 카운트 증가)해 중복 큐잉 방지
  • 한 틱당 처리량 배치 상한(BATCH_SIZE = 20) 적용

📸 Test Evidence

💬 Reviewer Notes

  • 중복 큐잉 방지: 단순 조회 후 재큐잉하면 아직 큐에서 대기 중인 파일을 다음 스케줄 틱이 다시 잡을 수 있습니다. claimForRetry 벌크 UPDATE로 대상을 PROCESSING으로 선점하며 updatedAt을 갱신해 다음 틱의 재선정을 차단했습니다.
  • 무한 재시도 방지: 카운트 증가를 실패 시점이 아니라 선점(claim) 시점으로 옮겨, fail()에 도달하지 못하고 멈춘(hang) 파일도 재시도 한도(MAX_WATERMARK_RETRY = 3)에 걸려 종료되도록 했습니다.

Summary by CodeRabbit

  • 새로운 기능

    • 커미션 초안 및 수정본 제출 시 파일 워터마크 처리를 자동으로 시작합니다.
    • 이미지에 워터마크를 적용한 미리보기를 생성하고 저장합니다.
    • 워터마크 처리 실패 시 최대 3회까지 자동 재시도합니다.
    • 이미지 해상도 초과 및 읽기 실패를 명확한 오류로 안내합니다.
  • 개선 사항

    • 워터마크 처리를 비동기로 실행해 제출 흐름의 대기 시간을 줄였습니다.
    • 장시간 중단된 처리를 주기적으로 감지하고 재처리합니다.

@Jong0128 Jong0128 self-assigned this Jul 11, 2026
@Jong0128 Jong0128 requested a review from fervovita as a code owner July 11, 2026 16:51
@Jong0128 Jong0128 closed this Jul 11, 2026
@coderabbitai

coderabbitai Bot commented Jul 11, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro Plus

Run ID: 47f32bf9-7067-4186-b7d2-c1cd2aba0907

📥 Commits

Reviewing files that changed from the base of the PR and between 3e8429d and 5710098.

⛔ Files ignored due to path filters (1)
  • src/main/resources/images/watermark-logo.png is excluded by !**/*.png
📒 Files selected for processing (17)
  • src/main/java/ditda/backend/domain/commission/draft/entity/CommissionDraftFile.java
  • src/main/java/ditda/backend/domain/commission/draft/event/DraftFilesSubmittedEvent.java
  • src/main/java/ditda/backend/domain/commission/draft/facade/DesignerDraftFacade.java
  • src/main/java/ditda/backend/domain/commission/draft/listener/DraftWatermarkListener.java
  • src/main/java/ditda/backend/domain/commission/draft/repository/CommissionDraftFileRepository.java
  • src/main/java/ditda/backend/domain/commission/draft/scheduler/WatermarkRetryScheduler.java
  • src/main/java/ditda/backend/domain/commission/draft/service/DraftWatermarkService.java
  • src/main/java/ditda/backend/domain/commission/draft/service/DraftWatermarkTransitionService.java
  • src/main/java/ditda/backend/domain/commission/draft/service/WatermarkRetryService.java
  • src/main/java/ditda/backend/domain/commission/revision/facade/DesignerRevisionFacade.java
  • src/main/java/ditda/backend/global/config/WatermarkAsyncConfig.java
  • src/main/java/ditda/backend/global/image/WatermarkImageProcessor.java
  • src/main/java/ditda/backend/global/image/dto/WatermarkedImage.java
  • src/main/java/ditda/backend/global/image/exception/ImageErrorCode.java
  • src/main/java/ditda/backend/global/s3/manager/S3FileManager.java
  • src/test/java/ditda/backend/domain/commission/draft/service/DraftWatermarkServiceTest.java
  • src/test/java/ditda/backend/global/image/WatermarkImageProcessorTest.java

📝 Walkthrough

Walkthrough

드래프트 및 수정본 제출 후 워터마크를 비동기로 생성하고, 처리 실패 또는 장기 정체 파일을 제한된 횟수만큼 재처리하는 기능을 추가했습니다. 이미지 변환, S3 입출력, 상태 전이, 재시도 스케줄러와 관련 테스트가 포함됩니다.

Changes

워터마크 처리 흐름

Layer / File(s) Summary
워터마크 상태 및 데이터 계약
src/main/java/ditda/backend/domain/commission/draft/entity/CommissionDraftFile.java, src/main/java/ditda/backend/domain/commission/draft/event/DraftFilesSubmittedEvent.java, src/main/java/ditda/backend/global/image/...
재시도 횟수와 상태 전이 메서드, 제출 이벤트, 워터마크 이미지 DTO 및 이미지 오류 코드를 추가했습니다.
이미지 생성 및 상태 전이 파이프라인
src/main/java/ditda/backend/global/image/WatermarkImageProcessor.java, src/main/java/ditda/backend/global/s3/manager/S3FileManager.java, src/main/java/ditda/backend/domain/commission/draft/service/..., src/test/java/ditda/backend/...
S3 원본 다운로드, 워터마크 합성 및 PNG 업로드, 완료·실패 전이를 구현하고 이미지 처리와 서비스 시나리오를 검증했습니다.
제출 후 비동기 처리 연결
src/main/java/ditda/backend/domain/commission/{draft,revision}/facade/..., src/main/java/ditda/backend/domain/commission/draft/listener/..., src/main/java/ditda/backend/global/config/WatermarkAsyncConfig.java
드래프트와 수정본 제출 시 이벤트를 발행하고, 커밋 이후 전용 실행기에서 워터마크 처리를 시작하도록 연결했습니다.
미완료 워터마크 재시도
src/main/java/ditda/backend/domain/commission/draft/repository/..., src/main/java/ditda/backend/domain/commission/draft/service/..., src/main/java/ditda/backend/domain/commission/draft/scheduler/...
실패 또는 장기 처리 중인 파일을 조회·선점하고 비동기로 재처리하는 서비스와 10분 주기 스케줄러를 추가했습니다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant DesignerDraftFacade
  participant DraftWatermarkListener
  participant DraftWatermarkService
  participant S3FileManager
  participant DraftWatermarkTransitionService
  DesignerDraftFacade->>DraftWatermarkListener: DraftFilesSubmittedEvent 발행
  DraftWatermarkListener->>DraftWatermarkService: 커밋 이후 비동기 처리
  DraftWatermarkService->>S3FileManager: 원본 다운로드 및 결과 업로드
  DraftWatermarkService->>DraftWatermarkTransitionService: 완료 또는 실패 전이
Loading

Possibly related PRs

Suggested reviewers: fervovita

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#116-watermark-scheduler

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.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] 워터마크 재처리 스케줄러 추가

1 participant