Skip to content

feat(S15P11A705-305): record 상세 응답에 place 썸네일을 추가한다 - #184

Merged
minyongP merged 3 commits into
devfrom
feat/S15P11A705-305-place-thumbnail
Aug 4, 2026
Merged

feat(S15P11A705-305): record 상세 응답에 place 썸네일을 추가한다#184
minyongP merged 3 commits into
devfrom
feat/S15P11A705-305-place-thumbnail

Conversation

@minyongP

@minyongP minyongP commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

무엇을

record 상세(명세 11.1) 응답의 placethumbnailUrl을 추가한다. 시연용 목업 단계다 — 카카오 로컬 API는 장소 사진을 제공하지 않으므로, 백엔드 정적 리소스 이미지를 두고 시연 대상 place에 SQL로 수동 연결한다.

  • Flyway V7__place_thumbnail_url.sql: core.place.thumbnail_url varchar(300) (nullable)
  • Place 엔티티 thumbnailUrl 필드·getter (create() 시그니처 불변 — 생성 경로는 값을 채우지 않는다)
  • PlaceSummaryResponse.thumbnailUrl — 이 DTO를 쓰는 모든 응답에 반영, null이어도 필드를 생략하지 않는다
  • 더미 이미지 4장은 src/test/resources/static/images/places/*.jpg (1200×900, 4:3) — 테스트 전용이라 배포 산출물에 실리지 않는다. 시연용 실제 이미지(표지)가 나오면 같은 파일명 규약으로 src/main/resources/static/images/places/에 커밋한다
  • SecurityConfigPUBLIC_STATIC_ASSETS(/images/places/**) permitAll 추가

왜 인증 제외가 필요한가

정적 서빙 테스트가 404가 아니라 401로 실패하면서 anyRequest().authenticated()에 막히는 것을 잡았다. 프론트가 <img src>로 직접 로드하는 경로라 인증을 요구하면 화면에서 이미지가 깨진다. 장소 이미지는 비밀이 아니다.

계약 메모

  • 저장값은 context-path 포함 절대 경로(/api/core/images/places/cafe-1.jpg). 프론트는 그대로 <img src>에 쓴다. 이후 카카오 이미지 검색 API(GET /v2/search/image) 전환 시 같은 컬럼에 외부 절대 URL이 들어가고 프론트 계약은 바뀌지 않는다.
  • 이미지는 WebP로 계획했으나 로컬 인코더 부재로 JPEG로 생성했다. 경로·비율·용량 계약은 동일하다.
  • 시연 UPDATE SQL은 표지 이미지가 main에 커밋·배포된 뒤에 실행한다 — 그 전에는 thumbnail_url이 전부 null이라 화면 변화가 없다.
  • 문서 반영 완료: docs 레포 §2.3 place·§11.1 PlaceSummary (docs#47, 머지됨)

시연 준비 SQL (배포 후 수동 실행)

UPDATE core.place SET thumbnail_url = '/api/core/images/places/cafe-1.jpg'       WHERE id = <place id>;
UPDATE core.place SET thumbnail_url = '/api/core/images/places/cafe-2.jpg'       WHERE id = <place id>;
UPDATE core.place SET thumbnail_url = '/api/core/images/places/restaurant-1.jpg' WHERE id = <place id>;
UPDATE core.place SET thumbnail_url = '/api/core/images/places/park-1.jpg'       WHERE id = <place id>;

배포 DB 쓰기 권한은 infra#189에서 요청 중이다.

검증

  • TDD: 상세 응답 값 있음/null 두 케이스 + 정적 서빙 200 — RED(401·404·컬럼 없음) 확인 후 GREEN
  • ./gradlew clean check --no-daemon 통과

Closes #182

🤖 Generated with Claude Code

카카오 로컬 API는 장소 사진을 제공하지 않으므로 시연용 목업 단계로 간다.
core.place.thumbnail_url(V7, nullable)을 추가하고 PlaceSummaryResponse로
내려주며, 정적 이미지 4장을 /images/places/에 두어 SQL로 수동 연결한다.
저장값은 context-path 포함 절대 경로라 카카오 이미지 검색 API 전환 시에도
프론트 계약이 바뀌지 않는다.

이미지 경로는 인증 제외다 — 정적 서빙 테스트가 401로 실패하며
anyRequest().authenticated()에 막히는 것을 잡았고, img 태그 요청에는
인증 컨텍스트가 보장되지 않아 /images/places/**를 permitAll로 연다.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@minyongP minyongP added the enhancement 새 기능·개선 (feat) label Aug 4, 2026
@minyongP minyongP self-assigned this Aug 4, 2026
minyongP and others added 2 commits August 4, 2026 16:42
시연용 실제 이미지(표지)가 나오면 버려질 파일이라 배포 산출물에 싣지
않는다. 테스트 클래스패스의 static/도 MockMvc에서 동일하게 서빙되므로
경로·인증 제외 검증은 그대로다. 표지는 같은 파일명 규약으로
src/main/resources/static/images/places/에 커밋한다.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@minyongP
minyongP merged commit 7c46595 into dev Aug 4, 2026
2 checks passed
@minyongP
minyongP deleted the feat/S15P11A705-305-place-thumbnail branch August 4, 2026 07:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement 새 기능·개선 (feat)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: record 상세 응답에 place 썸네일(thumbnailUrl)을 추가한다 (시연용 목업)

1 participant