Skip to content

[Feat] 이미지 변환 상태 연동 추가 (#188) - #189

Open
hwistlezz wants to merge 19 commits into
chore/#186/image-transform-infrafrom
feat/#188/image-transform-state
Open

hwistlezz wants to merge 19 commits into
chore/#186/image-transform-infrafrom
feat/#188/image-transform-state

Conversation

@hwistlezz

@hwistlezz hwistlezz commented Aug 27, 2026

Copy link
Copy Markdown
Member

🔥 작업 내용 (What)

Spring 서버에서 이미지 변환 요청을 보내고, worker의 처리 결과를 받아 이미지 상태를 갱신하도록 연결했습니다. 메시지가 중복되거나 순서가 바뀌어도 기존 정상 이미지 상태가 잘못 변경되지 않도록 처리했습니다.


🧩 변경 사항 (Details)

  • EPR에 기록된 작업을 요청 SQS로 발행하고, 발행에 실패한 작업은 다시 보낼 수 있도록 했습니다.
  • 결과 메시지의 원본 버전·규격·작업 ID를 확인한 뒤 asset을 잠그고 READY·FAILED와 파생본 정보를 함께 반영합니다.
  • DB 반영이 끝난 뒤에만 결과 메시지를 ACK합니다. 중복 결과나 이전 작업의 늦은 결과는 무시합니다.
  • 오래 PROCESSING 상태에 머무른 작업의 재발행과 EPR 재전송량 제한을 추가했습니다.
  • V17에 상태 처리용 제약과 조회 인덱스를 추가하고, 미연결 이미지 정리 후보를 keyset 방식으로 조회하도록 했습니다.
  • 처리 상태·시간·용량·복구·실패 건수를 지표로 기록합니다.
  • EPR 테스트가 실행 환경의 시간대에 영향을 받지 않도록, 만료 시간도 서비스와 같은 시계로 만들게 했습니다.

이번 실패 코드 보완

  • 너무 작은 원본의 SOURCE_TOO_SMALL 결과를 받아 저장하도록 했습니다. 기존 대용량 오류 코드 3종은 그대로 유지합니다.
  • #185와 같은 실패 메시지 예시를 추가했습니다. 이 consumer를 먼저 배포한 뒤 새 worker를 활성화해야 합니다.
  • 9d29d6a에서 결과 파싱 테스트 11개와 MySQL 결과 처리 통합 테스트 20개를 실행했습니다. 실패·오류·건너뛴 테스트는 없습니다.
  • 아래 전체 빌드 기록은 이전 커밋의 결과입니다. 이번 검증은 실패 코드 호환 변경 범위이며, [Feat] 이미지 변환 상태 연동 추가 (#188) #189 전체 재검토나 AWS 검증을 완료했다는 의미는 아닙니다.

팀원 리뷰 반영

  • a34e097: 기존 업로드도 실제 AWS SDK presigner로 URL을 만드는지 확인하는 테스트 9개를 추가했습니다. PUT, 만료시간, 파일 헤더와 키 인코딩을 검사하며 AWS에는 요청하지 않습니다.
  • 133b089: 시작 시 이미지 작업 세 가지를 각각 실행하고, 하나가 실패해도 나머지 작업과 서버 시작을 막지 않도록 했습니다. 트랜잭션 시작·종료 실패도 처리하고 작업명과 오류 유형을 기록합니다. 정기 실행 간격과 재시도 조건은 유지했습니다.
  • 시작 이벤트 전달, 각 작업 실패 후 재시도, 트랜잭션 시작·종료 실패, 기능 비활성화 테스트 8개를 추가했습니다.
  • Java 21에서 UTC 테스트 설정으로 전체 build를 실행해 테스트 330개가 통과했습니다. 실패·오류·건너뛴 테스트는 없습니다. 테스트 종료 시 MySQL 연결 및 EPR 종료 경고가 있었으나 빌드는 성공했습니다.
  • 실제 AWS 업로드·큐 처리와 실시간 예약 실행을 확인한 결과는 아닙니다. Java CI는 대상 브랜치 정리 후 별도로 확인해야 합니다.

최신 #187 반영

  • bddbccd에서 #187의 최신 변경(7449b7c)을 반영했습니다. worker 오류 처리·테스트, CI 구성, 문서 변경이 포함됩니다.
  • Java 관련 테스트 24개, worker 테스트 44개, 인프라 테스트 45개가 통과했고 TypeScript 타입 검사도 통과했습니다.
  • 이번 검증은 상위 변경 반영 범위입니다. 전체 서버 빌드와 실제 AWS 테스트는 다시 실행하지 않았습니다.
  • 당시 남아 있던 presigner 테스트와 시작 시 복구 실패 처리는 위 후속 커밋에서 보완했습니다.

이전 검증 기록

  • c21c359에서 테스트 JVM을 UTC로 설정해 전체 빌드·테스트를 실행했습니다. 서버 테스트 300개 통과, 실패·오류·건너뛴 테스트 0개입니다.
  • 수정 전에는 UTC에서 업로드 만료 오류가 재현됐고, 수정 후 EPR 테스트 6개와 모듈 검증을 포함해 통과했습니다.
  • worker·인프라는 이번 보완에서 변경하지 않았습니다. 기존 988be41 검증 결과는 worker 테스트 40개, 인프라 스크립트 테스트 33개, SAM 빌드·Lambda ZIP 검증 통과입니다.
  • 테스트 종료 시 MySQL 연결과 EPR 종료 경고가 있었으며, 테스트 결과와 빌드 종료 코드는 정상입니다.

📸 스크린샷

화면 변경은 없습니다. 테스트 결과는 위에 정리했습니다.


⚠️ 주의 사항 (Caution)

  • #187을 기반으로 한 PR입니다.
  • 이 브랜치의 Java CI는 develop/main 대상 PR에서 실행됩니다. 대상 브랜치를 정리한 뒤 현재 커밋의 GitHub 빌드·테스트를 확인해야 합니다.
  • V17 적용 전 issuance_enabled=false와 대상 PROCESSING 작업이 없는지 확인해야 합니다.
  • 현재의 단일 Spring EC2 컨테이너 교체 배포를 전제로 합니다. 구 버전으로 되돌릴 때는 작업 발급과 event source를 중지하고 EPR·큐·처리 중 작업을 먼저 정리해야 합니다.
  • 실제 AWS 배포나 큐·작업 발급 활성화는 하지 않았습니다. AWS 통합 테스트, DLQ 재처리, 파일 정리·정합성 복구는 활성화 전에 확인해야 합니다.
  • 식당·메뉴 등 도메인별 연동과 기존 이미지 전환은 후속 PR에서 진행합니다.

🔗 관련 이슈

Closes #188

선행 PR: #187


✅ 체크리스트

  • 로컬 빌드 및 테스트
  • 변경하지 않은 worker·SAM의 기존 검증 확인
  • 기존 업로드 presigner 테스트와 시작 시 복구 실패 처리 보완
  • 대상 브랜치 정리 후 현재 커밋의 Java CI
  • 실제 AWS 환경 통합 테스트

@coderabbitai

coderabbitai Bot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

🗂️ Base branches to auto review (2)
  • develop
  • main

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: ASSERTIVE

Plan: Advanced

Run ID: bbbf374e-f0ae-4f07-8ac6-95ba6934a6dc

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

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.

@hwistlezz
hwistlezz marked this pull request as ready for review September 3, 2026 09:49

@gichanGim gichanGim left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

수고하셨습니다! 코멘트 확인 부탁드려요!

Comment thread build.gradle

// aws
implementation 'software.amazon.awssdk:s3:2.25.60'
implementation 'software.amazon.awssdk:s3'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

버전 번호를 지우시면서 AWS SDK가 2.25.60 → 2.31.78로 올라가는 상황이에요.

이걸 기존 /api/v1/uploads presigned URL 발급도 같이 쓰는데, UploadServiceTest는 FakeFileStorage라 SDK를 안 타서 동작이 바뀌어도 못 잡고, 이걸 잡아줄 테스트도 없는 상황인 것 같습니다.
ADR 4절 "기존 S3 presigner 동작은 dependency 변경 전후 회귀 테스트로 고정한다"가 이 경우인 것 같습니다.

S3MediaOriginalStorageTest처럼 실제 presigner 쓰는 테스트를 하나 추가해주시거나, 2.25.60 버전으로 유지하는게 좋을 것 같습니다!

@hwistlezz hwistlezz Sep 14, 2026

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

실제 presigner로 기존 업로드 URL을 발급하는 테스트를 추가했습니다!
라이브러리 버전은 현재 설정을 유지햇습니다.

recoverStalledProcessing();
}

@EventListener(ApplicationReadyEvent.class)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ApplicationReadyEvent 리스너 세 개에 try/catch가 없어 보입니다.

Boot가 이 리스너 예외를 기동 실패로 처리하는 걸로 알고 있는데, 맞다면
recoverStalledProcessing()이 최대 1,000건 도는 중 락 타임아웃 한 번에 앱이 안 뜰 수 있지 않을까라는 생각이 듭니다!

try/catch로 감싸거나 @async로 떼는 건 어떠실까요?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

시작할 때 실행하는 이미지 작업은 각각 오류를 처리하도록 수정했습니다!
하나가 실패해도 나머지는 실행하고, 실패한 작업은 기존 주기에 다시 확인하게 햇습니다

@gichanGim
gichanGim force-pushed the chore/#186/image-transform-infra branch from 437dde1 to dd94616 Compare September 9, 2026 00:25
@gichanGim
gichanGim force-pushed the feat/#188/image-transform-state branch from c21c359 to 6c1cb94 Compare September 9, 2026 00:26
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.

2 participants