작성일: 2026-02-14
| 항목 | 수치 |
|---|---|
| 총 이미지 파일 | 164개 |
| WebP 파일 | 162개 |
| GIF 파일 | 1개 |
| 확장자 없는 PNG | 1개 (tistory/19/스크린샷...) |
| 총 용량 | 13MB |
| tistory/ 디렉토리 | 12MB (40개 하위 디렉토리) |
| legacy/ 디렉토리 | 892KB |
| 항목 | 수치 |
|---|---|
| 총 MDX 파일 | 75개 |
| 이미지 참조가 있는 MDX | 54개 (72%) |
| 이미지 참조가 없는 MDX | 21개 |
패턴 A: /images/ 절대 경로 (주요 패턴)
- 대부분의 MDX 파일이 이 패턴 사용
public/images/디렉토리에서 서빙
패턴 B: ./img/ 상대 경로 (5개 파일 —
- 해당 파일들:
tistory-17-dispatcher-servlet-디스패처-서블릿.mdxtistory-18-필터filter-vs-인터셉터interceptor.mdxtistory-19-jpa-비관적-락과-낙관적-락-및-재시도.mdxtistory-20-항해-플러스-백엔드-코스-6기-5주차-및-챕터-회고-wil.mdxtistory-23-항해-플러스-백엔드-코스-6기-6주차-회고-wil.mdx
./img/디렉토리가 존재하지 않음 → 이미지가 렌더링되지 않는 상태
패턴 C: Astro 컴포넌트
<Image />,<Picture />,astro:assets사용: 없음 (0건)
content.config.ts에cover: z.string().optional()정의됨- 실제 사용하는 MDX 파일: 0개
- 현재 미활용 상태
scripts/optimize-images.ts존재 (수동 최적화 스크립트)sharp패키지 설치됨- Astro 설정(
astro.config.mjs)에 별도 image 설정 없음
- 빌드 타임 최적화: sharp를 통한 자동 리사이즈/포맷 변환
- 반응형 이미지:
srcset자동 생성으로 디바이스별 최적 크기 제공 - 차세대 포맷: AVIF/WebP 자동 변환 (이미 WebP이므로 AVIF 추가 가능)
- Lazy loading: 자동
loading="lazy"적용 - Layout shift 방지:
width/height자동 추출로 CLS 개선 decoding="async": 자동 적용
- 타입 안전: import 시 존재하지 않는 이미지 → 빌드 에러 (깨진 참조 방지)
- 자동 크기 추론: import한 이미지에서 width/height 자동 획득
| 작업 | 수량 |
|---|---|
public/images/ → src/assets/images/ 이동 |
164개 파일 |
| 디렉토리 구조 유지 | tistory/, legacy/ 등 |
변경이 필요한 MDX 파일: 54개
변경 패턴:
// Before (마크다운 문법)

// After (Astro Image 컴포넌트)
import img1 from '@/assets/images/tistory/22/image1.webp';
<Image src={img1} alt="alt text" />| 작업 | 예상 소요 |
|---|---|
| 이미지 파일 이동 | 스크립트로 즉시 (< 1분) |
| MDX import 추가 + 문법 변환 | 스크립트로 자동화 가능 (1~2시간 개발) |
| 수동 검증 (빌드 & 확인) | 2~3시간 |
깨진 ./img/ 참조 수정 |
30분 |
| 총 예상 | 반나절 (4~6시간) |
- 깨진
./img/상대 경로 5개 파일 수정 (올바른/images/경로로 변경하거나 이미지 배치) - 확장자 없는 PNG 파일에
.png확장자 추가 - 현재 상태 빌드 & 동작 확인
astro.config.mjs에 image 설정 추가:image: { service: { entrypoint: 'astro/assets/services/sharp' } }
src/assets/images/디렉토리 생성- tsconfig에
@/path alias 확인
public/images/→src/assets/images/로 이동mv public/images/* src/assets/images/- Git에서 이동 추적 확인
- MDX 파일 파싱 스크립트 작성:
→ import문 +<Image>변환- 중복 파일명 처리 (alias)
- frontmatter 직후 import 블록 삽입
- 54개 MDX 파일에 일괄 적용
- diff 검토
astro build성공 확인- 이미지 렌더링 확인 (주요 페이지 스팟 체크)
- OG 이미지 경로 영향 확인
- RSS/사이트맵 이미지 경로 확인
- frontmatter
cover를image()헬퍼로 변경 (schema 수정) - 레이아웃에서
<Image>컴포넌트로 cover 렌더링
| 리스크 | 영향 | 완화 방안 |
|---|---|---|
| 빌드 시간 증가 | 164개 이미지 sharp 처리 → 빌드 시간 2~5배 증가 가능 | astro.config에서 image.domains, format 제한; 캐시 활용 |
| MDX에서 import 필수 | 마크다운 ![]()을 사용할 수 없음 → 글 작성 불편 |
remarkPluginImageImport 커스텀 플러그인 or 하이브리드 접근 |
| 리스크 | 영향 | 완화 방안 |
|---|---|---|
| 경로 변경 | 외부 링크/SEO에서 기존 /images/ 경로 깨짐 |
public/images/에 리다이렉트 유지 or 점진적 전환 |
| GIF 처리 | sharp가 animated GIF을 제대로 처리 못할 수 있음 | GIF은 public/에 유지 |
| 변환 스크립트 버그 | 정규식 파싱 한계 → 일부 누락/오변환 | 수동 diff 검토 필수 |
| 리스크 | 영향 | 완화 방안 |
|---|---|---|
| 이미 WebP 최적화됨 | Astro 재최적화 시 품질 저하/용량 증가 가능 | quality 설정 조정, passthrough 고려 |
| Git diff 크기 | 파일 이동 + MDX 변경 → 큰 커밋 | Phase별 분리 커밋 |
현재 이미 WebP로 최적화되어 있고, optimize-images.ts 스크립트도 있으므로, 전면 전환 대비 비용 대비 이익이 크지 않을 수 있음.
- 기존 이미지는
public/에 유지 (변경 없음) - 새 글부터
src/assets/에 이미지 저장 +<Image />사용 - cover 이미지만
image()헬퍼로 전환 (레이아웃 개선) - 점진적으로 오래된 글 마이그레이션
장점: 리스크 최소, 즉시 적용 가능, 작업량 최소 단점: 두 패턴 공존 → 일관성 부족
| 접근 | 작업량 | 리스크 | 이익 |
|---|---|---|---|
| 전면 전환 | 4~6시간 | 중간 | 높음 (일관성, 타입 안전, CLS 개선) |
| 하이브리드 | 30분 | 낮음 | 중간 (새 글만 혜택) |
| 현상 유지 | 0 | 없음 | 없음 |
권장: 하이브리드 접근으로 시작 → 시간 여유 시 전면 전환.
우선 깨진 ./img/ 참조 5개 파일 수정은 즉시 진행 필요.