์ฌ๋ฌ๋ถ์ ์ด์ ๊ธฐ๋ณธ์ ์ธ ๋ฆฌ์กํธ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ค๋ฃฐ ์ ์์ต๋๋ค. ์ด๋ฒ ์ฅ์์๋ ์ํ ๊ด๋ฆฌ ์ฌํ ๋ด์ฉ์ผ๋ก ๋ฆฌ์กํธ ์ํ ๊ด๋ฆฌ ๋ชจ๋ฒ ์ฌ๋ก์ ์ ์ฉ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค. ๋ ๋์๊ฐ ๋ํ์ ์ธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจ๊ป ์์๋ณด๊ฒ ์ต๋๋ค.
App ์ปดํฌ๋ํธ๋ ES6 ์ปดํฌ๋ํธ๋ก ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํด๋์ค ๋ฉ์๋์์ ์ํ์ ๋ก์ง์ ์ฒ๋ฆฌํฉ๋๋ค. Table ์ปดํฌ๋ํธ๋ก ๋ง์ ํ๋กํผํฐ๋ฅผ props๋ก ๋๊ฒผ์ต๋๋ค. ์ด props๋ Table ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉํฉ๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก App ์ปดํฌ๋ํธ๋ Table ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ๋๊ณ ์๋์ง ๋ชจ๋ฆ ๋๋ค.
๋ฆฌ์คํธ ์ ๋ ฌ ๊ธฐ๋ฅ์ Table ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ๋ฉ๋๋ค. App ์ปดํฌ๋ํธ๋ Table ์ปดํฌ๋ํธ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์, ์ด ๊ธฐ๋ฅ์ Table ์ปดํฌ๋ํธ๋ก ์ฎ๊ธธ ์ ์์ต๋๋ค. ํน์ ์ปดํฌ๋ํธ์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ ํ์ ์ํ๋ฅผ ๋ฆฌํฉํฐ๋ง ํ๋ ํ๋ก์ธ์ค๋ฅผ ์ํ ๋์ด์ฌ๋ฆฌ๊ธฐ(lifting state) ๋ผ๊ณ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ App ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ์ง ์๋ ์ํ๋ฅผ Table ์ปดํฌ๋ํธ๋ก ์ฎ๊ธฐ๋ ค๊ณ ํฉ๋๋ค. ์ํ๋ฅผ ์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ก ์ฎ๊ธฐ๋ ์์ ์ ๋๋ค.
Table ์ปดํฌ๋ํธ์ ์ํ์ ํด๋์ค ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ES6 ํด๋์ค ์ปดํฌ๋ํธ๋ก ์์ ํด์ผ ํฉ๋๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์ ES6 ํด๋์ค ์ปดํฌ๋ํธ๋ก ๋ฆฌํฉํฐ๋ง์ ์ฝ์ต๋๋ค.
ํ์ฌ Table ์ปดํฌ๋ํธ๋ ๋น ์ํ ํจ์ํ ์ปดํฌ๋ํธ์ ๋๋ค.
{title="src/App.js",lang=javascript}
const Table = ({
list,
sortKey,
isSortReverse,
onSort,
onDismiss
}) => {
const sortedList = SORTS[sortKey](list);
const reverseSortedList = isSortReverse
? sortedList.reverse()
: sortedList;
return(
...
);
}
Table ์ปดํฌ๋ํธ๋ฅผ ES6 ํด๋์ค ์ปดํฌ๋ํธ๋ก ์์ ํ๊ฒ ์ต๋๋ค.
{title="src/App.js",lang=javascript}
# leanpub-start-insert
class Table extends Component {
render() {
const {
list,
sortKey,
isSortReverse,
onSort,
onDismiss
} = this.props;
const sortedList = SORTS[sortKey](list);
const reverseSortedList = isSortReverse
? sortedList.reverse()
: sortedList;
return(
...
);
}
}
# leanpub-end-insert
์ปดํฌ๋ํธ์ ์ํ์ ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ฑ์์ ์ด๊ธฐ ์ํ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
{title="src/App.js",lang=javascript}
class Table extends Component {
# leanpub-start-insert
constructor(props) {
super(props);
this.state = {};
}
# leanpub-end-insert
render() {
...
}
}
์ด์ App ์ปดํฌ๋ํธ์ ์ ๋ ฌ ๊ธฐ๋ฅ์ ํด๋นํ๋ ์ํ์ ํด๋์ค ๋ฉ์๋๋ฅผ Table ์ปดํฌ๋ํธ๋ก ์ฎ๊น๋๋ค.
{title="src/App.js",lang=javascript}
class Table extends Component {
constructor(props) {
super(props);
# leanpub-start-insert
this.state = {
sortKey: 'NONE',
isSortReverse: false,
};
this.onSort = this.onSort.bind(this);
# leanpub-end-insert
}
# leanpub-start-insert
onSort(sortKey) {
const isSortReverse = this.state.sortKey === sortKey && !this.state.isSortReverse;
this.setState({ sortKey, isSortReverse });
}
# leanpub-end-insert
render() {
...
}
}
App ์ปดํฌ๋ํธ์์ ์ฎ๊ธด ์ํ์ onSort()
๋ฉ์๋๋ฅผ ์ญ์ ํด์ผ ํฉ๋๋ค.
{title="src/App.js",lang=javascript}
class App extends Component {
constructor(props) {
super(props);
this.state = {
results: null,
searchKey: '',
searchTerm: DEFAULT_QUERY,
error: null,
isLoading: false,
};
this.setSearchTopStories = this.setSearchTopStories.bind(this);
this.fetchSearchTopStories = this.fetchSearchTopStories.bind(this);
this.onDismiss = this.onDismiss.bind(this);
this.onSearchSubmit = this.onSearchSubmit.bind(this);
this.onSearchChange = this.onSearchChange.bind(this);
this.needsToSearchTopStories = this.needsToSearchTopStories.bind(this);
}
...
}
Table ์ปดํฌ๋ํธ API๋ฅผ ๋ ๊ฐ๋ณ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. App ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ props๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด, Table ์ปดํฌ๋ํธ์์ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ง๋ญ์๋ค.
{title="src/App.js",lang=javascript}
class App extends Component {
...
render() {
# leanpub-start-insert
const {
searchTerm,
results,
searchKey,
error,
isLoading
} = this.state;
# leanpub-end-insert
...
return (
<div className="page">
...
# leanpub-start-insert
<Table
list={list}
onDismiss={this.onDismiss}
/>
# leanpub-end-insert
...
</div>
);
}
}
์ด์ Table ์ปดํฌ๋ํธ ๋ด๋ถ์์ onSort()
๋ฉ์๋์ ์ํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
{title="src/App.js",lang=javascript}
class Table extends Component {
...
render() {
# leanpub-start-insert
const {
list,
onDismiss
} = this.props;
const {
sortKey,
isSortReverse,
} = this.state;
# leanpub-end-insert
const sortedList = SORTS[sortKey](list);
const reverseSortedList = isSortReverse
? sortedList.reverse()
: sortedList;
return(
<div className="table">
<div className="table-header">
<span style={{ width: '40%' }}>
<Sort
sortKey={'TITLE'}
# leanpub-start-insert
onSort={this.onSort}
# leanpub-end-insert
activeSortKey={sortKey}
>
Title
</Sort>
</span>
<span style={{ width: '30%' }}>
<Sort
sortKey={'AUTHOR'}
# leanpub-start-insert
onSort={this.onSort}
# leanpub-end-insert
activeSortKey={sortKey}
>
Author
</Sort>
</span>
<span style={{ width: '10%' }}>
<Sort
sortKey={'COMMENTS'}
# leanpub-start-insert
onSort={this.onSort}
# leanpub-end-insert
activeSortKey={sortKey}
>
Comments
</Sort>
</span>
<span style={{ width: '10%' }}>
<Sort
sortKey={'POINTS'}
# leanpub-start-insert
onSort={this.onSort}
# leanpub-end-insert
activeSortKey={sortKey}
>
Points
</Sort>
</span>
<span style={{ width: '10%' }}>
Archive
</span>
</div>
{ reverseSortedList.map((item) =>
...
)}
</div>
);
}
}
์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์๋ํ๋์ง ํ์ธํ์ธ์. ์ฌ๋ฌ๋ถ์ ์ง๊ธ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ์ ์ผ ์ค์ํ ๋ฆฌํฉํฐ๋ง ๊ณผ์ ์ ํด๋์ต๋๋ค. Table ์ปดํฌ๋ํธ API๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ ๋ ฌ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๊ณ , ๊ด๋ จ ์๋ ์ํ์ ๋ฉ์๋๋ฅผ ์์ ์ปดํฌ๋ํธ์์ ์ด๋์์ผ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ณ๊ฒ ๋ง๋ค์์ต๋๋ค.
๋ฌผ๋ก ํ์ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ์ํ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ํ์ ์ปดํฌ๋ํธ์ ๋ด๋ถ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ์์๋ ๊ทธ ์ํ๊ฐ ํ์๋์ด์ผ ํ๋ค๋ฉด, ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ์ํ๋ฅผ ์ฎ๊ฒจ์ผ ํฉ๋๋ค. ๋ ๋์๊ฐ ์์ ์ปดํฌ๋ํธ์ ํ์ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ํ์ํ๋ค๊ณ ํด๋ด ์๋ค. ์ด ์ญ์ ํ์ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ์ฎ๊ฒจ์ผ ํฉ๋๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ๋ด๋ถ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ๋ ์ปดํฌ๋ํธ์ ๋ชจ๋ ํ์๋ฉ๋๋ค.
- [๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์] ๋ฆฌ์กํธ ์ํ ์ฎ๊ธฐ๊ธฐ
- [์ ์ ๋ธ๋ก๊ทธ] Redux ์ฌ์ฉ ์ ์์์ผ ํ ๊ฒ๋ค
์ง๊ธ๊น์ง setState()
๋ฉ์๋๋ก ์ปดํฌ๋ํธ ๋ด๋ถ ์ํ๋ฅผ ๊ด๋ฆฌํ์ต๋๋ค. ์ ์ฒด ์ํ ์ค ๋ถ๋ถ์ ์ผ๋ก ์
๋ฐ์ดํธํ ๊ฐ์ฒด๋ฅผ ํจ์์ ์ ๋ฌํ์ต๋๋ค.
{title="Code Playground",lang="javascript"}
this.setState({ foo: bar });
setState()
๋ ๊ฐ์ฒด ํ๋๋ง ์ทจํ์ง ์์ต๋๋ค. ํจ์๋ฅผ ์ ๋ฌํด ์ํ๋ฅผ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
{title="Code Playground",lang="javascript"}
this.setState((prevState, props) => {
...
});
์ ์ด๋ ๊ฒ ํด์ผ ํ ๊น์? ๊ฐ์ฒด๊ฐ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋นํ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ์ด์ ์ํ ๋๋ props์ ๋ฐ๋ผ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ด๋ถ ์ํ๋ก ์ธํด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํฉ๋๋ค. setState()
๋ฉ์๋๋ ๋น๋๊ธฐ์
๋๋ค. ๋ฆฌ์กํธ๋ setState()
๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ด๋ฅผ ์คํํฉ๋๋ค. setState()
๋ฉ์๋๊ฐ ํธ์ถ๋๋ ์ฌ์ด, ์ด์ state ๋๋ props๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
{title="Code Playground",lang="javascript"}
const { fooCount } = this.state;
const { barCount } = this.props;
this.setState({ count: fooCount + barCount });
fooCount
๊ณผ barCount
๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค. ๊ทธ๋ฆฌ๊ณ setState()
๋ฉ์๋๋ฅผ ํธ์ถํ ๋ state ๋๋ props์ ๋ฐ๋ผ ์ด๋ค ๊ณณ์ด ๋ณ๊ฒฝ๋๋ค๊ณ ํฉ์๋ค. ์ ํ๋ฆฌ์ผ์ด์
๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ํ ๊ฐ ์ด์์ setState()
๊ฐ ํธ์ถํด์ผ ํ๋ ์ผ์ด ์๊น๋๋ค. setState()
๋ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์, ์ด์ ์ํ ๊ฐ์ ์์กดํ ์ ์์ต๋๋ค.
setState()
๋ฉ์๋๋ state์ props๋ฅผ ์ฒ๋ฆฌํ๋ ๋น๋๊ธฐ ์ฝ๋ฐฑ ํจ์์
๋๋ค. setState()
๋ฉ์๋๋ ๋น๋๊ธฐ๋ก ์คํ๋ ๋ ์ด์ state์ props๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
{title="Code Playground",lang="javascript"}
this.setState((prevState, props) => {
const { fooCount } = prevState;
const { barCount } = props;
return { count: fooCount + barCount };
});
๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ด
์๋ค. setState()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์ ์์ ํด state์ props๋ฅผ ์์กดํ๊ฒ ๋ง๋ค๊ฒ ์ต๋๋ค. ๋์ค์ ๋ค๋ฅธ ๊ณณ๋ ์์ ํ ์ ์์ต๋๋ค.
setSearchTopStories()
๋ฉ์๋๋ ์ด์ ์ํ๋ฅผ ์์กดํจ์ผ๋ก setState()
๋ฉ์๋์์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ง๊ธ ํ์ฌ ์ฝ๋๋ ์๋์ ๊ฐ์ ๊ฒ์
๋๋ค.
{title="src/App.js",lang=javascript}
setSearchTopStories(result) {
const { hits, page } = result;
const { searchKey, results } = this.state;
const oldHits = results && results[searchKey]
? results[searchKey].hits
: [];
const updatedHits = [
...oldHits,
...hits
];
this.setState({
results: {
...results,
[searchKey]: { hits: updatedHits, page }
},
isLoading: false
});
}
์ํ ๊ฐ์ ๊ฐ์ ธ์ค์ง๋ง ๋น๋๊ธฐ๋ก ์ด์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด์ ์ํ๋ก ์ธํด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ํจ์๋ฅผ ๋ง๋ค์ด๋ด ์๋ค.
{title="src/App.js",lang=javascript}
setSearchTopStories(result) {
const { hits, page } = result;
# leanpub-start-insert
this.setState(prevState => {
...
});
# leanpub-end-insert
}
์ฌ๊ธฐ์ ๊ตฌํํ ๋ธ๋ก ์ ์ฒด๋ฅผ ํจ์ ์์ผ๋ก ์ฎ๊ธธ ์ ์์ต๋๋ค. this.state
์ prevState
์ผ๋ก ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค.
{title="src/App.js",lang=javascript}
setSearchTopStories(result) {
const { hits, page } = result;
this.setState(prevState => {
# leanpub-start-insert
const { searchKey, results } = prevState;
const oldHits = results && results[searchKey]
? results[searchKey].hits
: [];
const updatedHits = [
...oldHits,
...hits
];
return {
results: {
...results,
[searchKey]: { hits: updatedHits, page }
},
isLoading: false
};
# leanpub-end-insert
});
}
ํ ๊ฐ์ง ๋ ๊ฐ์ ํ ์ ์ด ์์ต๋๋ค. ์ฝ๋ ๊ฐ๋
์ฑ์ ๋์ด๊ธฐ ์ํด ํจ์๋ฅผ ๋ฐ์ผ๋ก ๋นผ๋ผ ์ ์์ต๋๋ค. ๊ฐ์ฒด์ ๋ํ ํจ์์ ์ฅ์ ์
๋๋ค. ์ด ํจ์๋ ์ปดํฌ๋ํธ ์ธ๋ถ๋ก ๋นผ๋ผ ์ ์์ง๋ง, ๊ณ ์ฐจ ํจ์๋ฅผ ๋ง๋ค์ด ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ ์ ์๊ฒ ํด์ผ ํฉ๋๋ค. API์์ ๊ฐ์ ธ์จ result
๋ฅผ ๊ฐ์ง๊ณ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋๋ก ๋ง์ด์ง์.
{title="src/App.js",lang=javascript}
setSearchTopStories(result) {
const { hits, page } = result;
this.setState(updateSearchTopStoriesState(hits, page));
}
updateSearchTopStoriesState()
๋ฉ์๋๋ ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์์
๋๋ค. ๊ณ ์ฐจ ํจ์๋ App ์ปดํฌ๋ํธ ์ธ๋ถ์์ ์ ์ํด๋ ๋ฉ๋๋ค. ํจ์ ์๊ทธ๋์ฒ๊ฐ ์กฐ๊ธ ๋ฌ๋ผ์ก๋ค๋ ์ ๋ง ์ ๋
ํฉ์๋ค.
{title="src/App.js",lang=javascript}
# leanpub-start-insert
const updateSearchTopStoriesState = (hits, page) => (prevState) => {
const { searchKey, results } = prevState;
const oldHits = results && results[searchKey]
? results[searchKey].hits
: [];
const updatedHits = [
...oldHits,
...hits
];
return {
results: {
...results,
[searchKey]: { hits: updatedHits, page }
},
isLoading: false
};
};
# leanpub-end-insert
class App extends Component {
...
}
setState()
๋ฉ์๋์์ ๊ฐ์ฒด ์ ๊ทผ ํจ์๋ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์์ ํด์ฃผ๊ณ ์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ๋์ฌ์ค๋๋ค. ๋ํ App ์ปดํฌ๋ํธ ์ธ๋ถ์์ ํ
์คํธ๋ฅผ ํ ์ ์์ต๋๋ค. ์ฆ ๋ฐ์ผ๋ก export ํ์ฌ ํ
์คํธ๋ฅผ ์งํํ ์ ์์ต๋๋ค.
setState()
๋ฉ์๋์์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ฆฌํฉํฐ๋ง ํฉ๋๋ค.- ์์กด๋ props ๋๋ state๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง
- ํ ์คํธ๋ฅผ ์ฌ์คํํ๊ณ ์ ๋ฐ์ดํธ๋์๋์ง ํ์ธํฉ๋๋ค.
๊ท๋ชจ๊ฐ ํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ด๋ฆฌ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ฆฌ์กํธ๋ ๋ฌผ๋ก ๋ง์ SPA ํ๋ ์์ํฌ๊ฐ ์ํ ๊ด๋ฆฌ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ต๊ทผ ๋ช ๋ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋ณต์กํด์ง์ ๋ฐ๋ผ ์ํ ์ ์ดํ๋ ๋ฌธ์ ๊ฐ ๋๋๋๊ณ ์์ต๋๋ค.
๋ฆฌ์กํธ๋ ๋ค๋ฅธ ์๋ฃจ์ ์ ๋นํด์ ์ด๋ฏธ ํฐ ๋ฐ์ ์ ์ด๋ค์ต๋๋ค. ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ์ปดํฌ๋ํธ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ API๊ฐ ๋ฐ๋์ ํ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ํ์ ์ํ ๋ณ๊ฒฝ ์ฌํญ, ์ปดํฌ๋ํธ ๋ ๋ฒจ์์ ํน์ ์์ค์ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ๊น์ง ์ฝ๊ฒ ํ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด๋ฏธ ๊ณ ๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ์ํ ๋ณ๊ฒฝ์ ํ์
ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. setState()
๋ฉ์๋๋ฅผ ํตํด ์ํ๋ฅผ ์กฐ์ํ๋ค๋ณด๋ฉด ๋ฒ๊ทธ๊ฐ ์๊ธธ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ ๊ฐ ํ์ํ ์ํ๋ฅผ ๊ณต์ ํ๊ฑฐ๋, ํน์ ๋ถํ์ํ ์ํ๋ฅผ ์ญ์ ํ๊ธฐ ์ํด์ ์ํ๋ฅผ ์ฌ๋ฌ๋ฒ ์ฎ๊ฒจ์ผ ํฉ๋๋ค. ๋ํ ํ์ ์ปดํฌ๋ํธ๊ฐ ์ข
์๋์ด ์๋ ๊ฒฝ์ฐ ์ํ๋ฅผ ์ฎ๊ฒจ์ผ ํ ๊ฒฝ์ฐ๊ฐ ์๊น๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์ต์์ ์ปดํฌ๋ํธ์์ ์์ฃผ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ๊ฒฝ์ฐ์๋ ์ ์ฒด ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ์ํ๋ฅผ ๋ ์ฎ๊ฒจ์ผ ํ ๊ฒ๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ ์ํ ๊ด๋ฆฌ๊ฐ ๋ฌธ์ ์
๋๋ค. ๊ทธ๋ฌ๋ ์ปดํฌ๋ํธ์ ๋ณธ๋ ๋ชฉ์ ์ UI๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์
๋๋ค.
์ด๋ฌํ ๋ชจ๋ ์ด์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ํ ๊ด๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ ๋ฆฝํ ์๋ฃจ์ ์ด ์์ต๋๋ค. ์ด ์๋ฃจ์ ์ ๋ฆฌ์กํธ์๋ง ํ์ฉ๋ ๊ฒ์ด ์๋๋ผ ํ ํ๋ ์์ํฌ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฌํ ์ ์ด ๋ฐ๋ก ๋ฆฌ์กํธ ์ํ๊ณ๋ฅผ ํ๋ถํ๊ณ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค์ด ์ค๋๋ค. ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๋ฆฌ๋์ค(Redux)์ ๋ชจ๋ธ์์ค(MobX)์ ๋ํด ๋ค์ด๋ดค์ ๊ฒ๋๋ค. ๋ ์ค ํ๋๋ฅผ ์ ํํด ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. react-redux ๋๋ mobx-react ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํด ๋ฆฌ์กํธ ๋ทฐ ๋ ์ด์ด์ ํตํฉ์ํฌ ์ ์์ต๋๋ค.
๋ฆฌ๋์ค์ ๋ชจ๋ธ์์ค๋ ์ด ์ฑ ์์ ๋ค๋ฃจ์ง ์์ต๋๋ค. ์ด๋ฏธ ์ฌ๋ฌ๋ถ๋ค์ ๋ฆฌ์กํธ ํ์ต ๋ฐฉ๋ฒ์ ์ค์ค๋ก ํฐ๋ํ์ ๊ฒ์ ๋๋ค. ์์ผ๋ก ๋ฆฌ์กํธ ์ํ๊ณ๋ฅผ ํํํ๋ฉฐ ๋ ๋๊ณ ๊น๊ฒ ๋ฐฐ์ธ ์ ์์ ๊ฒ์ ๋๋ค. ๋ฆฌ์กํธ๋ฅผ ์ถฉ๋ถํ ์ต์ํด์ง ๋ค์ ๋ฆฌ๋์ค๋ฅผ ์์ํ๊ธธ ๋ฐ๋๋๋ค. ๋ฆฌ๋์ค๋ก ๋์ด๊ฐ๊ธฐ ์ , ์ ์์ '๋ฆฌ๋์ค์ ๋ชจ๋ธ์์ค ๋ฐ๋ก ์๊ธฐ - ์ธ๋ถ ์ํ ๊ด๋ฆฌ ํ์ต ๋ฐฉ๋ฒ' ๊ธ๋ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋๋ค.
- [์ ์ ๋ธ๋ก๊ทธ] ์ธ๋ถ ์ํ ๊ด๋ฆฌ์ ํ์ต ๋ฐฉ๋ฒ
- [์ ์ ๋๋ฒ์งธ ์ถ๊ฐ ๋์] ๋ฆฌ์กํธ ์ํ ๋ค๋ฃจ๊ธฐ
{pagebreak}
6์ฅ์์๋ ์ฌํ ์์ค์ ๋ฆฌ์กํธ ์ํ ๊ด๋ฆฌ๋ฅผ ๋ฐฐ์ ์ต๋๋ค. ์ง๊ธ๊น์ง ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํด๋ด ์๋ค.
- ๋ฆฌ์กํธ
- ์ฐ์์์ ์ญํ ์ ๋ง๊ฒ ์ํ์ ์ปดํฌ๋ํธ๋ก ์ํ๋ฅผ ์ฌ๋ฐฐ์นํฉ๋๋ค.
setState()
๋ฉ์๋์์ ๊ณผ๊ฑฐ ์ํ๋ก ์ธํ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ธ๋ถ์์ ๋ณ๋ ํจ์๋ฅผ ๋ง๋ค์ด ์ธ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.- ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ธ๋ถ์์ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
์ค์ต ์ฝ๋๋ ๊นํ๋ธ ๋ฆฌํผ์งํ ๋ฆฌ์์ ํ์ธํ ์ ์์ต๋๋ค.