React ์์ํ๊ธฐ
React ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ
1.
CDN ์ผ๋ก ์์ํ๊ธฐ
2.
Node.js ์ npm ์ผ๋ก ์์ํ๊ธฐ
CDN ์ผ๋ก ์์ํ๊ธฐ
โข
๊ฐ๋ฐ์ฉ CDN script
โข
๋ฐฐํฌ์ฉ CDN script
๊ฐ๋ฐ์ฉ CDN script
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
HTML
๋ณต์ฌ
๋ฐฐํฌ์ฉ CDN script
<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
HTML
๋ณต์ฌ
๋ฐ๋ฒจ(babel) CDN script
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
HTML
๋ณต์ฌ
์์์ฝ๋
<!DOCTYPE html>
<html>
<head>
<!-- React์ ReactDOM์ ๋ถ๋ฌ์ค๊ธฐ ์ํ CDN -->
<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>
<!-- Babel์ ์ฌ์ฉํ๊ธฐ ์ํ CDN -->
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<!-- React ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ปจํ
์ด๋ -->
<div id="mydiv"></div>
<!-- Babel์ ์ฌ์ฉํ์ฌ JSX ์ฝ๋๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํธ๋์คํ์ผํ๋ ์คํฌ๋ฆฝํธ -->
<script type="text/babel">
// React ํจ์ ์ปดํฌ๋ํธ ์ ์
function Hello() {
return <h1>Hello World!</h1>;
}
// ๋ ๋๋งํ ์ปจํ
์ด๋ ์์ ๊ฐ์ ธ์ค๊ธฐ
const container = document.getElementById('mydiv');
// ReactDOM.createRoot๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจํธ ์์ฑ
const root = ReactDOM.createRoot(container);
// Hello ์ปดํฌ๋ํธ๋ฅผ ๋ฃจํธ์ ๋ ๋๋ง
root.render(<Hello />);
</script>
</body>
</html>
HTML
๋ณต์ฌ
CDN์ ์ฌ์ฉํ๋ฉด ๋ณ๋์ ๋น๋ ๋ฐ ๋ฒ๋ค๋ง ๊ณผ์ ์ ๊ฑฐ์น์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ๋จ๊ณ์์๋ ํธ๋ฆฌํฉ๋๋ค. ํ์ง๋ง, ์ค์ ํ๋ก๋์
ํ๊ฒฝ์์๋ ์ฑ๋ฅ, ์ต์ ํ, ์ฝ๋ ๋ถํ ๋ฑ์ ๊ณ ๋ คํด์ผ ํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๋ฒ๋ค๋ฌ์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
Node.js ์ npm ์ผ๋ก ์์ํ๊ธฐ
1.
Node.js ์ค์น
2.
React ํ๋ก์ ํธ ์์ฑ ๋ช
๋ น
3.
React ํ๋ก์ ํธ ์คํ
Node.js ์ค์น
์ฌ์ ์ค์น : Node.js
React ํ๋ก์ ํธ ์์ฑ ๋ช ๋ น
npx create-react-app (ํ๋ก์ ํธ๋ช )
npx create-react-app react-app
Shell
๋ณต์ฌ
npm ์์ network read ECONNRESET์ด ๋ฐ์ํ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ
npm config set registry http://registry.npmjs.org/
Shell
๋ณต์ฌ
registry ์ค์ ํ, ๋ค์ ๋ช
๋ น์ด ์คํ.
React ํ๋ก์ ํธ ์คํ
ํ๋ก์ ํธ ๊ฒฝ๋ก๋ก ์ด๋
cd react-app
Shell
๋ณต์ฌ
ํ๋ก์ ํธ ์คํ
npm start
Shell
๋ณต์ฌ
์ฃผ์ ์์ค ํ์ผ
1.
index.html
2.
index.js
3.
app.js
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<!-- ๋ฌธ์์ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ค์ ํฉ๋๋ค. -->
<meta charset="utf-8" />
<!-- ์น์ฌ์ดํธ์ ์์ด์ฝ์ ์ค์ ํฉ๋๋ค. -->
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<!-- ๋ทฐํฌํธ ์ค์ ์ผ๋ก ๋ฐ์ํ ์น ๋์์ธ์ ์ง์ํฉ๋๋ค. -->
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- ํ
๋ง ์์์ ์ค์ ํฉ๋๋ค. -->
<meta name="theme-color" content="#000000" />
<!-- ์น ์ฑ ์ค๋ช
์ ์ถ๊ฐํฉ๋๋ค. -->
<meta
name="description"
content="Web site created using create-react-app"
/>
<!-- ์ ํ ํฐ์น ์์ด์ฝ์ ์ค์ ํฉ๋๋ค. -->
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json์ ์น ์ฑ์ด ์ฌ์ฉ์์ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ ๋ฐ์คํฌํฑ์ ์ค์น๋ ๋ ์ฌ์ฉ๋๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
https://developers.google.com/web/fundamentals/web-app-manifest/ ์ฐธ๊ณ
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
์์ ํ๊ทธ๋ค์์ %PUBLIC_URL%์ ์ฃผ๋ชฉํ์ธ์.
๋น๋ ์ค์๋ ์ด๊ฒ์ด `public` ํด๋์ URL๋ก ๋์ฒด๋ฉ๋๋ค.
์ค์ง `public` ํด๋ ๋ด๋ถ์ ํ์ผ๋ง HTML์์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
"/favicon.ico" ๋๋ "favicon.ico"์ ๋ฌ๋ฆฌ "%PUBLIC_URL%/favicon.ico"์
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ
๊ณผ ๋ฃจํธ๊ฐ ์๋ ๊ณต์ฉ URL ๋ชจ๋์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
๋ฃจํธ๊ฐ ์๋ ๊ณต์ฉ URL์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ `npm run build`๋ฅผ ์คํํ์ฌ ํ์ธํ์ธ์.
-->
<!-- ์น ํ์ด์ง์ ์ ๋ชฉ์ ์ค์ ํฉ๋๋ค. -->
<title>React App</title>
</head>
<body>
<!-- JavaScript๋ฅผ ์คํํ ์ ์๋๋ก JavaScript๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค. -->
<noscript>You need to enable JavaScript to run this app.</noscript>
<!-- React ์ฑ์ ๋ ๋๋งํ ์ปจํ
์ด๋ ์ญํ ์ ํ๋ div ์์์
๋๋ค. -->
<div id="root"></div>
<!--
์ด HTML ํ์ผ์ ํ
ํ๋ฆฟ์
๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ์ง์ ์ด๋ฉด ๋น ํ์ด์ง๊ฐ ํ์๋ฉ๋๋ค.
์ด ํ์ผ์ ์นํฐํธ, ๋ฉํ ํ๊ทธ ๋๋ ์ ๋๋ฆฌํฑ์ค๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋น๋ ๋จ๊ณ์์๋ ๋ฒ๋ค๋ ์คํฌ๋ฆฝํธ๋ฅผ <body> ํ๊ทธ์ ๋ฐฐ์นํฉ๋๋ค.
๊ฐ๋ฐ์ ์์ํ๋ ค๋ฉด `npm start` ๋๋ `yarn start`๋ฅผ ์คํํ์ธ์.
ํ๋ก๋์
๋ฒ๋ค์ ์์ฑํ๋ ค๋ฉด `npm run build` ๋๋ `yarn build`๋ฅผ ์ฌ์ฉํ์ธ์.
-->
</body>
</html>
HTML
๋ณต์ฌ
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
// 'root'๋ผ๋ ID๋ฅผ ๊ฐ์ง DOM ์์๋ฅผ ์ฐพ์์ React Root๋ฅผ ์์ฑํฉ๋๋ค.
const root = ReactDOM.createRoot(document.getElementById('root'));
// React StrictMode๋ฅผ ์ฌ์ฉํ์ฌ App ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
// ์ฑ์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ ํจ์๋ฅผ ์ ๋ฌํฉ๋๋ค.
// (์: reportWebVitals(console.log))
// ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํ๋ ๋ถ์ ๋๊ตฌ์ ์ ๋ฌํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ https://bit.ly/CRA-vitals๋ฅผ ์ฐธ์กฐํ์ธ์.
reportWebVitals();
JavaScript
๋ณต์ฌ
app.js
// 'logo.svg' ํ์ผ์ ๊ฐ์ ธ์ต๋๋ค.
import logo from './logo.svg';
// 'App.css' ์คํ์ผ ํ์ผ์ ๊ฐ์ ธ์ต๋๋ค.
import './App.css';
// ํจ์ํ ์ปดํฌ๋ํธ์ธ App์ ์ ์ํฉ๋๋ค.
function App() {
// ์ปดํฌ๋ํธ์ JSX ๊ตฌ์กฐ๋ฅผ ๋ฐํํฉ๋๋ค.
return (
<div className="App">
{/* ์ ํ๋ฆฌ์ผ์ด์
์ ํค๋ ๋ถ๋ถ์ ๋ํ๋
๋๋ค. */}
<header className="App-header">
{/* ๋ก๊ณ ์ด๋ฏธ์ง๋ฅผ ํ์ํฉ๋๋ค. */}
<img src={logo} className="App-logo" alt="logo" />
{/* ํ
์คํธ ๋ด์ฉ์ ํ์ํ๊ณ , ์์ ์ ๋ฆฌ๋ก๋ ์๋ด๋ฅผ ์ ๊ณตํฉ๋๋ค. */}
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
{/* React ๊ณต์ ์น์ฌ์ดํธ๋ก ์ด๋ํ๋ ๋งํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. */}
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
// App ์ปดํฌ๋ํธ๋ฅผ ๋ชจ๋๋ก ๋ด๋ณด๋
๋๋ค.
export default App;
JavaScript
๋ณต์ฌ
์คํ์์ ์ดํดํ๊ธฐ
์ง์ ์
create-react-app์์ React ์ฑ์ ์ง์
์ (entry point)์ src/index.js๋ก ์ค์ ๋์ด ์์ต๋๋ค. ์ด๊ฒ์ create-react-app์ด ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๊ตฌ์กฐ์์์ ๊ท์น ์ค ํ๋์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก package.json ํ์ผ ๋ด๋ถ์์ "main" ํ๋๋ก ์ง์
์ ์ ์ง์ ํ ์ ์์ต๋๋ค. ํ์ง๋ง create-react-app์์๋ ๋๋ถ๋ถ์ ์ค์ ์ด ๋ด๋ถ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ผ๋ก "main" ํ๋๋ฅผ ์ค์ ํ ํ์๊ฐ ์์ต๋๋ค.
์คํ ์์
1.
public/index.html
2.
src/index.js
a.
App.js ์ปดํฌ๋ํธ ์์ฑ
3.
JSX JavaScript ๋ก ๋ณํ, DOM ์ ๋ ๋๋ง
public/index.html
๋ธ๋ผ์ฐ์ ์์ public/index.html ํ์ผ์ด ์ด๋ฆฌ๋ฉด, ๊ทธ ์์ ์๋ <div id="root"></div>๋ React ์ฑ์ด ๋ ๋๋ง๋ ์ฅ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
src/index.js
๊ทธ ํ, index.js ํ์ผ์ด ์คํ๋ฉ๋๋ค. index.js์์๋ ReactDOM.render()๋ฅผ ์ฌ์ฉํ์ฌ App ์ปดํฌ๋ํธ๋ฅผ <div id="root"></div>์ ๋ ๋๋งํฉ๋๋ค.
ReactDOM.render(<App />, document.getElementById('root')); ์ด ๋ถ๋ถ์ด ์ฑ์ ์์ํ๋ ์ง์ ์
๋๋ค.
React๋ ์ดํ์ App.js ํ์ผ์์ ์ ์๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ , JSX๋ฅผ JavaScript๋ก ๋ณํํ์ฌ ํด๋น DOM ์์์ ๋ ๋๋งํฉ๋๋ค.
์๋์ผ๋ก ํ๋ก์ ํธ ์์ํ๊ธฐ
1.
ํ๋ก์ ํธ ์ด๊ธฐํ
2.
App ์ปดํฌ๋ํธ ์์ฑ
3.
๋ฉ์ธ ํ๋ฉด ๊ตฌํ
4.
HTML ํ์ผ ์์ฑ
5.
ํ๋ก์ ํธ ์คํ
ํ๋ก์ ํธ ์ด๊ธฐํ
ํ๋ก์ ํธ ํด๋์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ React ๋ฐ ReactDOM์ ์ค์นํฉ๋๋ค.
npm init
HTML
๋ณต์ฌ
npm install react react-dom react-scripts
Shell
๋ณต์ฌ
package.json
"scripts": {
"start": "react-scripts start",
},
JSON
๋ณต์ฌ
App ์ปดํฌ๋ํธ ์์ฑ
App.js
// ํ์ผ: App.js
import React from 'react';
// JSX๋ฅผ ์ฌ์ฉํ ์ปดํฌ๋ํธ ์ ์
const App = () => {
return (
<div>
<h1>Hello, JSX World!</h1>
<p>This is a simple React component using JSX.</p>
</div>
);
};
export default App;
JavaScript
๋ณต์ฌ
๋ฉ์ธ ํ๋ฉด ๊ตฌํ
index.js
// ํ์ผ: index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
// ๋ฉ์ธ ํ๋ฉด์์ App ์ปดํฌ๋ํธ ๋ ๋๋ง
ReactDOM.render(<App />, document.getElementById('root'));
JavaScript
๋ณต์ฌ
HTML ํ์ผ ์์ฑ
index.html
<!-- ํ์ผ: index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>React App</title>
</head>
<body>
<!-- React ์ฑ์ ํ์ํ ์ปจํ
์ด๋ -->
<div id="root"></div>
</body>
</html>
HTML
๋ณต์ฌ
ํ๋ก์ ํธ ์คํ
npm start
HTML
๋ณต์ฌ
์ฐธ๊ณ
React ๋ฒ์ ํ์ธ ๋ช ๋ น
npm list react
JSON
๋ณต์ฌ