Skip to content

chore: 시연용 표지 이미지를 정적 리소스에 추가하고 place에 연결한다 #188

Description

@minyongP

배경

place 썸네일 목업 기반은 #182 / PR #184로 dev에 머지됐다(S15P11A705-305). 이어서 PR #194(S15P11A705-320)로 더미를 WebP로 교체하고 실제 이미지를 둘 경로를 확정했다.

코드 쪽 준비는 끝났다. thumbnail_url 컬럼, 응답 계약(PlaceSummaryResponse.thumbnailUrl), 정적 서빙 경로와 인증 제외가 모두 들어가 있고 WebP 서빙도 검증했다. 남은 것은 이미지를 넣는 것과 URL을 DB에 넣는 것뿐이고, 둘 다 코드 변경이 아니다. 그래서 이 이슈는 Jira 티켓 없이 이 문서를 절차서로 삼아 진행한다.

더미 이미지는 테스트 리소스에만 있어 배포 산출물에는 이미지가 없다. 그래서 지금 배포 환경의 thumbnail_url은 전부 NULL이고, 프론트(front#94)는 폴백 경로만 검증할 수 있다.

1단계 — 이미지를 넣는다

둘 곳

src/main/resources/static/images/places/test/

디렉터리가 아직 없으므로 새로 만든다. main 리소스여야 배포 산출물(jar)에 실린다 — 현재 더미가 있는 src/test/resources/...는 테스트에서만 서빙되고 배포에는 들어가지 않는다.

test/ 하위인 이유는 두 가지다. 목업이라는 것이 경로에서 드러나고, SecurityConfigPUBLIC_STATIC_ASSETS(/images/places/**)가 하위 경로까지 덮어서 시큐리티 설정과 정적 서빙 테스트를 고칠 필요가 없다. 나중에 실제 장소 사진으로 전환하면 images/places/ 바로 아래로 분리한다.

파일명 — 테스트 픽스처와 같은 규약을 쓴다. 장소가 늘면 같은 패턴으로 더한다.

cafe-1.webp  cafe-2.webp  restaurant-1.webp  park-1.webp

규격 — 4:3 비율, 가로 1200px(즉 1200×900), 장당 100KB 이하, WebP.

이 PC에는 cwebp도 ImageMagick도 없다. convert가 PATH에 잡히지만 그것은 Windows의 FAT 변환기(System32\convert.exe)이므로 이미지 변환에 쓰면 안 된다. Pillow로 한다.

python -c "
import glob, os
from PIL import Image
for p in sorted(glob.glob('*.jpg') + glob.glob('*.png')):
    im = Image.open(p).convert('RGB').resize((1200, 900), Image.LANCZOS)
    out = os.path.splitext(p)[0] + '.webp'
    im.save(out, 'WEBP', quality=82, method=6)
    print(out, str(os.path.getsize(out) // 1024) + 'KB')
"

출처는 아직 정하지 않았다. 직접 촬영·보유 사진, 무료 스톡(라이선스 표기 확인 필요), 생성 이미지 중 무엇을 쓸지 정하고 근거를 남긴다. 라이선스 표기가 필요한 출처면 그 표기도 함께 넣는다.

넣은 뒤 커밋 → PR → dev 머지 → 배포까지 간다. 배포되면 이렇게 확인한다.

curl -sI https://pin-log.com/api/core/images/places/test/cafe-1.webp | head -3

200content-type: image/webp가 나와야 다음 단계로 간다.

2단계 — DB에 URL을 넣는다

접속은 CloudBeaver(db.pin-log.com)를 쓴다. 쓰기 권한이 아직 없다 — 아래 「막힘」 참고.

대상 place 고르기. 시연에 실제로 쓰이는 place, 즉 record가 달려 있는 place를 본다.

SELECT p.id, p.name, p.address, count(r.id) AS records
FROM core.place p
JOIN core.record r ON r.place_id = p.id AND r.deleted_at IS NULL
GROUP BY p.id, p.name, p.address
ORDER BY records DESC, p.id;

URL 넣기. 값은 /api/core/images/places/test/<파일명>.webp다. /api/core 접두어는 게이트웨이가 떼고 Spring은 /images/places/...로 받는다 — 저장값에는 접두어를 포함해야 프론트가 <img src>에 그대로 쓸 수 있다.

UPDATE core.place SET thumbnail_url = '/api/core/images/places/test/cafe-1.webp'      WHERE id = <카페 place id>;
UPDATE core.place SET thumbnail_url = '/api/core/images/places/test/cafe-2.webp'      WHERE id = <카페 place id 2>;
UPDATE core.place SET thumbnail_url = '/api/core/images/places/test/restaurant-1.webp' WHERE id = <식당 place id>;
UPDATE core.place SET thumbnail_url = '/api/core/images/places/test/park-1.webp'       WHERE id = <공원 place id>;

PR #184 본문의 SQL 원문을 그대로 쓰면 안 된다. 경로에 test/가 없고 확장자가 .jpg다.

확인.

SELECT id, name, thumbnail_url FROM core.place WHERE thumbnail_url IS NOT NULL ORDER BY id;

그다음 해당 place의 record 상세를 실제로 호출해 place.thumbnailUrl이 실려 오는지 보고, 배포 웹에서 PC·모바일 폭 모두 4:3으로 잘려 표시되는지 확인한다.

마지막으로 front#94에 값이 들어갔음을 알린다 — 그 이슈에 그렇게 약속해 뒀고, 프론트는 그때부터 4:3 표시 조건을 검증할 수 있다.

완료 조건

  • 이미지 출처와 그 선택 근거(라이선스 포함)가 기록된다
  • 이미지가 src/main/resources/static/images/places/test/에 커밋되어 배포 산출물에 실린다
  • 배포 환경에서 /api/core/images/places/test/*.webp가 200과 image/webp로 열린다
  • 시연 대상 place의 record 상세 응답에 thumbnailUrl이 채워져 내려온다
  • 배포 웹의 record 상세 화면에서 썸네일이 PC·모바일 폭 모두 4:3으로 표시된다
  • 값이 들어갔음을 front#94에 공유한다

막힘

  • 표지 이미지 자산 수급 대기 — 출처가 미정이다.
  • 배포 DB 쓰기 경로. infra#189로 요청했으나 담당자가 minyongP(요청자 본인)로 잡혀 있어 인프라 쪽에 전달되지 않았고, 2026-08-04 이후 댓글이 없다. 같은 권한을 요청하는 infra#116이 이미 있고 담당자가 tpals0409다 — core 테이블의 INSERT·UPDATE·DELETE를 요구하므로 위 UPDATE에 필요한 권한과 같다. #189를 #116으로 합치는 것이 실제 경로로 보인다.

Metadata

Metadata

Assignees

Labels

chore빌드·설정·잡무

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions