์น์ฌ์ดํธ์ React ์ถ๊ฐ
These docs are old and wonโt be updated. Go to react.dev for the new React docs.
See Add React to an Existing Project for the recommended ways to add React.
React๋ ํ์ํ ๋งํผ๋ง ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์ ๊ฒ๋ ๋ง๊ฒ๋ ๋ง์ด์ฃ .
React๋ ์ฒ์๋ถํฐ ์ ์ง์ ์ผ๋ก ๋์ ํ ์ ์๊ฒ ์ค๊ณ๋์์ต๋๋ค. ๊ทธ๋์ React๋ ํ์ํ ๋งํผ๋ง ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์๋ง ๊ธฐ์กด ํ์ด์ง์ โ์ํธ์์ฉโ์ด๋ผ๋ ์กฐ๋ฏธ๋ฃ๋ฅผ ์ฒจ๊ฐํ๊ธฐ๋ง ํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ์ด๋ด ๋ React ์ปดํฌ๋ํธ๋ฅผ ์ฐ๋ฉด ์ข์ต๋๋ค.
์ค๋๋ ์น์ฌ์ดํธ์ ๋๋ถ๋ถ์ ์ฑ๊ธ ํ์ด์ง๊ฐ ์๋๊ณ ๊ทธ๋์ผ ํ ํ์๋ ์์ต๋๋ค. ๋น๋ ๋๊ตฌ ์์ด ๋ช ์ค์ ์ฝ๋๋ง์ผ๋ก ์น์ฌ์ดํธ์ ์์ ๋ถ๋ถ์ ๋จผ์ React๋ฅผ ๋์ ํด๋ณด์ธ์. React์ ๋น์ค์ ์ฒ์ฒํ ๋๋ฆด ์๋ ์๊ณ ์๋๋ฉด ๋์ ์ธ ์์ ฏ์ ๋ช ๊ฐ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ๋๋ผ ์๋ ์์ต๋๋ค.
- React 1๋ถ ๋ด๋ก ์ถ๊ฐํ๊ธฐ
- ์ ํ์ฌํญ: JSX๋ก React ํด๋ณด๊ธฐ (๋ฒ๋ค๋ฌ๊ฐ ํ์์์ต๋๋ค!)
1๋ถ ๋ด๋ก React ์ถ๊ฐํ๊ธฐ
์ด ๊ธ์์๋ ๊ธฐ์กด ํ์ด์ง์ React๋ฅผ ์ถ๊ฐํ๋ ๋ฒ์ ๋ํด์ ๋ค๋ฃน๋๋ค. ๊ธฐ์กด์ ์น์ฌ์ดํธ์์ ์๋ ํด๋ณด์ ๋ ์ข๊ณ , ์ฐ์ต์ผ์ ์๋ก์ด HTML ํ์ผ์์ ์๋ํด๋ณด์ ๋ ์ข์ต๋๋ค.
๋ณต์กํ ๋๊ตฌ๋ฅผ ์ฐ๊ฑฐ๋ ๋ญ๊ฐ๋ฅผ ๋ฐ๋ก ์ค์นํด์ผ ํ ํ์๋ ์์ต๋๋ค. ์ฝ๊ฐ์ ์๊ฐ๊ณผ ํจ๊ป ์ธํฐ๋ท๋ง ์ฐ๊ฒฐ ๋์ด ์๋ค๋ฉด ์ด ๋ฌธ์์์ ๋ค๋ฃจ๋ ๊ฒ์ ๋ชจ๋ ํด๋ณผ ์ ์์ต๋๋ค.
์ ํ์ฌํญ: ์์์ ์ ์ฒด ์์ค์ฝ๋ ๋ค์ด๋ก๋ (2KB๋ก ์์ถ๋จ)
1๋จ๊ณ: HTML ํ์ผ์ DOM ์ปจํ ์ด๋ ์ค์น
๋จผ์ , ํธ์งํ HTML ํ์ผ์ ์ฝ๋๋ค. ๊ทธ ๋ค์ ๋น์ด์๋ <div>
ํ๊ทธ๋ฅผ ์ถ๊ฐํด์ค๋๋ค. ์ด ํ๊ทธ๊ฐ ๋ฐ๋ก React๋ฅผ ํตํด ์ํ๋ ๋ด์ฉ์ ํ์ํ ์ ์๋ ์์น๊ฐ ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋ง์ด์ฃ .
<!-- ... existing HTML ... -->
<div id="like_button_container"></div>
<!-- ... existing HTML ... -->
์ด <div>
ํ๊ทธ์ ์ ์ผํ HTML ์์ฑ์ธ id
๋ฅผ ๋ถ์ฌํด์ค๋๋ค. ์ด๋ฅผ ํตํด JavaScript๊ฐ ํ๊ทธ๋ฅผ ์ฐพ๊ณ ์ฐพ์ ํ๊ทธ ์์ React ์ปดํฌ๋ํธ๋ฅผ ํ์ํ ์ ์๊ฒ๋ฉ๋๋ค.
ํ
์ปจํ ์ด๋
<div>
ํ๊ทธ๋ ์ด ์ฒ๋ผ<body>
ํ๊ทธ ์ ์ชฝ ์ด๋์๋ ์ถ๊ฐํ ์ ์์ต๋๋ค. ํ ํ์ด์ง์์๋ ๋ ๋ฆฝ์ ์ธ DOM ์ปจํ ์ด๋๋ฅผ ์ํ๋ ๋งํผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ณดํต ์ด ํ๊ทธ๋ ๋น์ด์์ต๋๋ค. React๊ฐ DOM ์ปจํ ์ด๋ ์์ ๋ด์ฉ์ ์ถ๊ฐํด์ค๋๋ค.
2๋จ๊ณ: ์คํฌ๋ฆฝํธ ํ๊ทธ ์ถ๊ฐํ๊ธฐ
๊ทธ ๋ค์, <script>
ํ๊ทธ 3๊ฐ๋ฅผ ๋ซ๋ ํ๊ทธ์ธ </body>
์์ ์ถ๊ฐํด์ค๋๋ค.
<!-- ... ๋ค๋ฅธ HTML ... -->
<!-- React๋ฅผ ์คํ. -->
<!-- ์ฃผ์: ์ฌ์ดํธ๋ฅผ ๋ฐฐํฌํ ๋๋ "development.js"๋ฅผ "production.min.js"๋ก ๋์ฒดํ์ธ์. -->
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script> <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
<!-- ๋ง๋ React ์ปดํฌ๋ํธ๋ฅผ ์คํ. -->
<script src="like_button.js"></script>
</body>
์ฒ์ ๋ ํ๊ทธ๋ React๋ฅผ ์คํ์ํค๊ณ 3๋ฒ ์งธ ์ฝ๋๋ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ์คํ์ํต๋๋ค.
3๋จ๊ณ: React ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
like_button.js
๋ผ๋ ์ด๋ฆ์ผ๋ก HTML ํ์ด์ง ์์ ์ ํ์ผ์ ๋ง๋ญ๋๋ค.
์ด ์คํํฐ ์ฝ๋ ๋ฅผ ์ด๊ณ ์ฝ๋๋ฅผ ๋ฐฉ๊ธ ๋ง๋ ํ์ผ์ ๋ณต์ฌํด์ค๋๋ค.
ํ
์ด ์ฝ๋๋
LikeButton
์ด๋ผ๋ React ์ปดํฌ๋ํธ๋ฅผ ์ ์ํด์ค๋๋ค. ์ง๊ธ ๋น์ฅ ์ดํด๊ฐ ์ ๋์ด๋ ๊ฑฑ์ ๋ง์ธ์. React์ ๋ํ ๊ฐ๋ ์ ์์ ๋๊ฐ๋ ๊ฒ์ ๋์ค์ ์์ต์์ ์ฃผ์ ๊ฐ๋ ๊ฐ์ด๋์์ ๋ค๋ฃฐ ๊ฒ๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ ๋น์ฅ์, ์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ๋์ฐ๋ ๋ฐ ์ง์คํด๋ด ์๋ค!
like_button.js
์ ๋งจ ๋ท ์ค, ๊ทธ๋ฌ๋๊น ์๊น ๋ถ์ฌ๋ฃ์ ์คํํฐ ์ฝ๋ ๋ค์ ๋ค์ ์ฝ๋ ์ธ ์ค์ ์ถ๊ฐํด์ค๋๋ค.
// ... ๋ณต์ฌํ๋ ์คํํฐ ์ฝ๋ ...
const domContainer = document.querySelector('#like_button_container');const root = ReactDOM.createRoot(domContainer);root.render(e(LikeButton));
์ด ์ธ ์ค์ ์ฝ๋๋ ์ฒซ ๋จ๊ณ์์ HTML ํ์ด์ง์ ์ถ๊ฐํ๋ <div>
ํ๊ทธ๋ฅผ ์ฐพ์์ฃผ๊ณ , ํด๋น ํ๊ทธ์ React ์ฑ์ ๋ง๋ค์ด์ฃผ๊ณ , ๊ทธ ์์ โ์ข์์โ ๋ฒํผ React ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
๋ค ๋๋ฌ์ต๋๋ค!
๋ค์ ๋จ๊ณ๋ ์์ต๋๋ค. ๋ฐฉ๊ธ ์น์ฌ์ดํธ์ ์ฒ์์ผ๋ก React ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋ค์ ์ฐจ๋ก๋ค์ React๋ฅผ ๊ธฐ์กด ํ๋ก์ ํธ์ ๊ฒฐํฉํ๋๋ฐ ๋์์ด ๋ ๋งํ ์ ๋ณด๋ค์ด ๋ ์์ต๋๋ค.
์์ ์ ์ฒด ์์ค ์ฝ๋ ๋ณด๊ธฐ
์์ ์ ์ฒด ๋ค์ด๋ก๋ (2KB๋ก ์์ถ๋จ)
ํ: ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ
๋ณดํต์ ํ๋์ ์นํ์ด์ง์ ์ฌ๋ฌ React ์ปดํฌ๋ํธ๋ฅผ ์ค์นํ๊ฒ ๋ฉ๋๋ค. ๋ค์ ์์๋ โ์ข์์โ ๋ฒํผ 3๊ฐ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์ปดํฌ๋ํธ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๋ ์ฝ๋์ ๋๋ค.
์์ ์ ์ฒด ์์ค ์ฝ๋ ๋ณด๊ธฐ
์์ ์ ์ฒด ๋ค์ด๋ก๋ (2KB๋ก ์์ถ๋จ)
์ฃผ์
์ด ๋ฐฉ๋ฒ์ ๋๊ฐ ํ์ด์ง์์ React๋ก ๋ง๋ค์ด์ง ๋ถ๋ถ๋ค์ด ์๋ก ๊ฒฉ๋ฆฌ ๋์ด์์ ๋ ์ ์ฉํฉ๋๋ค. React ์ฝ๋ ๋ด์์๋ ์ปดํฌ๋ํธ ํฉ์ฑ์ ์ฌ์ฉํ๋ ํธ์ด ๋ ์ฝ์ต๋๋ค.
ํ: ํ๋ก๋์ ์ ์ํ JavaScript์ ์์ถ
ํ๋ก๋์ ์ ์ํด ์น์ฌ์ดํธ๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ ์ JavaScript ํ์ผ์ ์์ถํ์ง ์๋๋ค๋ฉด ์น์ฌ์ดํธ๋ฅผ ์ฌ์ฉํ ๋ ๋์ ๋๋ ์ฑ๋ฅ ์ ํ๊ฐ ์ผ์ด๋ ๊ฒ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
์คํฌ๋ฆฝํธ๋ฅผ ์ด๋ฏธ ์์ถํ์ ๊ฒฝ์ฐ ๋ฐฐํฌ๋ HTML ํ์ผ์ด production.min.js
๋ก ๋๋๋ React ํ์ผ์ ํ์คํ ์คํํ๊ธฐ๋ง ํ๋ฉด ์ฌ์ดํธ๋ ํ๋ก๋์
์ค๋น๊ฐ ์๋ฃ๋ ๊ฒ๋๋ค.
<script src="https://unpkg.com/react@18/umd/react.production.min.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js" crossorigin></script>
์คํฌ๋ฆฝํธ๋ฅผ ์์ถํ๋ ์ ์ฐจ๊ฐ ๋ฐ๋ก ์๋ค๋ฉด ์ด ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํด์ ์ค์ ํด๋ณด์ธ์.
์ ํ์ฌํญ: JSX๋ก React ํด๋ณด๊ธฐ
์ง๊ธ๊น์ง ๋ค๋ค๋ ์์๋ค์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ ์์๋ค๋ง์ ์ฌ์ฉํ์ต๋๋ค. ๋๋ฌธ์ React๊ฐ ์ด๋ค ๊ฒ์ ํ์ํ ์ง ๊ฒฐ์ ํด์ฃผ๋ JavaScript์ ํจ์๋ค์ ์ฌ์ฉํ์ต๋๋ค.
const e = React.createElement;
// "์ข์์" <button>์ ํ์
return e(
'button',
{ onClick: () => this.setState({ liked: true }) },
'Like'
);
ํ์ง๋ง, React์์๋ JSX๋ผ๋ ๋ ๋ค๋ฅธ ์ ํ์ง๊ฐ ์์ต๋๋ค.
// "์ข์์" <button>์ ํ์
return (
<button onClick={() => this.setState({ liked: true })}>
Like
</button>
);
์ ๋ ์ฝ๋๋ค์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค. JSX๋ ํ์๊ฐ ์๋ ์ ํ์ฌํญ์ด์ง๋ง ์ฌ๋๋ค์ UI ์ฝ๋๋ฅผ ์งค ๋ JSX๋ฅผ ์ฐ๋ ๊ฒ์ด ๋ ํธ๋ฆฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. React์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์์๋ ๋ง์ด์ฃ .
์ด ์จ๋ผ์ธ ๋ณํ๊ธฐ๋ฅผ ํตํด์ JSX๋ก ์ฌ๋ฌ ๊ฐ์ง ์์ ์ ํด๋ณผ ์ ์์ต๋๋ค.
JSX ๋น ๋ฅด๊ฒ ์๋ํด๋ณด๊ธฐ
๊ธฐ์กด ํ๋ก์ ํธ์์ JSX ํ๊ทธ๋ฅผ ์จ๋ณด๋ ์ ์ผ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ์ด <script>
ํ๊ทธ๋ฅผ ์ง์ด๋ฃ๋ ๊ฒ๋๋ค.
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
์ด์ ์ด๋ค <script>
ํ๊ทธ์์๋ type="text/babel"
์ฑ์ง์ ์ถ๊ฐํ๋ฉด JSX๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด JSX๋ฅผ ์ฌ์ฉํ ์์ HTML ํ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ง ์์
๋ค์ ํด๋ณด์ธ์.
์ด๋ฐ ์์ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๊ณต๋ถ ๋ชฉ์ ์ด๋ ๊ฐ๋จํ ๋ฐ๋ชจ ์ฌ์ดํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํจ์ด๋ผ๋ฉด ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋, ์ด ๋ฐฉ๋ฒ์ ์ฌ์ดํธ๋ฅผ ๋๋ฆฌ๊ฒ ๋ง๋ค๊ณ ํ๋ก๋์
์์๋ ๋ง์ง ์์ต๋๋ค. ํ ๋จ๊ณ ์์ผ๋ก ๋์๊ฐ ์ค๋น๊ฐ ๋์๋ค๋ฉด ์๋ก ์ถ๊ฐํ <script>
ํ๊ทธ์ type="text/babel"
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ๊ฑฐํด๋ณด์ธ์. ๋ค์ ์ฐจ๋ก์์๋ <script>
ํ๊ทธ๋ฅผ ์๋์ผ๋ก ๋ณํ์์ผ์ค JSX ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ง๋ค ๊ฒ๋๋ค.
ํ๋ก์ ํธ์ JSX ์ถ๊ฐํ๊ธฐ
JSX๋ฅผ ํ๋ก์ ํธ์ ์ถ๊ฐํ๋ ๋ฐ์๋ ๋ณต์กํ ๋ฒ๋ค๋ฌ๋ ๊ฐ๋ฐ ์๋ฒ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ํต์ฌ์, JSX๋ฅผ ์ถ๊ฐํ๋ ๊ฑด ๋ง์น CSS ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ๋ค๋ ๊ฒ๋๋ค. ์ค์ง ํ์ํ ๊ฑด ์ปดํจํฐ์ Node.js๋ฅผ ์ค์นํ๋ ๊ฒ๋๋ค.
ํฐ๋ฏธ๋์์ ํ๋ก์ ํธ ํ์ผ์ ์ ๊ทผํ๊ณ ๋ค์ ๋ ๋ช ๋ น์ด๋ฅผ ๋ถ์ฌ๋ฃ๊ธฐ ํ์ธ์.
- 1๋จ๊ณ:
npm init -y
๋ฅผ ์คํํ์ธ์. (์คํจํ๋ค๋ฉด ์ฌ๊ธฐ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.) - 2๋จ๊ณ:
npm install babel-cli@6 babel-preset-react-app@3
๋ฅผ ์คํํ์ธ์.
ํ
JSX ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ค์นํ ๋ npm์ ์ฌ๊ธฐ์๋ง ์ฐ๋ฉด ๋ฉ๋๋ค. ๋ค๋ฅธ ๋จ๊ณ์์๋ npm์ด ์ฐ์ผ ์ผ์ด ์์ต๋๋ค. React์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ ๋๋ค ๋๊ฐ์ด
<script>
ํ๊ทธ๋ก ์ ์งํ ์ ์์ต๋๋ค.
์ถํํฉ๋๋ค! ํ๋ก์ ํธ์ ํ๋ก๋์ ์ค๋น๊ฐ ๋ JSX ์ค์ ์ ๋๋ง์ณค์ต๋๋ค.
JSX ์ ์ฒ๋ฆฌ๊ธฐ ์คํํ๊ธฐ
src
ํด๋๋ฅผ ๋ง๋ค๊ณ ๋ค์ ํฐ๋ฏธ๋ ๋ช
๋ น์ด๋ฅผ ์คํํ์ธ์.
npx babel --watch src --out-dir . --presets react-app/prod
์ฃผ์
npx
๋ ์คํ๊ฐ ์๋๋๋ค. โ npm 5.2๋ฒ์ ์ด์์ ๋ด์ฅ๋ ํจํค์ง ์คํ ๋๊ตฌ์ ๋๋ค.โ
babel
ํจํค์ง ์ค์น๊ฐ ์๋ชป ์ํ๋์์ต๋๋ค.โ๋ผ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ณด์๋ค๋ฉด, ๊ทธ ์ ๋จ๊ณ๋ค์์ ๋ช ๊ฐ์ง ๋์ณค์ ์๋ ์์ต๋๋ค. ๋์ผํ ํด๋์์ ์ด๋ฅผ ์คํํ๊ณ ๋ค์ ์๋ํด๋ณด์ธ์.
๋๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์ต๋๋ค. ์ด ๋ช ๋ น์ด๋ ์๋ํ ๋ JSX ๊ฐ์๊ธฐ๋ฅผ ์คํํฉ๋๋ค.
JSX ์คํํฐ ์ฝ๋๋ฅผ ํตํด src/like_button.js
๋ผ๋ ํ์ผ์ ๋ง๋ค์ด์ฃผ๋ฉด, ๊ฐ์๊ธฐ๊ฐ ์ ์ฒ๋ฆฌ ๋์ด ๋ธ๋ผ์ฐ์ ์ ํธํ๋๋ ์์ JavaScript๋ก ๊ตฌ์ฑ๋ like_button.js
๋ฅผ ์์ฑํฉ๋๋ค. JSX๋ฅผ ํฌํจํ ์์ค ํ์ผ์ ํธ์งํ๋ฉด ์ด ๊ณผ์ ์ด ์๋์ผ๋ก ๋ค์ ์คํ๋ฉ๋๋ค.
๋ค์ผ๋ก ์ด ๊ฐ์๊ธฐ๋ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ๊ฑฑ์ ํ ํ์ ์์ด ํด๋์ค์ ๊ฐ์ ๋ชจ๋ JavaScript ๋ฌธ๋ฒ์ ์ธ ์ ์๊ฒ ํด์ค๋๋ค. ์๊น ์ฌ์ฉํ๋ ๋๊ตฌ๋ Babel์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. Babel์ ๋ํ ์์ธํ ์ ๋ณด๋ ๊ณต์ ๋ฌธ์์์ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ฐ ๋น๋ ๋๊ตฌ๋ค์ ์ต์ํด์ง๊ณ ๋ ๋ง์ ๊ฒ์ ํด๋ณด๊ณ ์ถ์ด์ง๋ค๊ณ ๋๋ผ๊ธฐ ์์ํ๋ค๋ฉด, ๋ค์ ๋ฌธ์ ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๊ณ ์ ๊ทผ์ฑ์ด ์ข์ ํด์ฒด์ธ๋ค์ ์๊ฐํ๊ณ ์์ผ๋ ํ์ธํด๋ณด์ธ์. ๊ทธ๋ ์ง ์์๋ ๊ด์ฐฎ๋ค๋ฉด, ์ด ์คํฌ๋ฆฝํธ ํ๊ทธ๋ง์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค!