next.js 에서 static asset 사용하기 (public vs src)
next.js 에서 static asset을 사용하는 방식에는 크게 두가지 방법이 있습니다.
Static Asset 접근 방식
public 폴더에 저장
public폴더에 있는 파일은 정적 파일로 간주되며, Next.js 서버를 통해 직접 URL로 접근할 수 있습니다.브라우저에서 접근하는 방식:
http://localhost:3000/파일경로예:
public/images/logo.png→http://localhost:3000/images/logo.png
src 폴더에 저장
src폴더는 코드 및 컴포넌트를 저장하는 공간으로, 파일이 직접 브라우저에서 접근 가능하지 않습니다.해당 자산을 사용하려면 JavaScript/TypeScript 코드에서 해당 파일을 import해야 합니다.
import logo from '../images/logo.png';
2. 파일 관리와 빌드 프로세스
public 폴더
파일은 빌드 프로세스에서 그대로 유지됩니다.
Next.js는
public폴더에 있는 파일을 변환하거나 번들링하지 않습니다.브라우저가 요청할 때 Next.js 서버에서 정적으로 제공됩니다.
이 방식은 폰트, 동영상, PDF 등 이미 번들링이 필요 없는 자산에 적합합니다.
src 폴더
파일은 Next.js의 Webpack 빌드 프로세스에 포함됩니다.
번들링 과정에서 최적화가 이루어지며, 코드 분할(Chunking)이나 Tree Shaking 같은 최적화가 적용됩니다.
각 파일은 import된 경우에만 포함되므로, 사용하지 않는 파일은 번들에 포함되지 않습니다.
이 방식은 동적으로 사용되거나, 코드와 강하게 연관된 이미지나 자산에 적합합니다.
3. 파일 크기 및 URL 변경
public 폴더
파일 이름과 경로가 그대로 유지됩니다.
빌드 후에도 파일 이름이 변경되지 않으므로 브라우저가 캐싱할 가능성이 높습니다.
public/images/logo.png → /images/logo.png
src 폴더
Webpack은 파일을 처리하면서 고유한 해시를 포함한 이름으로 변경합니다.
src/images/logo.png → /_next/static/media/logo.abc123.png파일 이름이 고유한 해시로 변경되므로 캐싱 관련 문제가 줄어듭니다.
4. 사용 사례 비교
public 폴더를 사용하는 경우
정적 파일을 그대로 제공해야 할 때:
브라우저에서 직접 URL로 접근 가능해야 하는 경우 (예: 로고, 폰트, PDF 파일, 동영상 등).
예:
<img src="/images/logo.png" alt="Logo" />
파일이 빌드 프로세스에 포함되지 않아야 하는 경우:
매우 큰 파일(예: 대용량 동영상)을 저장하고 싶을 때.
외부 CDN에서 파일을 관리하는 경우와 유사한 방식으로 동작.
src 폴더를 사용하는 경우
코드와 밀접하게 연결된 자산:
컴포넌트에서 동적으로 로드되거나 특정 로직에 따라 조건부로 사용되는 이미지.
예:
import logo from '../images/logo.png'; export default function Header() { return <img src={logo} alt="Logo" />; }
파일이 Webpack 최적화의 이점을 받아야 하는 경우:
Tree Shaking 및 코드 스플리팅이 필요할 때.
파일 이름에 고유한 해시가 필요할 때(캐싱 무효화를 위해).
5. SEO 및 성능 차이
public폴더의 파일은 브라우저가 직접 접근할 수 있으므로 SEO 및 성능 최적화를 위해 중요합니다. 특히, 정적 이미지나 favicon, robots.txt, sitemap 등을 제공할 때 유리합니다.src폴더의 자산은 코드 내부에서만 사용 가능하므로 브라우저가 이를 직접 처리할 수 없으며, CDN에 적합하지 않습니다.
6. 요약
특징 |
|
|
접근 방법 | 브라우저에서 직접 URL로 접근 가능 | JavaScript/TypeScript 코드에서 import 필요 |
빌드 프로세스 | 번들링/최적화 없음 | Webpack에 포함되어 최적화 및 해시 추가 |
사용하지 않는 파일 | 그대로 포함 | import되지 않은 파일은 번들에 포함되지 않음 |
사용 사례 | 로고, favicon, PDF, 폰트, 비디오 등 | 컴포넌트와 관련된 동적 자산 |
캐싱 무효화 | 파일 이름 변경 불가 (수동 관리 필요) | 파일 이름에 해시 포함 (자동 무효화) |
결론
public: 정적 파일처럼 그대로 제공해야 하는 자산에 사용.src: 코드와 연관된 자산(이미지, JSON, 모듈 등)을 관리하고 Webpack의 최적화 기능을 활용하고 싶을 때 사용.