| 항목 | byte[] | 정적 리소스(WebConfig) | Resource(UrlResource) |
|---|---|---|---|
| URL 예시 | /image/bytes/pikachu |
/image/pikachu.png |
/image/resource/pikachu.png |
| 확장자 입력 | X (내부에서 .png 붙임) |
O (파일명 그대로) | O (파일명 그대로) |
| Content-Type | image/png |
파일 확장자에 따라 자동/설정 | image/png |
| 캐시 | 기본(응답 헤더 없음) | 강한 캐시 최적화에 최적 | 요청 헤더로 재검증 가능(응답 헤더 미설정 시 기본) |
| 성능 | 매번 디스크 전체 읽기 → 비용 큼 | 최고 (정적 서빙/캐시/ETag) | 중간(리소스 추상화 + 유연성) |
| 유연성 | 낮음(확장자 고정) | 낮음(파일 고정/배포기반) | 높음(런타임 파일 지정, 헤더 제어 용이) |
| 주 용도 | 소량 이미지 ⇒ 작은 파일 | CDN/정적 자산 ⇒ 변하지 않을 때 | 사용자 업로드 등 반동적 파일 ⇒ 큰 파일 |


엔드포인트: GET /response/image/bytes/{filename}

/response/image/bytes/pikachu 처럼 확장자 없이 요청 → 내부에서 .png를 붙여 읽음image/png 고정(프로듀스 선언)Files.readAllBytes가 예외 → 컨트롤러에서 처리 안 하므로 기본 500 응답 가능NoSuchFileException 등을 잡아 ResponseEntity.notFound()로 내리는 식으로 처리하는 편이 일반적filename 경로조작(../) 위험성은 Path 조인으로 어느 정도 줄지만, 실서비스라면 화이트리스트/확장자 제한이 일반적.엔드포인트: GET /response/image/pikachu.png


