Skip to content

[Feat] 프로필 및 매거진 최적화 이미지 연동 (#192) - #193

Open
hwistlezz wants to merge 74 commits into
developfrom
feat/#192/profile-magazine-media
Open

hwistlezz wants to merge 74 commits into
developfrom
feat/#192/profile-magazine-media

Conversation

@hwistlezz

@hwistlezz hwistlezz commented Aug 31, 2026

Copy link
Copy Markdown
Member

🔥 작업 내용 (What)

온보딩 프로필과 매거진 배너·썸네일에 새 이미지 asset 입력과 최적화 이미지 응답을 추가했습니다. 기존 key와 URL 필드는 전환 기간 동안 유지합니다.


🧩 변경 사항 (Details)

  • V20·V21에서 프로필·매거진 이미지의 nullable UUID 컬럼과 unique·check 제약을 추가했습니다. 다른 모듈의 테이블과 FK로 연결하지 않습니다.
  • 온보딩에서 회원 생성, 인증 계정 연결, 프로필 asset 소유권 인계와 연결을 같은 트랜잭션으로 처리합니다. 최초 업로드한 주체의 이력은 유지합니다.
  • 프로필·어드민 회원·리뷰 작성자 응답은 ImageReference를 전달하고, 응답을 만드는 Service에서 필요한 이미지를 한 번에 조회합니다.
  • 매거진 배너와 썸네일의 용도와 READY 상태를 각각 확인합니다. 같은 이미지를 다시 보내면 기존 연결을 유지하며, 교체·삭제 요청은 매거진 잠금 아래 처리합니다.
  • 새 asset이 있는 이미지에는 legacy URL fallback을 적용하지 않습니다. 새 이미지가 아직 준비되지 않았다면 교체 요청을 거부하고 기존 이미지를 유지합니다.
  • 선행 PR #191의 일괄 소유권 검증, 업로드 완료·연결 요청의 잠금 순서 보완, UTC 테스트 시각 수정과 CI 설정을 반영했습니다. 온보딩 전용 소유권 인계 테스트도 그대로 유지했습니다.

테스트

  • be06cfa 기준으로 테스트 JVM에 UTC를 적용해 전체 clean build를 실행했습니다. 테스트 432개 통과, 실패·오류·건너뛴 테스트 0개입니다.
  • GitHub CI도 동일한 소스 기준으로 통과했습니다. 테스트 432개와 PR 컨벤션 검사를 확인했습니다.
  • 모듈 구조와 실제 MySQL migration·트랜잭션·동시성·권한 검증을 포함합니다. 매거진 목록의 실제 SQL 조회 수와 프로필·리뷰 작성자 이미지의 일괄 조회 호출도 확인했습니다.
  • 로컬 테스트 종료 시 DB 연결 경고가 있었으며, 테스트 결과와 최종 빌드 종료 코드는 정상입니다.

📸 스크린샷

화면 변경은 없습니다. 테스트 결과는 위 CI 링크에서 확인할 수 있습니다.


⚠️ 주의 사항 (Caution)

  • #191을 기반으로 작성했습니다. develop 통합은 선행 PR부터 순서대로 진행해야 합니다.
  • V20은 공백인 기존 프로필 key를 null로 정리합니다. V21은 잘못된 기존 매거진 key를 발견하면 컬럼 추가 전에 중단합니다. MySQL migration 전체의 rollback을 보장하는 것은 아닙니다.
  • 매거진 soft delete에서는 asset 연결을 유지합니다. 물리 삭제는 별도 보존 정책을 따릅니다.
  • issuance_enabled=false를 유지하며, 실제 AWS 적용·운영 전환·backfill은 하지 않았습니다.
  • 프로필 수정 API와 리뷰 자체 이미지 연동은 포함하지 않습니다. 리뷰 연동은 [Feat] 리뷰 수정 API 추가 #179 이후 진행합니다.

🔗 관련 이슈

Closes #192

선행 PR: #191


✅ 체크리스트

  • 현재 커밋의 로컬 전체 빌드 및 테스트 완료
  • 테스트 결과를 확인할 수 있는 CI 링크 첨부
  • 코드 리뷰에서 확인한 수정 사항 반영
  • 현재 변경분의 GitHub CI 통과

@hwistlezz
hwistlezz marked this pull request as ready for review September 4, 2026 16:26
gichanGim
gichanGim previously approved these changes Sep 8, 2026

@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 on lines +49 to +60
private MediaProjection loadProfileProjection(List<ImageReference> references) {
List<MediaImageRequest> requests = references.stream()
.filter(Objects::nonNull)
.map(ImageReference::assetId)
.filter(Objects::nonNull)
.map(assetId -> new MediaImageRequest(assetId, MediaImageRole.PROFILE_AVATAR))
.distinct()
.toList();
return requests.isEmpty()
? MediaProjection.empty()
: new MediaProjection(mediaPort.findImages(requests));
}

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.

MediaProjection / ProjectedImage / load*Projection 묶음이 이 PR에서 세 군데 더 늘었습니다. role만 다를 뿐 뼈대가 같은 구조를 여덟 개 클래스가 들고 있게 됐습니다.

READY 판정이나 role 매핑이 바뀌면 여덟 군데를 같이 고쳐야 하는데 백필 PR이 네 개 더
남아 있어서 계속 늘어날 것 같습니다. #191에도 같은 얘기를 남겼는데, 지금 media 쪽으로
빼두면 뒤 PR들이 가져다 쓰면 되지 않을까요?

@gichanGim
gichanGim force-pushed the feat/#192/profile-magazine-media branch from be06cfa to f2db721 Compare September 9, 2026 00:25
@hwistlezz
hwistlezz changed the base branch from feat/#190/restaurant-menu-media to develop September 16, 2026 15:01
@hwistlezz
hwistlezz dismissed gichanGim’s stale review September 16, 2026 15:01

The base branch was changed.

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.

[Feat] 프로필 및 매거진 최적화 이미지 연동

2 participants