React ๊ณต์ ๋ฌธ์ ๋ค์ ์ฝ๊ธฐ (1. Main concepts)
Main Concepts
์ฒ์ React๋ฅผ ์์ํ ๋ ๊ฑฐ์ ์ดํด ๋ชปํ๊ณ practice ์ ๋๋ง ์ฐธ์กฐํ์ ๋ฏ ์ถ์ด์ ๋ค์ ์ฝ์ด๋ณด์๋ค. ๊ฐ๋ ์ ์ด๋ฒ์ ๋ช ํํ ํ๋ค๊ฑฐ๋ ์ฒ์ ๋ค์ด๋ณธ ๊ฒ๋ค์ ์ ๋ฆฌํด๋ณด์๋๋ฐ, Main concept์์๋ ๊ฝค๋ ๋ง์๋ค. ์ด๋ฒ ๊ธฐํ๋ก ํด๋น ์ ๋ฆฌ ๊ธ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณด๋๋ก ํด์ผ๊ฒ ๋ค ๐
Introducing JSX
React๋ ๊ธฐ์กด์ html, js ์ ๊ฐ์ด ๊ธฐ๋ฅ ๋ณ๋ก ๋ฌธ์๋ฅผ ๋๋๋ ๋ฐ์์ ํ ์ปดํฌ๋ํธ ๋จ์๋ก ๋๋๊ฒ ํจ์ผ๋ก์จ js, html(jsx), css๋ฅผ ์ปดํฌ๋ํธ ๋จ์๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํ์๋ค.
JSX์ ๋ด๋ถ์ ๋ณ์๋ค์ ๋ ๋ ์์ ์ ์ด๋ฏธ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝ ๋๋ฏ๋ก XSS ๊ณต๊ฒฉ์ ํผํ ์ ์๋ค.
Rendering Elements
React๋ก ๋ง๋ค์ด์ง ์ดํ๋ฆฌ์ผ์ด์ ์ ํ๋์ root DOM ๋ ธ๋๋ฅผ ๊ฐ์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ด DOM ๋ ธ๋์ React element๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ํตํด render๋๋ค.
ReactDOM.render(element, document.getElementById('root'));
React ์์๋ค์ ๋ถ๋ณ์ ์์๋ค์ด๋ค. ๋ฐ๋ผ์ UI๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ์๋ก์ด ์์๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
Components and Props
์ปดํฌ๋ํธ๋ props๋ผ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ React ์์๋ฅผ ๋ฐํํ๋ JS ํจ์์ด๋ค.
React ์์์ ์๋ฌธ์๋ก ์์ํ๋ tag๋ค์ ๋ชจ๋ DOM tag๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์, ์ปดํฌ๋ํธ๋ ๋๋ฌธ์๋ก ์์ํด์ผ ํ๋ค.
์์ ํจ์(pure function)๋ input์ ๋ณํ์ํค์ง ์๊ณ input์ ๋ํด ํญ์ ๋๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
๊ทธ๋ฆฌ๊ณ React์ ์ปดํฌ๋ํธ๋ค์ ๋ชจ๋ ์์ ํจ์์ฌ์ props๋ฅผ ๋ณํ์ํค์ง ์๋๋ค.
State and LifeCycle
React๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋๋ฐ ํน์ React Element๊ฐ DOM์ ์ฒ์์ผ๋ก ๋ ๋๋๋ ๊ฒ์ mounting์ด๋ผ๊ณ ํ๊ณ , ํด๋น Element๊ฐ DOM์์ ์ง์์ง๋ ๊ฒ์ unmounting์ด๋ผ๊ณ ํ๋ค. mounting, unmounting ์ ์ฌ์ฉ์๋ ํน์ ๋์์ ์ํํ๊ธฐ ์ํด์ lifecycle method๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- componentDidMount : mount ์ ๋์
- componentWillUnmount : unmoount ์ ๋์
๐ก state์ ๋ํด ์์๋ฌ์ผ ํ ๊ฒ
- state๋ฅผ ์ง์ ์์ ํ ์ ์๋ ๊ฒ์ constructor์์ ๋ฟ์ด๋ค.
- state๋ ๋๊ธฐ์ ์ผ๋ก ๊ฐฑ์ ๋๋ค.
- ๋ฐ๋ผ์ ์ด์ state๋ props๋ฅผ ๋ฐ๊ณ ์ถ๋ค๋ฉด setState์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
this.setState((state, props) => ());
- ๋ฐ๋ผ์ ์ด์ state๋ props๋ฅผ ๋ฐ๊ณ ์ถ๋ค๋ฉด setState์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- object state์ ๊ฒฝ์ฐ ํน์ ์์ฑ๋ง ์ ๋ฐ์ดํธํด๋ ์๋์ผ๋ก mergeํด์ค๋ค.
Handling Events
์ด๋ฒคํธ๋ฅผ ๋ค๋ฃจ๋ ๋ฐ์ ์์ด์ React๊ฐ DOM์์์ ๋ค๋ฅธ ์ ์
- camelCase๋ฅผ ์ด๋ค.
- string์ด ์๋ function์ ๋๊ธด๋ค.
- event๋ฅผ ๋ง์ผ๋ ค๋ฉด return false;ํ๋ ๊ฒ์ด ์๋๋ผ event.preventDefault();๋ฅผ ์ํํ๋ฉด ๋๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ด๋ฒคํธ ์์ฑ์์ ์ง์ ์ ์ํ๋ ๋ฐฉ์์ ๊ด์ฐฎ์ง๋ง, ๋ง์ฝ ํด๋น ํธ๋ค๋ฌ ํจ์๊ฐ props๋ก ํ์ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋๋ค๋ฉด ํ์ ์ปดํฌ๋ํธ ๋ํ ๊ณ์ํด์ re-rendering ๋๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
const Parent = () => {
const handleClick = () => {};
return (
<Child onClick={() => handleClick()} />
// () => handleClick(); ์ด ๋ ๋๋ง ์๋ง๋ค ๋ณ๊ฒจ๋๋ฏ๋ก ํ์ ์ปดํฌ๋ํธ๊น์ง ์ฌ๋ ๋๋ง
);
}
Lists and Keys
React element์ list๋ฅผ rendering ํ ๋๋ ๊ฐ item์ด ๋ฐ๋๋ ๊ฒ์ ์ฝ๊ฒ ํ์ ํ๊ธฐ ์ํด string type์ key ์์ฑ์ด ํ์ํ๋ค. key๋ globally uniqueํ ํ์๋ ์์ง๋ง, sibiling๋ค ์ฌ์ด์์(๊ฐ์ level์์)๋ uniqueํด์ผ ํ๋ค.
- key์ index๋ฅผ ์ฌ์ฉํ์ ๋ ์ฑ๋ฅ์ ํ (Index as a key is an anti-pattern)
Index as a key is an anti-pattern
So many times I have seen developers use the index of an item as its key when they render a list.
robinpokorny.medium.com
Composition vs Inheritance
class๊ฐ ์๋๋ฉด ์์์ด๋ผ๋ ์ฅ์ ์ ์ฌ์ฉํ์ง ๋ชปํ๋ค. ํ์ง๋ง children์ props๋ก ๋๊ฒจ์ฃผ๋ composition์ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฅผ ๊ทน๋ณตํ ์ ์๋ค.
Thinking in react
React๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๊ตฌํํ๊ณ ์ ํ ๋
- ์ฐ์ ์ปดํฌ๋ํธ ๋จ์๋ก UI๋ฅผ ๋๋์.
- ์ปดํฌ๋ํธ์ ๋จ์๊ฐ ์ ๋งคํ๋ค๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ๋ ์ฌ๋ ค๋ณด์. ์ปดํฌ๋ํธ๋ ํ๋์ ์ฑ ์์ ๋๊ณ ํ๋์ ์ผ๋ง ํ๋ค.
- ์ ์ ์ธ ํ์ด์ง๋ฅผ ๋จผ์ ๋ง๋ค์.
- state๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ ์ ์ ์ธ ํ์ด์ง๋ฅผ ๋จผ์ ๋ง๋ค์ด๋ณด์.
- ์ต์ํ์ State๋ฅผ ์ ์ํ์.
- State์ ์์น๋ฅผ ์ ํ์.
- ๋ฐ๋๋ก ํ๋ฅด๋ data flow๋ฅผ ๋ฃ์.