-
์ ์ ์์ ์ ์ src์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์๊น?TECH 2023. 12. 16. 00:39
์ด๋ฒ ํฌ์คํ ์์๋ React + Vite ํ๊ฒฝ์์ ์ ์ ์์ ์ public๊ณผ src ๋๋ ํ ๋ฆฌ์์ ๊ด๋ฆฌํ ๊ฒฝํ์ ์ดํด๋ณด๊ณ ์ค์ค๋ก ๋์ถํ ๊ฒฐ๋ก ์ ์ค๋ช ํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
6์ฃผ ๋์ ์งํ๋ morak ํ๋ก์ ํธ์์๋ ์ ์ ์์ ์ ๊ด๋ฆฌํ๋ assets ๋๋ ํ ๋ฆฌ๋ฅผ src → public → ๊ทธ๋ฆฌ๊ณ ๋ค์ src ๋๋ ํ ๋ฆฌ๋ก ์ฎ๊ฒจ ๊ด๋ฆฌํ๊ฒ ๋์๋๋ฐ์.
์ด ์์ฌ ๊ฒฐ์ ๊ณผ์ ์ ๋ํด ์์ ํด ๋ณด๊ณ , ๊ฒฐ๋ก ์ ์ผ๋ก ์ src์์ ๊ด๋ฆฌํ๊ฒ ๋์๋์ง, public๊ณผ src ๋๋ ํ ๋ฆฌ์์ ๊ด๋ฆฌํ์ ๋ ๊ฐ ์ด๋ค ์ฅ๋จ์ ์ ์ป์ ์ ์๋์ง๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
. โโโ public โ โโโ assets # ์ด๋์ ๋๋ ๊ฒ์ด โโโ src โโโ assets # ๋ง์๊น?
assets์ src → public์ผ๋ก ์ฎ๊ธฐ๊ฒ ๋ ๋ฐฐ๊ฒฝ
assets์ src ๋๋ ํ ๋ฆฌ์์ public ๋๋ ํ ๋ฆฌ๋ก ์ฎ๊ธฐ๊ฒ ๋ ์ด์ ๋ ๋จ์ํฉ๋๋ค. ๋น๋ ์ ์์ ์ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฐ๋ฅด์ง ์๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ด๋ฏธ์ง ํ๊ทธ๋ ๋ก์ปฌ ์๋ฒ ํ๊ฒฝ์์๋ ์ด๋ฏธ์ง๋ฅผ ์ ๋๋ก ๋ถ๋ฌ์์ง๋ง, ๋น๋ ํ๊ฒฝ์์๋ src ํด๋๊ฐ ์๊ธฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง๋ฅผ ์ฐพ์ ์ ์์ด ์๋ฐ์ด ๋จ๋ ์ด์๊ฐ ์์์ต๋๋ค.
public ๋๋ ํ ๋ฆฌ์์ assets์ ๊ด๋ฆฌํ๋ค๋ฉด ๋น๋ ์ public ํ์์ ๋๋ ํ ๋ฆฌ๋ค์ dist ๋๋ ํ ๋ฆฌ์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
<img src='/src/assets/image.png' />
์ฌ์ค ์ด ๋ฌธ์ ๋ public์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด ์๋๋ผ ๋ ์ฌ์ด ํด๊ฒฐ์ฑ ์ด ์์์ง๋ง... ํ๋จ์์ ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.public์ผ๋ก assets์ ์ฎ๊ฒผ์ ๋ ์๊ธด ๋ฌธ์
ํ๋ก์ ํธ์์๋ svg ํ์ผ์ ReactComponent๋ก import ํด์ ์ฌ์ฉํ๊ณ ์์๊ณ , ๋ก์ปฌ ์๋ฒ ๋น๋ ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ์ฝ์์ ์ถ๋ ฅ๋ฉ๋๋ค.
import { ReactComponent as Icon } from '../../public/arrow.svg'; function Main() { return ( <div> <Icon /> </div> ) }
public ๋๋ ํ ๋ฆฌ์ ์๋ ์ ์ ์์ ์ JavaScript ์ฝ๋๋ฅผ ํตํด import ํ ์ ์๋ค๋ ๋ด์ฉ์ ๊ฒฝ๊ณ ์์ต๋๋ค.
JavaScript ํ์ผ์์ import ํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด src ๋๋ ํ ๋ฆฌ์์ ์ฌ์ฉํ๋ผ๊ณ ํ๋ค์.
๊ทธ๋ฌ๋ ์ ํฌ๋ ์๊ฐ์ ์ฌ์ ๊ฐ ์์๋ค๋ ํ๊ณ๋ก ์ด ์๋ฌ ๋ฐ์์ ์์ธ์ ์ ๋๋ก ์์๋ณด์ง ์๊ณ ๋์ด๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ผ์ฃผ์ผ ๋ค ๋ฉํ ๋ง ์๊ฐ, ๋ฉํ ๋๊ป์ ์ด ์๋ฌ์ ๋ํ ์ง๋ฌธ์ ํด ์ฃผ์ จ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ผญ ์์๋ณด๋ผ๋ ๋ง์ ๋ง๋ถ์ด์ จ์ฃ .
์ฐ์ Assets in public directory cannot be imported from JavaScript ์๋ฌ ๋ฉ์์ง์ ๋ํ ์ด์ ๋ฅผ ์์๋ด ์๋ค.
Vite์์์ asset ๊ด๋ฆฌ
Vite ๊ณต์ ๋ฌธ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ๋์ด ์์ต๋๋ค.
๋ค์ ์์ ์ ๊ฒฝ์ฐ
- robots.txt์ ๊ฐ์ด ์์ค ์ฝ๋์์ ์ฐธ์กฐ๋์ง ์๋ ์์
- ํด์ฑ ์์ด ํญ์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ๋ ์์
- ๋๋ URL์ ์ป๊ธฐ ์ํด ๊ตณ์ด import ํ ํ์ ์๋ ์์
public ๋๋ ํฐ๋ฆฌ ์๋์ ์์ ์ ์์น์ํค์ธ์.
์ด๊ณณ์ ์์นํ ์์ ์ ๊ฐ๋ฐ ์์ / ๊ฒฝ๋ก์, ๋ฐฐํฌ ์์๋ dist ๋๋ ํฐ๋ฆฌ์ ์์นํ๊ฒ ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๋ค์์ ์ฌํญ์ ์ ์ํด์ฃผ์ธ์.
- public ๋๋ ํฐ๋ฆฌ์ ์์นํด ์๋ ์์ ์ ๊ฐ์ ธ์ค๊ณ ์ ํ๋ ๊ฒฝ์ฐ, ํญ์ ๋ฃจํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์ ๋ ๊ฒฝ๋ก๋ก ๊ฐ์ ธ์์ผ๋ง ํฉ๋๋ค. ( public/icon.png ์์ ์ ์์ค ์ฝ๋์์ /icon.png์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.)
- public ๋๋ ํฐ๋ฆฌ์ ์์นํ ์์ ์ JavaScript ์ฝ๋๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Vite ๊ณต์ ๋ฌธ์ ๋ด์ฉ ์ค ์ ์ ์์ ํธ๋ค๋งํ๊ธฐ ์น์ ์ ๋ฐ๋ฅด๋ฉด src ๋๋ ํ ๋ฆฌ ๋ด์ ์๋ ์ ์ ์์ ์ import ๋ฌธ์ผ๋ก ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import Image from './main.png' function Main() { return <img src={Image} />; }
์ ์ ์์ ์ import ๋ฌธ์ผ๋ก ์ฌ์ฉํ๋ฉด, Vite๊ฐ ๋ด๋ถ์ ์ผ๋ก Webpack์ file-loader์ ๋น์ทํ ์ฒ๋ฆฌ๋ฅผ ํด ์ค๋๋ค.
๋ฐ๋ผ์ ๊ฐ๋ฐ ์์๋ Image ๊ฐ์ฒด๊ฐ /main.png ๊ฐ์ผ๋ก ํ ๋น๋๊ณ , ๋น๋ ์์๋ ์ถ๊ฐ ์ค์ ์์ด /main.[hash].png๊ณผ ๊ฐ์ ๊ฐ์ด ํ ๋น๋ฉ๋๋ค.
์ด ๋ฐฉ์์ผ๋ก ์ ํฌ๋ public ๋๋ ํฐ๋ฆฌ์์ ์์ ์ ๊ด๋ฆฌํ ๊ฒฝ์ฐ ์ฝ์์ ์๋ฌ๊ฐ ๋จ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , src ๋๋ ํฐ๋ฆฌ์์ ์์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋น๋ ์ ์ด๋ฏธ์ง์ ์๋ฐ์ด ๋จ๋ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ๋ ์ฌ๊ธฐ์ public ๋๋ ํฐ๋ฆฌ์ ์์นํ ์์ ์ JavaScript ์ฝ๋๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค์ ๋ํ ์ด์ ๊ฐ ๊ถ๊ธํ์ต๋๋ค.
์ด์ ๋ฅผ ์ฐพ์๋ณด๋ ์ค, Why React can not access images from public - DEV Community ๊ธ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด ๊ธ์์๋ ์ด๋ ๊ฒ ๋งํฉ๋๋ค.
public ๋๋ ํฐ๋ฆฌ๋ ํ๋ก๋์ ์ ๋น๋ํ ๋ ์ต์ข ๋ฒ๋ค์ ์ผ๋ถ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ฒ๋ค๋ฌ๊ฐ ์ฒ๋ฆฌํ์ง ์๋ html ํ์ผ์ ์กฐ์ ํ ์ ์๋ค๊ณ ํด๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. src ๋๋ ํฐ๋ฆฌ ๋ด์์ ๊ด๋ฆฌ๋๋ ์ด๋ฏธ์ง๋ ์ต์ข ๋ฒ๋ค์ ๊ฒฐ๊ณผ๋ฌผ ์ค ํ๋๊ฐ ๋๊ณ , src ๋๋ ํ ๋ฆฌ ๋ด์ ์๋ ์ด๋ฏธ์ง๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋๋ก์ import ๋ ์ ์์ต๋๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ฐจ์ด๋ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
public ๋๋ ํฐ๋ฆฌ์ ์์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ
/public/assets/main.png๋ฅผ ์ด๋ฏธ์ง๋ก ์ฝ์ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด url ํํ๋ก ์ฝ์ ํฉ๋๋ค.
<img src='/assets/main.png' />
๊ฐ๋ฐ์ ๋๊ตฌ์ source ํญ์์ ์ดํด๋ณธ ํ์ผ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
. โโโ assets โ โโโ index-[hash].js โ โโโ index-[hash].css โโโ main.png
assets์ ํ์์๋ ํ๋๋ก ๋ฒ๋ค๋ง ๋ js ํ์ผ๊ณผ css ํ์ผ์ด ์๊ณ , assets์ ๊ฐ์ ๊ฒฝ๋ก์ main.png ์ด๋ฏธ์ง๊ฐ ์๋ ๊ตฌ์กฐ์ ๋๋ค.
src ๋๋ ํฐ๋ฆฌ์ ์์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ
๊ฐ๋ฐ์ ๋๊ตฌ์ source ํญ์์ ์ดํด๋ณธ ํ์ผ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
. โโโ assets โโโ index-[hash].js โโโ index-[hash].css โโโ main.png
ํ๋๋ก ๋ฒ๋ค๋ง ๋ js ํ์ผ๊ณผ css ํ์ผ, ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง ํ์ผ์ด ๋ชจ๋ assets ๋๋ ํ ๋ฆฌ์ ๋ค์ด ์๋ ๊ตฌ์กฐ์ ๋๋ค.
์ด์ ์ผ src ๋๋ ํ ๋ฆฌ ๋ด์ ์๋ ์ด๋ฏธ์ง๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋๋ก์ import ๋๋ค๋ผ๋ ๋ป์ ์ดํดํ์ต๋๋ค.
์ ์ ์์ ๊ด๋ฆฌ ์์น์ ๋ฐ๋ฅธ ์ฅ๋จ์
๊ทธ๋ ๋ค๋ฉด ์ ์ด๋ฏธ์ง๊ฐ ๋ฒ๋ค์ ๊ฒฐ๊ณผ๋ฌผ ์ค ํ๋๋ก ์ฌ์ฉ๋์ง ์๋ ๋ฐฉ์์ ํผํด์ผ ํ๋ ๊ฑธ๊น์?
์ ๊ฐ ์๊ฐํ ์ ์ ์์ ์ public๊ณผ src ๋๋ ํฐ๋ฆฌ ๊ฐ๊ฐ์์ ๊ด๋ฆฌํ์ ๋์ ์ฅ๋จ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ ํ์ ์์ ์ฑ์ ๋๋ค. src ๋๋ ํฐ๋ฆฌ ์์์ ๊ด๋ฆฌ๋๋ ์์ ์ด ์ญ์ ๋๋ฉด ๋น๋๊ฐ ์คํจํ๊ธฐ ๋๋ฌธ์ ์์ ์ด ์ญ์ ๋์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ฐ๋๋ก public ๋๋ ํฐ๋ฆฌ๋ ๋น๋๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์์ ์ฑ์ด ๋ณด์ฅ๋์ง ์๋๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ ๋ฒ์งธ๋ ์์์ ์ธ๊ธํ ์ํฐํด๊ณผ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅด๋ฉด public ๋๋ ํฐ๋ฆฌ์ ์์ ์ Webpack์ด๋ Vite ๊ฐ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ํตํด์ ์ฒ๋ฆฌ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋น๋ ์ต์ ํ์ ํํ์ ๋ฐ์ง ๋ชปํ๋ค๋ ์ ์ด ์์ต๋๋ค.
์ธ ๋ฒ์งธ๋ public ๋๋ ํฐ๋ฆฌ์์ ๊ด๋ฆฌํ๋ ์์ ์ ํ์ผ๋ช ์ ๊ทธ๋๋ก์ธ ์ฑ ๋ด์ฉ๋ง ๋ณ๊ฒฝ๋๋ค๋ฉด, ์์ ์ด ์บ์ฑ ๋์ด ์ ๋ฐ์ดํธ๋์ง ์์ ์ํ์ฑ๋ ์กด์ฌํ๋ค๋ ์ ์ ๋๋ค.
๋ฐ๋ผ์ Vite๊ฐ public ํด๋์์์ ์์ ์ฌ์ฉ์ ๊ฒฝ๊ณ ํ๋ ์ด์ ๋, ๋ชจ๋ ์์คํ ์ ํตํ ์์กด์ฑ ๊ด๋ฆฌ์ ๋น๋ ๊ณผ์ ์ ์ต์ ํ๋ฅผ ๊ถ์ฅํ๊ธฐ ๋๋ฌธ์ผ ๊ฒ์ด๋ผ๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์์ต๋๋ค.
๋ง์น๋ฉฐ
์ด์ ํ๋ก์ ํธ์์๋ src ๋๋ ํฐ๋ฆฌ์ ์์ ์ import ํ๋ ํํ์ ์ฝ๋๋ฅผ ๋น์ฐํ๊ฒ ์์ฑํ๊ณ ์์์ต๋๋ค.
ํ์ง๋ง ์ด๋ฒ ํ๋ก์ ํธ์์๋ ๊ธฐ์กด ์ฝ๋ ์คํ์ผ์ด ์๋ ์ด๋ฆฐ ์ฌ๊ณ ๋ก ๋ค๋ฅธ ์คํ์ผ์ ์ฝ๋๋ ๊ฒฝํํด ๋ณด์๋ ๋ง์๊ฐ์ง์ ๊ฐ์ก๋๋ฐ์.
๋จ์ํ ๋ฌธ์์ด๋ก ์์ฑ๋์๋ ๊ฒฝ๋ก๋ฅผ import ํํ๋ก ๋ฐ๊พธ์๋ค๋ฉด ๋ฌธ์ ๋ฅผ ๋นจ๋ฆฌ ํด๊ฒฐํ๊ณ ๋ค์ ์คํ ์ผ๋ก ๋์ด๊ฐ ์๋ ์์์ ๊ฒ๋๋ค.
๋น ๋ฅธ ํด๊ฒฐ์ฑ ์ ์ป์ง ๋ชปํ ๋์ ์ด๋ฐ์ ๋ฐ ์๋์ ์ฝ์ง์ ํตํด ๋น์ฐํ๊ฒ ์๊ฐํ๊ณ ์์๋ ์ ์ ์์ ์ ๊ด๋ฆฌ ์์น์ ๋ํด ๋ค์ ๊ณ ๋ฏผํด ๋ณด๊ณ Vite์์ ๋ฐ์ํ๋ ์๋ฌ์ ๊ทผ๋ณธ์ ์ธ ์์ธ๊น์ง ๋ ๊น๊ฒ ํ๊ณ ๋ค์ด ๋ณผ ์ ์์๋ ์๊ฐ์ด์์ต๋๋ค.
'TECH' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Zero Runtime CSS-in-JS์ ๋ํด ์์๋ณด์ (1) 2024.01.06 React์์ TMap API ์ฌ์ฉํ๊ธฐ (1) 2023.12.30 CSS์ ์ฐ์ ์์, CSS Cascading (0) 2023.09.04 ๋ชจ๋ ธ๋ ํฌ ๋์ ํ๊ธฐ(Feat. Nx) (4) 2023.08.27 ๋ฆฌ์กํธ ์ฟผ๋ฆฌ์ StaleTime๊ณผ CacheTime (0) 2023.01.24