NPM#
Node Package Manager : ์ฑ์คํ ์ด์์ ์ฑ์ ์ค์นํ๋ ๊ฒ์ฒ๋ผ NPM์์ ํจํค์ง๋ฅผ ์ค์นํ ์ ์์.
ํจํค์ง๋ -g (global)์ ์ค์นํ ์๋ ์๊ณ , ํด๋น ๋๋ ํ ๋ฆฌ์ ๋ถํ์ผ๋ก์จ ์ฌ์ฉํ๋๋ก์ค์นํ ์ ์๋ค.
๊ฒ์๊ณผ ์ค์น#
NPM์ ๊ฒ์ํ๊ณ ์ค์นํ ์ ์๋ ์ฌ์ดํธ
๋ง์ฝ local-web-server ๋ผ๋ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ์ถ์ ๋,
npm i local-web-servernpm install local-web-server
i๋ install์ ์ฝ์
์ปดํจํฐ์ ์ ์ญ์ ์ธ, ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋จ์ผ๋ก ์ค์นํ๊ณ ์ถ์ ๋,
npm install -g local-web-server
g๋ global์ ์ฝ์
๊ถํ์ด ์๋ค๋ฉด sudo ๋ฅผ ์์ ์ถ๊ฐํ๋ค.
ํจํค์ง ๋ชฉ๋ก ๋ณด๊ธฐ์ ์ ๋ฐ์ดํธ, ์ญ์ #
ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์ค์น๋ ํจํค์ง ๋ณด๊ธฐ
npm list
์ ์ญ์ ์ค์น๋ ํจํค์ง ๋ณด๊ธฐ
npm list -g
์ ์ญ์ ์ค์น๋ ํจํค์ง ์ค ์ ์ผ ์๋จ์ ์๋ ํจํค์ง๋ง ๋ณด๊ธฐ
npm list -g --depth=0
์ ์ญ์ ์๋ ํจํค์ง ์ ๋ฐ์ดํธํ๊ธฐ
npm update -g local-web-server
์ ์ญ์ ์๋ ํจํค์ง ์ญ์ ํ๊ธฐ
npm uninstall -g local-web-server
๐ ๋ฐํด๋ฅผ ๋ค์ ๋ง๋ค์ง ๋ง๋ผ!
React#
React ์ฑ ๋ง๋ค๊ธฐ#
npm install -g create-react-app- ์ ์ญ์ ์ค์นํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ.
npm install -g create-react-appmkdir my-appcd my-appcreate-react-app .- npx - ์์๋ก ํจํค์ง๋ฅผ ์ค์นํด์ ์ฌ์ฉํ๊ณ ์ง์ฐ๋ ์คํ ๋๊ตฌ.
npx create-react-app my-appcd my-appnpm startReact ์ฑ ์คํ#
npm run start
์ฝ๋ฉํ๊ธฐ#
public ๋๋ ํ ๋ฆฌ - static ์์์ด ์์นํ ๊ณณ.#
index.html
<div id="root"></div>์ด
root์์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ค์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
src ๋๋ ํ ๋ฆฌ - source ์ฝ๋๊ฐ ์๋ ๊ณณ.#
index.js
ReactDOM.render(<App />, document.getElementById('root'));
<App />์ปดํฌ๋ํธ๋ฅผroot์๋ฆฌ๋จผํธ๋ก ์ ๋ฌํ๊ฒ๋๋ค.
App.jsํด๋์คํ (ํด๋์คํ๊ณผ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ์๋๋ฐ ์ด ๊ฐ์ข๋ ํด๋์คํ์ผ๋ก์งํ)
import React from 'react';import logo from './logo.svg';import './App.css';
class App extends React.Component { render() { 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> <a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer" > Learn React </a> </header> </div> ); }}
export default App;โ๏ธ ๋ฐ๋์ ๋ฆฌ์กํธ๋ ๋ฐํํ ๋ ํ๋์ ํ๊ทธ๋ก ๊ฐ์ธ์ ธ ์์ด์ผ ํ๋ค.
๋ฐฐํฌํ๊ธฐ#
npm run build- ๋ฆฌ์กํธ ์ฑ์ ๋น๋ํด์คnpx serve -s build- ๋น๋ํ ์ฑ์ผ๋ก ๋ก์ปฌ ํธ์คํ
JSX#
๐ JSX๋ JavaScript๊ฐ ์๋๋ค!
JSX๋ก ์์ฑํ ์ฝ๋๋ create-react-app์ ์ํด JavaScript ์ฝ๋๋ก ์ปจ๋ฒํ ๋๋ค.
Hello World!#
import React from 'react';import './App.css';
class App extends React.Component { render() { return <div className="App">Hello World!</div>; }}
export default App;App class๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ํ์ฅํ๊ณ render ๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ค. (ํ์), ํด๋์ค ๋ด๋ถ ๋ฉ์๋์์ function ํค์๋๋ ์๋ต ๊ฐ๋ฅํ๋ค. (ES6)
Components ์ props#
์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ ๋ ์์ ํ ๋๊ฐ์ ์ปดํฌ๋ํธ๋ง ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, ํ๊ณ๊ฐ ์์ ๊ฒ์ด๋ค. ์ปดํฌ๋ํธ๊ฐ ํน์ ์์ฑ์ ๊ฐ์ง์ ๋ฐ๋ผ ๋ณ๊ฒฝํด์ค ์ ์๋๋ก props ๋ฅผ ํ์ฉํ ์ ์๋ค.
import React from 'react';import './App.css';
class Subject extends React.Component { render() { return ( <header> <h1>{this.props.title}</h1> {this.props.sub} </header> ); }}
class App extends React.Component { render() { return ( <div className="App"> <Subject title="WEB" sub="World Wide Web!" /> <Subject title="React" sub="For UI!" /> </div> ); }}
export default App;React Developer Tools#
์ปดํฌ๋ํธ ํ์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ#
App.js
import React from 'react';import Subject from './components/Subject';import Content from './components/Content';import TOC from './components/TOC';import './App.css';
class App extends React.Component { render() { return ( <div className="App"> <Subject title="WEB" sub="World Wide Web!" /> <Subject title="React" sub="For UI!" /> <Content text="HTML is FUN!" /> <TOC /> </div> ); }}
export default App;import React from 'react'; - ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์.
ํด๋น ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ import ์ ๋ช
์.
ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก export ์ ๋ช
์.
props ์ state#

props ๋ ์ธ๋ถ์์, ๋ด๋ถ๋ก ์ ๋ฌ. ์ธ๋ถ์์ ์ฌ์ฉํ ์ปดํฌ๋ํธ์ ์์ฑ์ ๊ธฐ์
ํ๋ฉด ๋ด๋ถ ์ปดํฌ๋ํธ์์ props ๋ก ์ ๊ทผํ ์ ์์. ์ฌ์ฉํ๋ ์
์ฅ์์ ์กฐ์.
state ๋ ๋ด๋ถ์ ์ํ ๊ฐ.
App.js
import React from 'react';import Subject from './components/Subject';import TOC from './components/TOC';import Content from './components/Content';import './App.css';
class App extends React.Component { constructor(props) { super(props); this.state = { subject: {title: 'WEB', sub: 'World Wide Web!'}, }; } render() { return ( <div className="App"> <Subject title={this.state.subject.title} sub={this.state.subject.sub} /> <Subject title="React" sub="For UI!" /> <TOC /> <Content text="HTML is FUN!" /> </div> ); }}
export default App;constructor : ์ปดํฌ๋ํธ๊ฐ ์คํ๋ ๋ ๊ฐ์ฅ ๋จผ์ ์คํ๋๋ ํจ์ ( state ๊ฐ์ ์ด๊ธฐํ)
ํด๋น ๊ฐ์ฒด ์์์ { this.state.subject.title } ์ผ๋ก ์ ๊ทผํ ์ ์์.
TOC ๊ฐ์ #
TOC.js
import React from 'react';
class TOC extends React.Component { render() { var lists = []; var data = this.props.data; var i = 0;
while (i < data.length) { lists.push( <li key={data[i].id}> <a href={'/content/' + data[i].id}>{data[i].title}</a> </li>, ); i = i + 1; }
return ( <nav> <ul>{lists}</ul> </nav> ); }}
export default TOC;TOC.js ์์ ์ธ๋ถ์์ data (๊ฐ์ฒด๊ฐ ๋ด๊ธด ๋ฆฌ์คํธ)๋ฅผ props ๋ก ์ ๋ฌ๋ฐ๊ณ , ํด๋น๋ฆฌ์คํธ์ ์์๋ค์ ์์ฐจ์ ์ผ๋ก lists ์ ๋ด์ ์ถ๋ ฅํ๊ฒ ๋ฐ๊พผ๋ค.
์ด ๋ ์ฌ๋ฌ ๊ฐ์ ๋ชฉ๋ก์ key ๋ฅผ ๊ฐ์ ธ์ผํ๋ค. key={data[i].id} ๊ฐ ํ์.
ํค๋ฅผ ๊ธฐ์ ํ์ง ์์ ๊ฒฝ์ฐ.

App.js
import React from 'react';import Subject from './components/Subject';import TOC from './components/TOC';import Content from './components/Content';import './App.css';
class App extends React.Component { constructor(props) { super(props); this.state = { subject: {title: 'WEB', sub: 'World Wide Web!'}, contents: [ {id: 1, title: 'HTML', desc: 'HTML is for information'}, {id: 2, title: 'CSS', desc: 'CSS is for Design'}, {id: 3, title: 'JavaScript', desc: 'JavaScript is for Interactive'}, ], }; } render() { return ( <div className="App"> <Subject title={this.state.subject.title} sub={this.state.subject.sub} /> <TOC data={this.state.contents} /> <Content text="HTML is FUN!" /> </div> ); }}
export default App;์ด๋ ๊ฒ ์ธ๋ถ์์ Contents ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
์ด๋ฒคํธ state , props , render() ํจ์#
React ์์๋ props ๋๋ state ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋ render() ํจ์๊ฐ ํธ์ถ๋๋๋ก ์ฝ์๋์ด ์๋ค. โ ํ๋ฉด์ด ๋ค์ ๊ทธ๋ ค์ง๋ค.
๋์ ์ผ๋ก ๋ณ์ ์ ์ด#
Subject.title ์ ํด๋ฆญํ์ ๋, this.state.mode ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค. ์ด ๋ Subject.title ์ <a> ํ๊ทธ๋ก ๊ฐ์ธ์ ธ ์๋ค.
onClick ์์ฑ์ผ๋ก ํด๋ฆญํ์ ๋ ์คํํ ํจ์(์ด๋ฒคํธ ํธ๋ค๋ฌ)๋ฅผ ์ ์ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ onClick ์ด ๋ฐ์ํ์ ๋, ํ๋ฉด์ด ์๋ก๊ณ ์นจ ๋๋ค. <a> ํ๊ทธ์ ๊ธฐ๋ณธ ๋์ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ.
...
<h1><a href="/" onClick={function(e){ console.log(e); // debugger; e.preventDefault();}}>{this.state.subject.title}</a></h1>
...โ๏ธ
debugger;๋ฅผ ์ฝ์ ํ๊ณ ์คํํ๋ฉด ํด๋น ์์น์์ ๋ฉ์ถฐ์ง๊ณ ๊ฐ๋ฐ์๋๊ตฌ์์ ํด๋น์์น์ ์์ค๋ฅผ ๋ณผ ์ ์์
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ํ๊ทธ์ ๊ธฐ๋ณธ์ ์ธ ๋์๋ฐฉ๋ฒ์ ๋ชปํ๊ฒ ๋ง๋ ๊ฒ์ด event ๊ฐ์ฒด์ preventDefault() ๋ผ๋ ํจ์์ด๋ค. ์ด๋ฅผ ํตํด ์๋ก๊ณ ์นจ๋๋ ํ์์ ๋ง์ ์ ์๋ค.
state ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋.
return ( <div className="App"> <header> <h1> <a href="/" onClick={function (e) { e.preventDefault(); this.setState({ mode: 'welcome', }); }.bind(this)} > {this.state.subject.title} </a> </h1> {this.state.subject.sub} </header> <TOC data={this.state.contents} /> <Content title={_title} desc={_desc} /> </div>);์ด๋ฒคํธ๊ฐ ์คํ๋์ ๋ ์คํ๋๋ function ๋ด๋ถ์
this์ ๊ฐ์ด ์๋ฌด๊ฒ๋ ์ธํ ๋์ด์์ง ์๋ค. โ this ๋ฐ์ธ๋ฉ ์ฌ์ฉํด์ผํจ. ํจ์ ์์this๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ ๊ฐ์ผ๋ก ์ค์ ํจ. (this=App)state๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ๋setStateํจ์๋ฅผ ์ฌ์ฉํด์ผ ํจ
React์์ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด state ๋ณ๊ฒฝ#
React์์๋ ์ปดํฌ๋ํธ์ state ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํด๋น ์ปดํฌ๋ํธ render ํจ์์ ํ์ ์ปดํฌ๋ํธ์ render ํจ์๋ฅผ ์คํํด reload ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ํ์ ์ปดํฌ๋ํธ์๋ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋ค๋ฉด ๋นํจ์จ์ ์ผ ์ ์๋ค.
์ด๋ฅผ ์ํด React.Component ์ shouldComponentUpdate ํจ์๊ฐ ์๋ค.
shouldComponentUpdate ๋ newProps ์ newState ๋ผ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๋ค. ์ฌ๊ธฐ์ newProps ๋ ์ปดํฌ๋ํธ์ ๋ฐ๋ props ๊ฐ์ ๋งํ๋ค.
newProps ์ ์ด์ ๊ฐ์ ๋ํ๋ด๋ this.props.data ๋ฅผ ์ด์ฉํด props ๊ฐ ๋ฐ๋์์๋๋ง ํด๋น ์ปดํฌ๋ํธ์ render ํจ์๋ฅผ ํธ์ถํ๊ฒ ํ ์ ์๋ค. (๋์ด ๊ฐ์ผ๋ฉด false ๋ฆฌํดํ๊ณ ๋์ด ๋ค๋ฅด๋ฉด true ๋ฅผ ๋ฆฌํดํจ์ผ๋ก ๊ฐ๋ฅ)
๊ทธ๋ฐ๋ฐ ๋ง์ฝ state ์ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ด ์์ ๊ฒฝ์ฐ์, ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์๋ณธ์ ๋ณ๊ฒฝํ๋ ํจ์๋ฅผ ํตํด state ๋ฅผ ์
๋ฐ์ดํธํ๊ฒ ๋๋ฉด(์๋ฅผ ๋ค์ด, ๋ฐฐ์ด์ push ํจ์๋ ์๋ณธ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ค.) ์๋ณธ์ด ์์ ๋์๊ธฐ ๋๋ฌธ์ newProps ์ this.props.data ๋ ๊ฐ์ ์๋ฐ์ ์๊ณ , ๋ฐ๋ผ์ shouldComponentUpdate ํจ์๋ฅผ ํตํ ์กฐ์์ด ๋ถ๊ฐ๋ฅํด์ง๊ณ ์ด๋ ์ฑ๋ฅ ๊ฐ์ ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๋ฐฐ์ด์์๋ push ํจ์ ๋์ concat , ๊ฐ์ฒด์์๋ Object.assign ํจ์ ๋ฑ์ผ๋ก ์๋ก์ด ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ก state ๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ผ๋ก shouldComponentUpdate ํจ์๋ฅผ ํตํ ์กฐ์์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์๋ค.