1. 상황 소개
최근 프로젝트를 분석하면서, 프론트엔드에서 이미지를 다루는 방식에 대해 흥미로운 점을 발견했습니다. DB 테이블에 IMG_URL 컬럼이 있었고, 업로드된 파일과 연결되어 있습니다. 서버에서는 파일 ID를 기반으로 이미지를 가져오는 API(localhost:8080/api/image/{fileId})를 제공하고 있고, 그 API의 URL을 파일 업로드 시에 IMG_URL에 저장하여.이미지를 불러올 때는 해당 URL만 불러오면 되도록 구성되어 있었습니다.
흥미로운 점: 브라우저에서 해당 API를 직접 열면 이상한 문자가 나열되지만,
<img> 태그에서 사용하면 정상 이미지로 표시됩니다.
해당 API는 ResponseEntity<byte[]>만 반환하며, Content-Type 헤더는 없습니다.
2. img 태그의 기능과 비밀
HTML의 <img> 태그는 브라우저에게 이미지를 가져와 화면에 렌더링하라고 지시하는 요소입니다.
- 이미지 URL 요청:
<img src="URL">로 브라우저가 GET 요청 - 데이터 이미지 해석: Content-Type 없이도 브라우저는 데이터의 바이너리 구조를 분석하여 PNG, JPEG 등으로 판단
- 화면에 렌더링: 바이트 데이터를 이미지로 표시
즉, <img> 태그는 단순 URL 요청 이상의 스마트 뷰어 역할을 수행합니다.
3. 서버 API를 주소창에서 열면 이상한 문자가 보이는 이유
주소창에서 API를 열면 브라우저는 데이터를 텍스트로 처리하려고 합니다.
- 텍스트 뷰어 →
byte[]를 문자열로 변환 → 의미 없는 문자 출력 <img>→ 바이트 배열을 이미지로 해석 → 정상 렌더링
즉, 같은 데이터라도 해석 방식에 따라 결과가 달라집니다.
4. Vue에서 활용 예시
<template>
<div>
<img :src="imageUrl" alt="업로드 이미지" />
</div>
</template>
<script>
export default {
data() {
return {
imageUrl: "http://localhost:8080/api90/image/1234"
};
}
}
</script>
Vue에서는
:src 바인딩으로 동적 URL 처리 가능. 서버가 byte[]만 반환해도 이미지로 렌더링됨.5. 결론
<img>는 데이터를 이미지로 해석- 서버가
byte[]만 반환해도 정상 렌더링 - 주소창과
<img>태그에서 결과 차이 → 브라우저 해석 방식 차이
개발자는 서버가 반환하는 데이터 구조를 이해하고, <img>가 데이터를 어떻게 처리하는지 아는 것이 중요합니다. 서버가 보내는 데이터와 브라우저가 이를 처리하는 방식을 이해하면서, 단순 바이트 배열만으로도 이미지가 표시된다는 것을 깨달을 수 있었습니다.