배경
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/ 하위인 이유는 두 가지다. 목업이라는 것이 경로에서 드러나고, SecurityConfig의 PUBLIC_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
200과 content-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 표시 조건을 검증할 수 있다.
완료 조건
막힘
- 표지 이미지 자산 수급 대기 — 출처가 미정이다.
- 배포 DB 쓰기 경로. infra#189로 요청했으나 담당자가
minyongP(요청자 본인)로 잡혀 있어 인프라 쪽에 전달되지 않았고, 2026-08-04 이후 댓글이 없다. 같은 권한을 요청하는 infra#116이 이미 있고 담당자가 tpals0409다 — core 테이블의 INSERT·UPDATE·DELETE를 요구하므로 위 UPDATE에 필요한 권한과 같다. #189를 #116으로 합치는 것이 실제 경로로 보인다.
배경
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단계 — 이미지를 넣는다
둘 곳
디렉터리가 아직 없으므로 새로 만든다.
main리소스여야 배포 산출물(jar)에 실린다 — 현재 더미가 있는src/test/resources/...는 테스트에서만 서빙되고 배포에는 들어가지 않는다.test/하위인 이유는 두 가지다. 목업이라는 것이 경로에서 드러나고,SecurityConfig의PUBLIC_STATIC_ASSETS(/images/places/**)가 하위 경로까지 덮어서 시큐리티 설정과 정적 서빙 테스트를 고칠 필요가 없다. 나중에 실제 장소 사진으로 전환하면images/places/바로 아래로 분리한다.파일명 — 테스트 픽스처와 같은 규약을 쓴다. 장소가 늘면 같은 패턴으로 더한다.
규격 — 4:3 비율, 가로 1200px(즉 1200×900), 장당 100KB 이하, WebP.
이 PC에는
cwebp도 ImageMagick도 없다.convert가 PATH에 잡히지만 그것은 Windows의 FAT 변환기(System32\convert.exe)이므로 이미지 변환에 쓰면 안 된다. Pillow로 한다.출처는 아직 정하지 않았다. 직접 촬영·보유 사진, 무료 스톡(라이선스 표기 확인 필요), 생성 이미지 중 무엇을 쓸지 정하고 근거를 남긴다. 라이선스 표기가 필요한 출처면 그 표기도 함께 넣는다.
넣은 뒤 커밋 → PR →
dev머지 → 배포까지 간다. 배포되면 이렇게 확인한다.curl -sI https://pin-log.com/api/core/images/places/test/cafe-1.webp | head -3200과content-type: image/webp가 나와야 다음 단계로 간다.2단계 — DB에 URL을 넣는다
접속은 CloudBeaver(
db.pin-log.com)를 쓴다. 쓰기 권한이 아직 없다 — 아래 「막힘」 참고.대상 place 고르기. 시연에 실제로 쓰이는 place, 즉 record가 달려 있는 place를 본다.
URL 넣기. 값은
/api/core/images/places/test/<파일명>.webp다./api/core접두어는 게이트웨이가 떼고 Spring은/images/places/...로 받는다 — 저장값에는 접두어를 포함해야 프론트가<img src>에 그대로 쓸 수 있다.확인.
그다음 해당 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로 열린다thumbnailUrl이 채워져 내려온다막힘
minyongP(요청자 본인)로 잡혀 있어 인프라 쪽에 전달되지 않았고, 2026-08-04 이후 댓글이 없다. 같은 권한을 요청하는 infra#116이 이미 있고 담당자가tpals0409다 —core테이블의INSERT·UPDATE·DELETE를 요구하므로 위 UPDATE에 필요한 권한과 같다. #189를 #116으로 합치는 것이 실제 경로로 보인다.