๐ What You Will Study
๋ฆฌ์กํธ ์ฒซ ์์
์ ๋ฃ๊ธฐ ์ ์ ํด์ผ ํ ๊ฒ๋ค
step0. node, npm ์ค์น
- node๊ฐ ์ค์น๋๋ฉด npm๋ ํจ๊ป ์ค์น ๋๋ค. (npm์ ๋ฐ๋ก ์ค์นํ ํ์ ์๋ค)
- node ์ค์น ํ์ ํฐ๋ฏธ๋์ node -v, npm -v๋ฅผ ์
๋ ฅํ๋ฉด ๋ฒ์ ์ ํ์ธํ ์ ์๋ค. ๋ฒ์ ์ ๋ณด๊ฐ ๋จ๋ฉด ์ ๋๋ก ์ค์น ๋์๋ค๋ ์๋ฏธ.
step 1. ๋ฆฌ์กํธ?? ๊ฐ๋ณ๊ฒ ํ์ด๋ณด๊ธฐ!
ํ์ด์ค๋ถ์์ ๋ง๋ ์๋ฐ์คํฌ๋ฆฝํธ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Labrary(๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋?
- ์ฌ์ฌ์ฉ์ด ํ์ํ ๊ธฐ๋ฅ์ผ๋ก ๋ฐ๋ณต์ ์ธ ์ฝ๋ ์์ฑ์ ์์ ๊ธฐ ์ํด ์ธ์ ๋ ์ง ํ์ํ ๊ณณ์์ ํธ์ถํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก Class๋ Function์ผ๋ก ๋ง๋ค์ด์ง ๊ฒ
Node(๋
ธ๋)๋?
- ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์น๋ธ๋ผ์ฐ์ ์์ ๊ตฌ๋์ด ๋๋ค. ์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํฐ๋ฏธ๋ ํ๊ฒฝ์์ ๊ตฌ๋๋ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋
ธ๋๋ผ๊ณ ํ๋ค.
NPM (Node Package Manager / ๋
ธ๋ ํจํค์ง ๋งค๋์ )์ด๋?
- ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ํ ํจํค์ง ๊ด๋ฆฌ์. ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ํ๊ฒฝ Node.js์ ๊ธฐ๋ณธ ํจํค์ง ๊ด๋ฆฌ์์ด๋ค.
Component(์ปดํฌ๋ํธ)๋?
- ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ์ ์ ๋ฆฌํ๋ค.
- ์ฌ์ฉ์๊ฐ ์ ์ํด์ ๋ง๋ ํ๊ทธ๋ฅผ ์ปดํฌ๋ํธ๋ผ๊ณ ํ๋ค.
- ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋
์ฑ์ ๋์ผ ์ ์๋ค.
package.json ํ์ผ
- ๋ฆฌ์กํธ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
dependencies - ํจํค์ง๋ค์ ๋ชจ์ ๋์ ๊ฒ
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-scripts": "3.4.1"
scripts - npm run start ํ ๋ ์ฌ์ฉ
๐ control + shift + ~ : vscode์์ ํฐ๋ฏธ๋ ์ด๊ธฐ ๋จ์ถํค
- noed_modules ํ์ผ
๋ฆฌ์กํธ ์ฑ์์ ์ฌ์ฉํ๋ ํจํค์ง ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋ณดํต .gitignore์ ํ์ํ๊ณ ๊น์ ๊น์ ํฌํจ ์ํค์ง ์์
๋ค๋ฅธ ์ฌ๋์ด ํ๋ก์ ํธ๋ฅผ ํด๋ก ๋ฐ์์ ๋ noed_modules ํด๋๊ฐ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค์ด ๋ฐ์ ์ฌ๋์ด package.json์ ์๋ ์ ๋ณด๋ก ์ง์ ๋ค์ด ๋ฐ์ install๋ก ๋ค์ ์ค์นํ๊ณ ์คํํด์ผ ํ๋ค.
step 2. react๊ธ
1. React 1 - JSX
JSX
const hi = <p>Hi</p>;
- ์ ๋ฌธ๋ฒ์ JSX๋ผ๊ณ ๋ถ๋ฆฌ๋ JavaScript ํ์ฅ ๋ฒ์ ์ด๋ค.
- syntax extension for JavaScript๋ผ๊ณ ํฉ๋๋ค. HTML๊ณผ ๋น์ทํ๊ฒ ์๊ฒผ๊ณ , javascript ํ์ผ ๋ด์์ ์์ฑํ ์ ์๋ค.
- JSX๋ JavaScript ๋ฌธ๋ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ js ํ์ผ ๋ด์ JSX ๋ฌธ๋ฒ์ด ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ํด์ํ์ง ๋ชปํ๊ณ ๋ฌธ๋ฒ ์ค๋ฅ๊ฐ ๋๋ค.
JSX element
- HTML ๋ฌธ๋ฒ์ JavaScript ์ฝ๋ ๋ด๋ถ์ ์ฌ์ฉํ๋ ๊ฒ์ด JSX์ด๋ค.
- .jsํ์ผ ์ด๋์์๋ ์์ฑํ ์ ์๋ค. ๋ณ์์ ์ ์ฅํ ์๋ ์๊ณ , ํจ์์ ์ธ์๋ก ๋๊ธธ ์๋ ์๋ค.
JSX attribute
-
ํ๊ทธ์ attribute(์์ฑ)์ ์ฃผ๊ณ ์ถ์ ๋๋ ""์๋ฐ์ดํ๋ก ๊ฐ์ธ์ค๋ค. ์ค์ HTML์์ ์ฐ๋ attribute name(์์ฑ๋ช
)๊ณผ ๋ค๋ฅผ ์ ์๋ค.
-
์๋ฅผ ๋ค์ด, class๋ฅผ ์ฃผ๊ณ ์ถ์ ๋ ์๋ ์์ฑ๋ช
์ class์ด์ง๋ง JSX์์๋ className์ ์ฌ์ฉํ๋ค.
const hi = <input readOnly={true} />;
const myFavorite = {
food: <li>์๋ฌ๋</li>,
animal: <li>dog</li>,
hobby: <li className="list-item">programming</li>
};
๐ Self-Closing Tag
JSX์์๋ ์ด๋ค ํ๊ทธ๋ผ๋ self closing tag๊ฐ ๊ฐ๋ฅํ๋ค.
<input>
์ฒ๋ผ ํ๋์ ํ๊ทธ๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋ <input />
์ ๊ฐ์ด ํญ์ /๋ก ๋๋ด์ค์ผ ํ๋ค.
<div />
์ <div></div>
๋ ๊ฐ์ ํํ
Nested JSX
1. (ํ์) ์๊ดํธ๋ก ๊ฐ์ธ๊ธฐ
const good = (
<div>
<p>hi</p>
</div>
);
์ค์ฒฉ๋ ์์๋ฅผ ๋ง๋ค๋ ค๋ฉด () ์๊ดํธ๋ก ๊ฐ์ธ์ค์ผ ํ๋ค.
2. (ํ์) ํญ์ ํ๋์ ํ๊ทธ๋ก ์์
const right = (
<div>
<p>list1</p>
<p>list2</p>
</div>
);
์ฒซ ์์๋ ๋ฌด์กฐ๊ฑด ํ๋์ ํ๊ทธ๋ก ๊ฐ์ธ์ ธ์ผ ํ๋ค.
Rendering
- html์์(element), ๋๋ React ์์ ๋ฑ์ ์ฝ๋๊ฐ ๋์ผ๋ก ๋ณผ ์ ์๋๋ก ๊ทธ๋ ค์ง๋ ๊ฒ์ ๋ ๋๋ง(rendering) ์ด๋ผ๊ณ ํ
์คํธํ๋ค.
- React ์์๊ฐ DOM node์ ์ถ๊ฐ๋์ด ํ๋ฉด์ ๋ ๋๋๋ ค๋ฉด ReactDOM.render ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
์ฒซ ๋ฒ์งธ ์ธ์์๋ JSX์์๋ฅผ ์ธ์๋ก ๋๊ธฐ๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ ํด๋น ์์๋ฅผ ๋ ๋ํ๊ณ ์ถ์ container(๋ถ๋ชจ์์)๋ฅผ ์ ๋ฌํ๋ค.
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
2. React 2 - Component
Component
- component(์ปดํฌ๋ํธ)๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ๋จ์
- ์ปดํฌ๋ํธ๋ ๋
๋ฆฝ์ ์ผ๋ก, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ก ๊ด๋ฆฌํ ์ ์๋ค.
- ์ปดํฌ๋ํธ๋ ํจ์๋ ๋น์ทํ๋ค. ์ปดํฌ๋ํธ๋ input์ ๋ฐ์์ return ํ ์ ์๋ค.
- React ์ปดํฌ๋ํธ์์๋ input์ props๋ผ๊ณ ํ๊ณ return์ ํ๋ฉด์ ๋ณด์ฌ์ ธ์ผํ React์์๊ฐ return ๋๋ค.
Component ๋ง๋ค๊ธฐ
- React๋ Componenet๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌํ๊ธฐ ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
- React์์๋ ์ปดํฌ๋ํธ๋ฅผ class๋ ํจ์๋ก ๋ง๋ค ์ ์๋ค. ์ด๋ค ๋์๋ ํจ์๋ก ๋ง๋ค๋ฉด ์ข๊ณ , ์ด๋ค ๋์๋ class๋ก ๋ง๋ค์ด์ผ ํ๋ค.
ํจ์๋ก Welcome ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
class๋ก Welcome ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
- class๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ค๋ฉด React.Component๋ฅผ extend ํด์ ์์ฑํ๋ค.
- ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ๋ render() ๋ฉ์๋๋ ๋ฌด์กฐ๊ฑด ์ ์ํด์ผ ํ๊ณ , return๋ ํด์ค์ผ ํ๋ค.
์๋ component๋ฅผ ๋ง๋ค ๋ ํ์ํ ๋ฉ์๋๊ฐ ๋ ์์ง๋ง render()๋ง ํ์
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
Component ์ฌ์ฉ
- ์์ฒ๋ผ ์ ์ํ ์ปดํฌ๋ํธ๋ ํจ์/class ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ํ๊ทธ์ฒ๋ผ
<Welcome />
์ผ๋ก ์์ฑํ๋ค.
- ์ ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋, ์ํ๋ attribute๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด Welcome ์ปดํฌ๋ํธ(ํจ์)์์ parameter๋ก ํด๋น attribute๋ฅผ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค. ์ด๊ฒ์ props๋ผ๊ณ ํ๋ค.
props๋ property์ ์ค์๋ง์ด๋ค. .(dot)์ผ๋ก ์์ฑ๋ช
์ ์ ๊ทผ๊ฐ๋ฅ, props.์์ฑ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
function App() {
return (
<div>
<Welcome name="Sara" />
<Welcome name="Cahal" />
<Welcome name="Edite" />
</div>
);
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
- Welcom ์ปดํฌ๋ํธ: Welcome ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ธก(๋ถ๋ชจ)์์ name์ด๋ผ๋ attribute๋ฅผ ๋ถ์ฌ. props.name์ ๊ฐ์ ์ฌ์ฉ.
- App ์ปดํฌ๋ํธ๊ฐ div๋ก ๊ฐ์ธ์ ธ์๊ณ ,
<Welcome />
์ปดํฌ๋ํธ๋ฅผ ์ธ๋ฒ ์ฌ์ฉ. name์ด๋ผ๋ attribute๋ฅผ ๋ถ์ฌ.
- ReactDOM.render ํจ์๋ก React ์์๋ฅผ ๊ทธ๋ ค์ค๋ค. root๋ผ๋ id๋ฅผ ์ฐพ์
<App />
์ปดํฌ๋ํธ๋ฅผ ๊ทธ๋ ค์ค๋ค.
๋ฆฌ์กํธ ์์ํ๊ธฐ
- ํฐ๋ฏธ๋์์ ์ํ๋ ์์น๋ก ์ด๋ํ๋ค.
- npx create-react-app ํด๋๋ช
์ ์
๋ ฅํ๋ค.
Happy hackin!์ด ๋จ๋ฉด ์๋ฃ๋ ๊ฒ
- cd ๋ง๋ ํด๋๋ช
์ผ๋ก ์ด๋
code . ์ ์
๋ ฅ ํ๋ฉด vscode์์ ๊ทธ ํด๋๋ฅผ ๋ฐ๋ก ์ด์ด ์ค๋ค.
react-app ๋ง๋ค๊ณ ๋ ํ
-
cra(create-react-app)๋ก ๋ง๋ค๊ณ ๋ ํ์ 3๊ฐ์ ํ์ผ ์ง์ด๋ค
src ํ์ผ์ ์๋ App.test.js / serviceWorker.js / setupTests.js
-
index.js ๋ฆฌ์กํธ์์ ๊ฐ์ฅ ์ต์์ js ํ์ผ(๊ธฐ์ค์ด ๋๋ ํ์ผ)
ReactDOM.render(, document.getElementById('root'));
-
์ปดํฌ๋ํธ ์์ํ ๋ ๋งจ ์์ ํญ์
import React from 'react';๋ฅผ ํด์ค์ผ ํ๋ค ๋ฌด์กฐ๊ฑด!
-
ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ํด๋์คํ ์ปดํฌ๋ํธ๋ก ๋ฐ๊ฟ์ค๋ค.
import React, { Component } from 'react';
import Box from "./Box";
import './App.css';
class App extends Component {
render() {
return (
<div className="App">
Hello
<Box />
</div>
);
}
}
export default App;
- render() ๋ฉ์๋
์ปดํฌ๋ํธ๋ JSX๋ฅผ return ํ๋ค. JSX๋ html๋ javascript๋ ์๋๋ค ๊ธฐ๋ฅ์ html ๊ธฐ๋ฅ์ ํ๋ค.
- ์ปดํฌ๋ํธ ๋ง๋ค css ํ์ผ์ ๋ง๋ค์ด์ค๋ค.
- App.js ๋ถ๋ชจ ์ปดํฌ๋ํธ ๋ชจ๋ ์ปดํฌ๋ํธ ๋ณด์ฌ ์ฃผ๋ ค๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์์ด์ผํ๋ค.
๋ฆฌํด๋ฌธ ์์๋ ํ๋์ div๋ง ์์ด์ผ ๋๋ค. ๊ทธ div ์์์๋ ์ฌ๋ฌ๊ฐ์ div๊ฐ ๊ฐ๋ฅํ๋ค.
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));