ํ
ํ๋ฆฟ ์ ์์ : Jbee
ํ
ํ๋ฆฟ : [gatsby-starter-bee](https://github.com/JaeYeo pHan/gatsby-starter-bee)
๋๋ฌด๋๋ ๋ฉ์ง ๋ฒ ์ด์ค ๋ง๋ค์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
-
React์ UI๋ฅผ ๊ตฌ์ฑํ๋ ์์๋ฅผ js ๋ด๋ถ์ ํฌํจ์์ผ ํ๋์ ์ปดํฌ๋ํธ๋ผ๊ณ ๋ถ๋ฆฌ๋ jsx๋ฅผ ์ฌ์ฉํจ. babel์ ํตํด React.createElement๋ก ์ปดํ์ผ ํ๋ค๊ณ ํจ
-
ReactDOM.render๋ ๋จ ํ๋ฒ๋ง ํธ์ถ์ด ๋๋ฉฐ, ReactDOM์ ํด๋น ์๋ฆฌ๋จผํธ์ ์์ ์๋ฆฌ๋จผํธ๋ค์์ ๋ณ๊ฒฝ์ด ๋๋ ๋ถ๋ถ๋ง์ ์ ๋ฐ์ดํธ ํ๋ค.
-
์ฌ๊ธฐ์ ์๋ฆฌ๋จผํธ๋ ์ปดํฌ๋ํธ์ ๋ค๋ฅด๊ณ , ์ปดํฌ๋ํธ์ ๊ตฌ์ฑ์์์ด๋ค.
function tick() { const element = ( <div> <h1>Hello, world!</h1> <h2>It is {new Date().toLocaleTimeString()}.</h2> </div> ) ReactDOM.render(element, document.getElementById('root')) } setInterval(tick, 1000)
์์ ๋ฉ์๋๋ฅผ setInterval๋ก ๋ฐ๋ณตํ์ฌ ์คํํ์ฌ ์ ์ฒด์ UI๋ฅผ render ์์ผ๋ ์ค๋ก์ง h2์ ํ ์คํธ๋ง ๋ณ๊ฒฝ๋๋ค.
-
-
ReactDOM.render์ ์ฌ์ฉ๋๋ ์๋ฆฌ๋จผํธ๋
<Welcome />
๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ก๋ ๊ฐ๋ฅํจ
- ReactDOM.render๋
<div>{word}</div>
์ ๊ฐ์ React ์๋ฆฌ๋จผํธ(jsx)๋ฅผ ๋ฐ๋๋ค. - ReactDOM.render์ ์๋ฆฌ๋จผํธ๊ฐ ์ ๋ฌ๋๋ฉด, React ์๋ฆฌ๋จผํธ ํธ๋ฆฌ(virtual dom)๊ฐ์์ฑ๋๊ณ , ์ค์ DOM์ ์์ฑํ๋ค(๋๋์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ด์๋ document.getElementById('root')์ ๋ด๋ถ DOM์ ์์ฑํ๋๊ฒ ๊ฐ์). ์ดํ์๋ ๋น๊ต, ์ ๋ฐ์ดํธ๋ฅผ ํจ
- ์๋ฆฌ๋จผํธ๋
<Welcome/>
๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ก ๋์ฒด๋ ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ์ปดํฌ๋ํธ๋ค์ ํ๋ ํน์ ์ฌ๋ฌ๊ฐ์ ์๋ฆฌ๋จผํธ ๋๋ ๋ ๋ค๋ฅธ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ฅผ return ํ๋ค. - ์ฒ์ ReactDOM.render ๋ก ์์ฑ๋ ์ดํ๋ก๋ ์ ์ฒด๊ฐ ์๋ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์งํํจ. ์ด๋ Lane : number์ด๋ผ๋ ๊ฐ์ ํตํด ๋์ ์ปดํฌ๋ํธ๋ฅผ ์ฐพ๋๊ฒ๊ฐ์
- ์ฒซ ์์ฑ ์ดํ setState๋ฅผ ํตํด ์ํ๊ฐ์ ๋ณํ๊ฐ ์๊ธด๋ค๋ฉด ์ ์ฒด๋ฅผ ์์ฑํ๋๊ฒ์ด ์๋ React๋ ๋ณ๊ฒฝ๋ ์์๋ฅผ ํจ์จ์ ์ผ๋ก ๋ฐ์ํ๊ธฐ ์ํด diff ์๊ณ ๋ฆฌ์ฆ์ ๊ท์น์ ๋ฐ๋ผ ์๋ก์ด virtual dom๊ณผ ์ด์ ์ dom์ ๋น๊ต๋ฅผ ํ๊ณ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋ชจ์์ ํ๋๋ก ๋ฌถ์ด์ ์ค์ DOM ํธ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธ ํจ
- ์๋ฆฌ๋จผํธ์ ํ์
์ด ์์ ๋ค๋ฅผ ๋,
<div> -> <span>
์๋ ํด๋น ์๋ฆฌ๋จผํธ์ ์์๋ค์ ๋ชจ๋ ๋ฒ๋ฆฌ๊ณ ์๋กญ๊ฒ ์์ฑํจ. ์ด ๋๋ฌธ์, unmount, mount๊ฐ ๋ค์ ํธ์ถ๋๋ ๊ฒ - ์๋ฆฌ๋จผํธ์ ํ์ ์ด ๊ฐ์ ๋, ๋ณ๊ฒฝ๋๋ prop๋ง ๋ฐ๋
- ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ๋, ๋ณ๊ฒฝ์ด ์๋ prop๋ง ์ ๋ฐ์ด๋ ๋จ. ์ด๋ componentDidUpdate ํธ์ถ๋จ (์ด๊ฑฐ๋ hook์์ ์กฐ๊ธ ๋ฐ๋๊ฒ๊ฐ์)
- ์์์ ๋ํด์๋ key๋ฅผ ๊ธฐ์ค์ผ๋ก
- ์๋ฆฌ๋จผํธ์ ํ์
์ด ์์ ๋ค๋ฅผ ๋,
- React์์์ ์ปดํฌ๋ํธ๋ค์ ์์ ์ด ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ ์ปดํฌ๋ํธ์ props๋ก ๋ฐ์๊ฒ์ธ์ง, ์์ฒด state์ธ์ง ์์ง ๋ชปํ๋ค. ์ค๋ก์ง ์์ ์ด ๋ฐํํ๋ ์ปดํฌ๋ํธ ํน์ ์๋ฆฌ๋จผํธ๋ค์๊ฒ ์ด๋ ํ ์์ฑ์ ์ ๋ฌํ ๊ฒ์ธ์ง์๋ง ์ง์คํ๊ณ , ๋ณํ๋ฅผ ์ค๋ค.
์ด๋ฌํ ํน์ง ๋๋ฌธ์, React๋ ๋จ๋ฐฉํฅ์ ๋ฐ์ดํฐ ํ๋ฆ์ด๋ผ๊ณ ํ๋ค.
- HTML๊ณผ ํํ์์ด ํจ๊ป ์ฌ์ฉ๋์ด React Element๋ฅผ ์์ฑํ๋ ์. React.createlement๋ก ์ดํดํ ์ ์๊ณ ์คํ๋ ์ ์๋ ์ฝ๋๋ก ์ปดํ์ผ๋๊ธฐ ์ํ ๋ฐฉ๋ฒ
- React์์ ์์ฑํ
<Component id={1} />
๋ฑ๋ฑ๋ค์ React.createElement(์๋ฆฌ๋จผํธ, ์์ฑ, ์์๋ค) ์ผ๋ก ์ปดํ์ผ ๋์ด ์๋๋๋ค - ์ฒซ๋ฒ์งธ ์๋ฆฌ๋จผํธ์์ ์๋ฌธ์๊ฐ ์ ๋ฌ๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ div, span๋ฑ์ ํ๊ทธ๋ค์ด๋ฉฐ ๋๋ฌธ์์ด๋ฉด ์ฌ์ฉ์๊ฐ ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ ์ง์นญํ๊ฒ ๋๋ค
- ์ปดํ์ผ ๋จ๊ณ์์ ์ฌ์ฉ์๊ฐ ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ ์ฐพ๊ธฐ ๋๋ฌธ์, ํด๋น ์ค์ฝํ ๋ด์์๋ import ๋์ด ์๊ณ ์๋ ์ํ์ฌ์ผ ํ๋ค.
- createElement๋ํ, ์ปดํ์ผ ๋จ๊ณ์์ ์ฐพ๊ธฐ ๋๋ฌธ์ React๋ฅผ import ํด๋์์ผ ํ๋ค.
- ํํ์์ ๊ฒฝ์ฐ ์์ Component์ฒ๋ผ ์์ฑ์ ์ง์ ์ ๋ฌํ ์์์ง๋ง, for๋ if ๊ฐ์ ๊ตฌ๋ฌธ์ ์ง์ ์ ๋ฌ๋ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ์์ ์ ์ํํ๊ณ ํด๋น ์์ฑ์ ์ ๋ฌํ๋ React.createElement๋ก ์ปดํ์ผ๋๋ return๋ฌธ์ ์์ฑํ๋๊ฒ์ด๋ค.
class๊ฐ ์๋ ํจ์ํ ์ปดํฌ๋ํธ์ React์ state์ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ์ ์ฐ๋์์ผ์ฃผ๋ ํจ์์ด๋ค.
- React๋ Hook ํธ์ถ์ ์ปดํฌ๋ํธ์ ์ด๋ป๊ฒ ์ฐ๊ด์ํค๋๊ฐ? https://ko.reactjs.org/docs/hooks-faq.html#how-does-react-associate-hook-calls-with-components
- React๋ ํ์ฌ ๋ ๋๋ง์ค์ธ ์ปดํฌ๋ํธ๋ฅผ ์ถ์ ํ๊ณ ์๋ค๊ณ ํจ ์ฝ๋๋ฅผ ๋ณด๋ ์ ๋ฐ์ดํธ๋๋ ์ปดํฌ๋ํธ๋ฅผ Lane(number ํ์ ) ์ด๋ผ๋ ๊ฐ์ผ๋ก ์ฐพ๋๊ฒ ๊ฐ์
- ๊ฐ ์ปดํฌ๋ํธ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ณ ์๊ณ , useState์ ๊ฐ์ hook์ด ์๋๋์์ ๋ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์ฐพ์์ ์คํํ๋๊ฒ ๊ฐ์
- React ์ดํ๋ฆฌ์ผ์ด์ ์์๋ ์ํ๊ฐ์ ํ๋์ key์ value ํ ์์ผ๋ก ๊ธฐ์ต์ ํ๋ค๊ณ ํจ
- react hook ์๋์๋ฆฌ์ ์์ ์์ ์ปดํฌ๋ํธ ๋ด๋ถ์ hook๋ค์ด ์์ฑ๋ ์์๋ก์ index๋ก ๊ธฐ์ตํ๋ ๊ฒ์ฒ๋ผ. ์๋ง ์์ ์์๋ ์๋นํ ์ผ๋ถ๋ถ๋ง ๊ตฌํ๋๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ถ์ ํ๋ key-value๋ ์์์ ์์๊ฒ ๊ฐ์
React
์์ ์ ์ญ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ hook
์ธ๋ฐ, ๋ชจ๋์ ๋ฐฐํฌํ ๋ ์ฌ์ฉ๋ ๋ฐฉ์์ด ์ธ์๊น์ด์ ๊ธฐ๋ก์ ๋จ๊น.
K?????F????
์์ฑ๋ context
์ ๋ฒ์๋ฅผ ๊ฒฐ์ ํ๋ Provider
๋ด๋ถ์ ์์นํ๋ ์์ ์ปดํฌ๋ํธ๋ค์ด ์ค๋ก์ง null
๋ง์ ๋ฐํํ๋๋ก ์ค์ ๋์ด์์
์ด ์ปดํฌ๋ํธ๋ค์ ReactElement
๋ฅผ ๋ฐํํ๋๊ฒ์ด ์๋๋ผ ํ๋์ ํจ์๋ก์ ํธ์ถ์ด๋์์ ๋, ์ ์ญ์ํ์ ์ด๋ ํ ์ํ๊ฐ์ ํ ๋นํ๋ ์ญํ ๋ก๋ง ์ํ๋จ.
์๊ฐํด๋ณด๋ ๊ทธ๋ฌํ ๋ฐฉ๋ฒ์ด React-Router
์ ๊ฐ์ด ์์ฃผ ์ฌ์ฉํ๋ ๋ชจ๋์์๋ ๊ฐ๊ณ ์๋ ํน์ง ๊ฐ์.
return (
<Router>
<Route path="/" component={Home} />
<Route path="/something" component={Something} />
</Router>
)
์ค์ ๋ก ReactElement
๋ฅผ ์์ฑํ๋ ์๋๋ผ Router Provider
๊ฐ ๊ด๋ฆฌํ๋ ์ ์ญ ์ํ์ ์ํ๊ฐ์ ์
๋ฐ์ดํธ ํ๋ ๋ก์ง๋ค์ด ๋ด๋ถ์ ํฌํจ๋์ด์๋ ์ฌ์ฉ์์ ์ ์ปดํฌ๋ํธ
์ ์ญ์ํ์ ์ต์ ์ํ๋ฅผ ์ ๊ธฐ ์ํด, ํด๋น ์ํ๊ฐ์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ค์ ๋ชจ๋ Provider
๋ด๋ถ์ ์์นํด์ผ ํ๋ ํน์ฑ์ ๊ณ ๋ คํ์์ ๋,
๋ง์ฝ, ์ด๋ฅผ ์ปดํฌ๋ํธ ํ์์ด ์๋๋ผ hook
ํ์์ผ๋ก ๋ชจ๋์ ์ ๊ณตํ๋๋ผ๋ฉด, ์ฌ์ฉํ๋ ์ฌ๋์ Provider
์ญํ ์ ํ๋ Router
๋ด๋ถ์, ์ ์ญ์ํ๋ฅผ ์
๋ฐ์ดํธ์์ผ์ฃผ๋ ๋ก์ง์ ์ค์ค๋ก ๋ง๋ค๊ณ ๊ทธ๊ฒ๋ค์ ๊ฐ๊ณ ์๋ ์ปดํฌ๋ํธ๋ค์ ๋ณ๋๋ก ์์ฑํด์ผ ํ์ ๊ฒ์ด๋ค.
์ฌ๋ฌ๊ณณ์ ํด๋น ๋ชจ๋์
hook
๋ค์ด ๋ฟ๋ ค์ง์๋ ์๊ณ , ๊ทธ ์ญํ ์ ์ํํ๊ธฐ ์ํ ์ปดํฌ๋ํธ๋ค์ด ๋ ์์ฑ๋ ์ ๋ ์๋ ์ํฉ
๊ทธ๋ฌํ๊ฒ์ ๋์ ํด์ฃผ๊ธฐ ์ํด ์ด๋ฌํ ๋ก์ง์ ๋ด์ฌํ๊ณ ์์ง๋ง, ReactElement
๋ ๋ฐํํ์ง ์๋ ์ฌ์ฉ์์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ชจ๋๋ก ๋ง๋ค์ด์ ์์ ๋ฌธ์ ๋ฅผ ๋์ ํด์ฃผ๋๋ก ํ๊ฒ ๊ฐ๋ค. ๋ํ, path
๋ render ๋ ์ปดํฌ๋ํธ
์ ๊ฐ์ด ํต์ฌ์ ์ธ ์์๋ง์ ์ฌ์ฉ์๊ฐ ์ง์ ํ๋๋ก ํ์ฌ, ๋ถ๊ฐ์ ์ธ ๋ก์ง์ ์์ฑํ ํ์ ์์ด ์ ์ธํ์ ์ปดํฌ๋ํธ๋ง์ ์์ฑํ์ฌ๋ ๋๋๋ก ํด์ค๊ฒ ์๋๊น?
Suspense๋ React์์ ์ฌ์ฉ๋๊ณ ์๋ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ์์ง ์ค๋น๋์ง ์์๋ค๋๊ฒ์ React์ ์๋ ค์ค ์ ์๋ ๋ฐฉ๋ฒ.
React-query์ ๊ฐ์ด ๋น๋๊ธฐ๊ณผ์ ์์ loading๊ณผ๊ฐ์ ์ํ๋ฅผ ์ก์์ ์๋๋ฐ, ์ด ๋์ ๋น๋๊ธฐ์์ ๋ค์ ์ผ๋ฐ Promise๋ฅผ ๋ฐํํ๋๊ฒ์ด ์๋๋ผ ์ํ, ๊ฒฐ๊ณผ, ์ค์ promise๋ ํด๋น promise์ ์ํ๋ฅผ ๋ณ์๋ก์ ํด๋ก์ ๋ก ๊ธฐ์ตํ์ฌ ๊ฐ์ ๋ฐํํ๋ ํจ์๋ฅผ ๋ฐํํ๋๊ฒ ๊ฐ์
promise์ resolve, reject ์ํ์ ๋ฐ๋ผ ํด๋ก์ ๋ก์ ์ฐธ์กฐ์ค์ธ ์ํ๋ณ์๋ ์ ๋ฐ์ดํธ์ํด
์ด ๋, ๋ง์ฝ ์ํ๊ฐ ์ฒ์์ pending์ด๋ผ๋ฉด throw๋ฅผ ํตํด ์ค๋จ์ํค๊ณ ํด๋น promise๋ฅผ ์๋ฌ์ ๊ฐ์ผ๋ก ์ ๋ฌํ์ฌ Suspense๊ฐ ํฌ์ฐฉํ์ฌ fallback ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋๊ฒ ๊ฐ์
์ค์ ๋ก, Suspense๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ ๋ด๋ถ์์ Promise์์ฒด๋ฅผ throw๋ฅผ ํตํด ์๋ฌ์ ๊ฐ์ผ๋ก ์ ๋ฌํ๋ฉด error๊ฐ ๋ฐ์ํ๋๊ฒ์ด ์๋, Suspense์ ์ง์ ํ fallback์ด ๋ฐํ๋๋๊ฒ์ ํ์ธํ ์ ์์
๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ throw๋ฅผ ํธ์ถํ์ฌ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์ค์ง์ํค๋๊ฒ ํต์ฌ์ธ๊ฒ ๊ฐ์. ๋ํ ๊ทธ throw ์์ฒด๋ฅผ Suspense๊ฐ ๊ฐ์งํ์ฌ fallback์ ๋ฐํํ๋๊ฒ๋
unmount๊ฐ ์๋ ์ค์ง์ mount ์กฐ์ฐจ๋ ๋์ง ์์
-
ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์ ์งํ๊ณ ๋ค์ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ ์๋ํจ
์ผ์ข ์ ๋น๋๊ธฐ ์์ ์ฒ๋ผ ์ค์งํ๊ณ ์ดํ๋ก ๋ฏธ๋ฃจ๋๊ฒ ๊ฐ์
-
๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ด ์ข ๋ฃ๋๋ฉด ์ค์ง๋์ด์๋ ์ปดํฌ๋ํธ์ ์์์ ์๋ Suspense์ ์ ๋ฌ๋ fallback์ ์ฐพ๊ณ ๊ทธ๊ฒ์ ๋ ๋๋งํจ
ํํ ...loading ๊ฐ์๊ฒ๋ค
import React from 'react' let resolve = null const promise = new Promise(res => { resolve = res }).then(() => { data = 'success data' }) function async() { if (!data) throw promise return data } export default function App() { return ( <div className="App"> <React.Suspense fallback={ <button onClick={() => { resolve?.() }} > resolve! </button> } > <InnerApp /> </React.Suspense> </div> ) } function InnerApp() { const data = async() return <>{data}</> }
codeSandbox์์ ์ ๋ง์ ๋ง๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ด
์ด์ฒ๋ผ ํ์ํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ ๋, ํด๋น ์ปดํฌ๋ํธ ์์ฒด์ ๋ ๋๋ง์ ์ผ์ ์ค๋จ์ํฌ ์ ์์
React์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์์ render ๊ณผ์ ์ค ๋ฐ์ํ ์๋ฌ๋ฅผ ํธ๋ค๋งํ ์ ์๋ ์ปดํฌ๋ํธ
๋ด๋ถ์ getDerivedStateFromError
์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ๊ณ ์๋ ์ปดํฌ๋ํธ ํ์์ ์กด์ฌํ๋ ์ปดํฌ๋ํธ ๋ด์์ ๋ฐ์ํ ์๋ฌ๋ฅผ ํฌ์ฐฉํ๊ณ , ์ค๋จ์ํจ ๋ค์ ์ง์ ํ fallback
์ ๋ ๋๋ง ํจ
mount๊ฐ ์๋๋ค๋ ์๋ฆฌ
try catch
์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์๋ฌ๋ฅผ ํธ๋ค๋งํ ์ ์๋?
์์ ๋งํ๋ ๊ฒ์ฒ๋ผ, ReactElement
๋ฅผ ์์ฑํ๋๋ฐ ์ ์ธํ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์ฌ์ฉํ ๋ try catch
๋ก๋ ์๋ฌ๋ฅผ ํธ๋ค๋งํ ์ ์์
return
์ ํตํด ๋ ๋๋ง ํ ๋, ReactElement
๋ฅผ ๋ฐํํ๋ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ค ์ฌ์ด์ฌ์ด์ try catch
๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์๊ฐ ์์
try catch
๋ ๋ด๋ถ์ ๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ์๋ฌ๋ฅผ ํธ๋ค๋ง ํ๊ธฐ ์ํจ์ด๋ผ๊ณ ํจ
์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ ๋ด๋ถ์์
try catch
๋ก ๋ค๋ฅธ๊ฒ์return
ํ๋๊ฒ์ ๋๋๊ฒ ๊ฐ๊ธด ํจ.
ErrorBoundary
๋ ์ฌ์ฉ์์ ์ด๋ฒคํธ(์ฌ์ค ์ด๋ฒคํธ๋ ๋น๋๊ธฐ๋๊น), ๋น๋๊ธฐ์์
๋ฑ ํ์ฌ ํ๊ฒฝ์์ ๋ฒ์ด๋๊ฒ ๋๋ค๋ฉด ์๋ฌ๋ฅผ ํธ๋ค๋งํ ์ ์๋ค๊ณ ํจ.
function App() {
const [handleContinue, handleMount, handleFetch, handleCancel] = useAsync()
return (
<div className="App">
<button onClick={handleMount}>Mount</button>
<button onClick={handleFetch}>Fetch</button>
<button onClick={handleContinue}>Continue</button>
<button onClick={handleCancel}>Cancel</button>
<InnerApp />
</div>
)
}
function InnerApp() {
const [render, setRender] = useState(false)
throw new Error()
return <div>innerApp</div>
}
export default App
์์๊ฐ์ ์ํฉ์์๋ InnerApp
์ ๋ ๋๋ง ๊ณผ์ ์์ ๋ฐ์ํ ์๋ฌ๋ก ์ค๋จ๋์์ ๋, ์์ App
์ ๋ ๋๋ง๊น์ง๋ ๋์ง ์๊ฒ๋จ.
ํ์ง๋ง
function App() {
const [handleContinue, handleMount, handleFetch, handleCancel] = useAsync()
return (
<div className="App">
<button onClick={handleMount}>Mount</button>
<button onClick={handleFetch}>Fetch</button>
<button onClick={handleContinue}>Continue</button>
<button onClick={handleCancel}>Cancel</button>
<ErrorBoundary>
<InnerApp />
</ErrorBoundary>
</div>
)
}
function InnerApp() {
const [render, setRender] = useState(false)
throw new Error()
return <div>innerApp</div>
}
export default App
์์๊ฐ์ด ErorrBoundary
๋ก ํ์์ ์ปดํฌ๋ํธ์์ ๋ ๋๋ง์ค ๋ฐ์ํ๋ ์๋ฌ์ ๋ํด ๋ฏธ๋ฆฌ ํฌ์ฐฉ์ ํ๊ณ ๊ทธ์ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํด์ค๋ค๋ฉด, App
์ ๋ค๋ฅธ ReactElement
๋ค์ ์ ์์ ์ผ๋ก ๋ ๋๋ง ๋๊ณ , ErrorBoundary
๋ด๋ถ์ ReactElement
๋ค๋ง ์ง์ ํ ์๋ฌ ์ ์ฉ ๋ ๋๋ง์ด ์งํ๋จ
์๋ฌ๊ฐ ๋ฐ์ํ์์ ๋ ์ ์ฒด UI
๊ฐ ๊นจ์ง๋๊ฒ์ด ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ ์ผ๋ถ๋ถ๋ง ๋์ฒดํ๋๋ก ๋์์ฃผ๋๊ฒ์ด ํฐ ๊ฒ ๊ฐ์
๊ทผ๋ฐ React Query
์ ๊ฐ์ ๋ชจ๋์ ์ฌ์ฉํ ๋์๋, ๋น๋๊ธฐ ์์
์ด์ฌ๋ ์๋ฌ๋ฅผ ์ ์ก๋๋ฐ?
React Query
๋ฑ์ ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์์
์ ๊ด๋ฆฌํ ๋, Promise
๊ฐ์ฒด๋ฅผ ์ฆ์ ๋ฐํํ๋๊ฒ์ด ์๋ ์ฌ๋ฌ ์ํ๋ฅผ ํด๋ก์ ๋ก์ ์ฐธ์กฐํ๋ ํจ์๋ฅผ ๋ฐํํ๋๊ฒ ์๋๊น ์ถ์
๋ฐ๋ผ์, ๋ฐ์ดํฐ์ ์์ฒญ, ์๋ฌ, ์ฑ๊ณต์ ํ๋์ ๊ฐ์ผ๋ก ๊ธฐ์ตํ๊ณ ์
๋ฐ์ดํธ๋ ๋๋ง๋ค ์ผ๋ฐ ํจ์ ๋ด๋ถ์์ throw
๋ฅผ ์ํค๊ธฐ ๋๋ฌธ์ ErrorBoundary
๊ฐ ์๋ฌ๋ฅผ ์ก์์ ์๋๊ฒ ์๋๊น?
throw
๋ ๋ ์ ๋ฌํ๋ ๊ฐ์ ๊ฐ์ฒด๋ก ํ๋ฉด ErrorBoundary
์ ์ ์ฐํจ์ ํฅ์์ํฌ ์ ์์
๊ฐ๊ฐ์ ์๋ฌ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ๊ณ ์ ํ ๋, ๊ทธ์ ๋ง๋
Fallback
์ปดํฌ๋ํธ๋ฅผ ์ ๋ฌํ์ฌgetDerivedStateFromError
์์ ๋ ๋ ์ด์ ์ํ๊ฐ์ ํ ๋น์ํฌ ์ ์์
- setTimeout ๊ณผ ๊ฐ์ ๋น๋๊ธฐ์์ ์ ์ํํ๊ณ ๋ค์ ๋จ๊ณ์ ์์ ์ ์คํํ๊ณ ์ ํ ๋ ๋ฌดํํ ์์ฑ๋ ์ ์๋ ์ฝ๋ฐฑ์ง์ฅ์ .then์ ํตํ ์ฒด์ด๋์ผ๋ก ํด์ ๊ฐ๋ฅ
- ๋น๋๊ธฐ ์์ ์ ์ํํ๊ณ ์ฑ๊ณตํ๊ฑฐ๋ ์คํจ์ ๋ํ ์ํฉ์ ํธ๋ค๋งํ๋๋ฐ ์ฉ์ดํจ
- React๋ง์ jsxํ์ผ์ ์ฌ์ฉํ๋ค๋ ํน์ง, ๊ธฐ์ค์ด ์๊ณ React๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋์ ๋ ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฒ๋๋์ ์์ ํ๋ ์์ํฌ์ ๋ ๊ฐ๊น๋ค๋ ์๊ธฐ๋ฅผ ํจ
- ๊ฐ๋ฐ์๊ฐ ์ ์ํ๋ ํ๋ก๊ทธ๋จ์ด ๊ฐ๊ณ ์๋ ๊ธฐ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํ์ํ ๊ธฐ๋ฅ์ ๋ถ๋ถ๋ถ๋ถ๋ณ ๊ฐ์ ธ๋ค ์ธ ์ ์๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ ํด์ ธ์๋ ๊ธฐ์ค, ๊ท์น, ํ๋ฆ์ด ์๊ณ ๊ทธ๋ฌํ ๊ธฐ๋ฐ์ ๋ฐํ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ํ๋ค๋ฉด ํ๋ ์์ํฌ
- https://dzone.com/articles/what-is-typescript-and-why-use-it
- ์ปดํ์ผ ๋จ๊ณ์์ ์์ ์ธ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋๋ค์ ๋ฏธ๋ฆฌ ์๋ ค์ค์ ๋ฐํ์ ๋ ๋ฐ์ํ์ง ์๋๋ก ์๋ฐฉ์ ํด์ค
- ๋ง์ฝ, ํ์ ์ ํ๋ ๊ณผ์ ์์ ํน์ ํจ์์ ์ด๋ ํ ํ์ ์ ๊ฐ์ด ์ ๋ฌ๋์ด์ผ ํ๋์ง ์ ์ ์์ด์, ๋ฒ๊ทธ๋ฅผ ์๋ฐฉํ ์ ์์
- ๊ธฐ๋ณธ์ ์ผ๋ก history ๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ์์ ๋ฐฉ๋ฌธ๊ธฐ๋ก์ ์ ๊ทผํ๊ณ , ์ด๋ํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด
- history.replace : ํ์ฌ ๊ฒ์ ์คํ์ ์ต์์์ ์์น๋ฅผ ๋์ฒดํจ
- history.push : ๋์ ๋ ๊ฒ์ ์คํ ์์ ํ๋๋ฅผ ๋ ์์
- history.go(์ซ์) : -์ด๋ฉด ํ์ฌ ๊ฒ์์คํ์์ ๋ค๋ก๊ฐ๊ธฐ +๋ฉด ํ์ฌ ๊ฒ์์คํ์์ ์์ผ๋ก์ด๋
- ๊ฒ์ ์๋์์ฑ์ ์ฌ์ฉํ ๋, ๋๋ฐ์ด์ฑ์ ์ฌ์ฉํ์ฌ setTimeout์ ๋น๋๊ธฐ๋ฅผ ์ด์ฉํด ์ต์ ์ ์์ฒญ์๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ก์ง์ ์คํ
-
์๋๋๋ก๋ผ๋ฉด, ์ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ๋ก ๋ฐ์์ค๊ณ , ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋กญ๊ฒ ์์ฒญ์ ํ๋ ๊ณผ์ ์ ์์ด์, ์ฌ์ฉ์๊ฐ ์ฒซ ํ๋ฉด์ ๋ณด๋๋ฐ ๋๋ฌด ์ค๋์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ํ์ ๋์ด
์ฒซ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ค๋ฉด, ํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ ์ดํ์ ๋ฐ์ดํฐ๋ ๋ณ๋์ ๋น๋๊ธฐ ์์ ์ผ๋ก ์งํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋๋ก ์ฒ๋ฆฌ
๋น๋๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์งํ์ค์ธ ์ด๋ฒคํธ๋ฅผ ์ผ์ ์ค๋จํ๊ณ , ๋ค๋ฅธ ํ๊ฒฝ์์ resolve๋ฅผ ํธ์ถํ์ฌ ์ค๋จ๋ ์ด๋ฒคํธ๋ฅผ ์ด์ด์ ์งํํ ์ ์์
- ์งํ์ค์ธ ์ด๋ฒคํธ์์, ๋๋จธ์ง๋ ๋์ค์ ์คํ์ํค๊ณ ์ถ๋ค ๋ผ๋ ๊ฒฝ์ฐ, Promise๋ฅผ ํตํด ์ธ์๋ก ๋ฐ์ resolve๋ฅผ ์ํ๋ ํ์ด๋ฐ์ ํธ์ถ์์ผ์ ๊ทธ ์ดํ์ ์งํ์ํฌ ์ ์์(React context๋ ์ ์ญ๋ณ์๋ก ๊ธฐ์ตํด์ ๋ค๋ฅธ ํ๊ฒฝ์์๋ ๊ฐ๋ฅ.)
- ํน์ ํ๋ก์ ํธ์์ a select๋ฐ์ค์์ ํน์ ์ต์ ์ ์ ํํ์ ๋๋ง b select ๋ฐ์ค๊ฐ ํ์ฑํ ๋๋ ์ํ์์ b select ์ ์ต์ ์ ์ ํํ์ ๋ a select๋ฅผ ์ด๊ธฐํ์ํค๊ณ ์ถ์๊ธฐ ๋๋ฌธ์, a select์์ ์ด๊ธฐํ ์ํค๋ ๋ก์ง ์ด์ ์ ์ค๋จํค๊ธฐ ์ํด ๋ก์ง๋ค์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๊ณ , b select๋ฅผ ํ์ฑํ์ํค๋ ์ต์ ์ ์ ํํ์์ ๋์๋ ์ฆ์ resolve์ํค๋๊ฒ์ด ์๋ b select ๋ฐ์ค์์์ ์ต์ ์ ์ ํํ์ ๋ resolve ์์ผ์ a select box์ ๋๋จธ์ง ์ด๋ฒคํธ๋ฅผ ์ด์ด์ ์งํํ๋๋ก ํ์์
- ๋ด ๋ธ๋ก๊ทธ
- ๋งํฌ
- ๋ทฐ์์๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธ ํ ์ ์๊ณ , ๊ทธ ์ ๋ฐ์ดํธ๋ ๋ชจ๋ธ์ ์์กดํ๋ ๋ค๋ฅธ ๋ชจ๋ธ์ด ์ ๋ฐ์ดํธ๋๋๋ฑ... ๋์ด์์
- ์ํ์ ๋ณํ๋ฅผ ์ฃผ๊ณ ์ ํ๋ฉด ์ด๋ค์ผ์ ํ๋์ง, ์ฐธ๊ณ ํ ๋ฐ์ดํฐ์ ์ ๋ณด๋ฅผ ํตํด ํ๋์ ์ก์ ์ ์์ฑํ๋ค.(ํํ action๊ณผ payload)
- ์์ฑ๋ ์ก์ ์ ๋์คํจ์ณ๋ก ๋๊ฒจ์ค๋ค. dispatch({type : ...})
- ๋์คํจ์ณ๋ ์ก์ ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ชจ๋ ์คํ ์ด์๋ํด ์๊ณ ์๊ณ , ์ก์ ์ด ๋์ด์ค๊ฒ๋๋ค๋ฉด ์คํ ์ด์ ์ก์ ์ ์ ๋ฌํด์ค๋ค.
- ์คํ ์ด๋ ๋์คํจ์ณ๋ก๋ถํฐ ๋ชจ๋ ์ก์ ๋ค์ ์ ๋ฌ๋ฐ๊ณ , ํ์ ์ ๋ฐ๋ผ ์ํํ ์ง ํ์ง ์์์ง ํน์ ์ด๋ค์์ผ๋ก ์ฒ๋ฆฌํ ์ง ๊ตฌ๋ถํ์ฌ ์ํ๊ฐ์ ์ ๋ฐ์ดํธํ๋ค.
- ๋ทฐ๋ ๊ทธ๋ฅ ์ ๋ฌ๋ฐ์ ์ํ๊ฐ์ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ๋ค.
- React๋ ๋ณ๊ฒฝ๋ ์์๋ฅผ ํจ์จ์ ์ผ๋ก ๋ฐ์ํ๊ธฐ ์ํด diff ์๊ณ ๋ฆฌ์ฆ์ ๊ท์น์ ๋ฐ๋ผ ์๋ก์ด virtual dom๊ณผ ์ด์ ์ dom์ ๋น๊ต๋ฅผ ํ๊ณ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง์ ํตํด ์ค์ DOM์ ์ต์ํ์ ์์ ์ ๊ฐํจ
- ์๋ฆฌ๋จผํธ์ ํ์
์ด ์์ ๋ค๋ฅผ ๋,
<div> -> <span>
์๋ ํด๋น ์๋ฆฌ๋จผํธ์ ์์๋ค์ ๋ชจ๋ ๋ฒ๋ฆฌ๊ณ ์๋กญ๊ฒ ์์ฑํจ. ์ด ๋๋ฌธ์, unmount, mount๊ฐ ๋ค์ ํธ์ถ๋๋ ๊ฒ - ์๋ฆฌ๋จผํธ์ ํ์ ์ด ๊ฐ์ ๋, ๋ณ๊ฒฝ๋๋ prop๋ง ๋ฐ๋
- ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ๋, ๋ณ๊ฒฝ์ด ์๋ prop๋ง ์ ๋ฐ์ด๋ ๋จ. ์ด๋ componentDidUpdate ํธ์ถ๋จ (์ด๊ฑฐ๋ hook์์ ์กฐ๊ธ ๋ฐ๋๊ฒ๊ฐ์)
- ์์์ ๋ํด์๋ key๋ฅผ ๊ธฐ์ค์ผ๋ก
- ์๋ฆฌ๋จผํธ์ ํ์
์ด ์์ ๋ค๋ฅผ ๋,
- memo๋ฅผ ์ฌ์ฉํ์ง ์์๋, ์ฌ์ฉํ์ง ์๋ ์์ฑ์ ์ํด ์์์ด rerendere๋์ด ๋ง์ ํ์์ ๋ณํ๊ฐ ์๋๊ฒ ๊ฐ์๋ณด์ฌ๋ ์์๊ฐ์ diff ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ฑ๋ฅ์๋ ํฐ ๋ฌธ์ ๊ฐ ์์
- ๋จ์ํ rerender๋ฅผ ์๋ฐฉํ๋๊ฒ์ด์ง, DOM ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ๋ ์ฑ๋ฅ์๋ ํฐ ์ฐจ์ด ์๋ค๊ณ ํจ. ํ์ง๋ง, render๋ฅผ ํ๋ค๋๊ฒ์ ์ด์ vdom๊ณผ render๋ vdom์ ๋น๊ตํ๊ธฐ ์ํ diff ์๊ณ ๋ฆฌ์ฆ์ด ํ๋ฒ ๋ ์คํ๋์ด์ผ ํจ
๋ฌผ๋ก , diff ์๊ณ ๋ฆฌ์ฆ์ด ๋งค์ฐ ํจ์จ์ ์ด๋ผ ํฐ ๋ฌธ์ ๋ ์๋์ง๋ง, ์ฐ๋ฆฌ๊ฐ React ๋ด๋ถ์์ ์์ฑํ ๋ก์ง๋ค์ด ๋ค์ ์คํ๋๋ค๋๊ฒ์ ์๊ธฐ๊ฐ ๋ค๋ฆ
document.write์ ๊ฐ์ด html์ ์ฆ์ ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ์์ด์(๊ทธ ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด?)
new Promise์ ์ธ์๋ก ์ ๋ฌ๋๋ ์ฝ๋ฐฑํจ์๋ ํ๋์ ์คํํจ์๋ก์ ํ๋ก๋ฏธ์ค์ ์คํ, ๊ฑฐ์ ์ ์๋ฏธํ๋ ๋๊ฐ์ง ์ธ์๋ฅผ ๋ฐ๋ ํจ์์ด๋ค. ์ด ์คํํจ์๋ Promise ๊ฐ์ฒด๊ฐ ๋ฐํ๋๊ธฐ ์ด์ ์ ๋จผ์ ์คํ์ด ๋๋ค.
๋๊ฒ, ์ด๋ ํ ๋น๋๊ธฐ๋ก ์งํ๋ ์์ ์ด ์๋ฃ๋๊ณ ๋ด๋ถ์์ resolve ํน์ reject๋ฅผ ํธ์ถํ์ฌ ์ดํ์ ๋ก์ง์ ๋ง์ดํฌ๋กํ์คํฌํ์ ๋๊ฒจ ์ด๋ฒคํธ๋ฃจํ๋ฅผ ํตํด ์ฝ์คํ์ ๋๊ฒจ์ง๋๋ก ํ๋ค.
await์ด ์๋ค๋ฉด try catch๋ก ์ก์ ์ ์๋ ์ด์ ๋, Promise ๋ด๋ถ์์ ๋ฐ์ํ throw๋ ํ๋์ reject์ ๋์ผํ๊ฒ ์๋๋์ด Promise๊ฐ ๊ฑฐ์ ๋์๋ค๋ ๊ฒ์, ํด๋น ์๋ฌ๋ ์ด๋ฏธ ๋น๋๊ธฐ๋ก์ try catch์ ์ํฅ๊ถ์ ๋ฒ์ด๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- ์คํํจ์ ์ฃผ์์๋
'์์์ try..catch'
๊ฐ ์กด์ฌํ๊ณ ์๊ณ , ์ค์ค๋ก ์๋ฌ๋ฅผ ์ก๊ณ , ์๋ฌ๋ฅผ ๊ฑฐ๋ถ์ํ์ ํ๋ผ๋ฏธ์ค๋ก ๋ณ๊ฒฝ์ํจ๋ค.(throw error -> reject)
- ๋น์ฐํ Promise ๋ด๋ถ์ setTimout ์์์ ๋ฐ์ํ ์๋ฌ๋ await ๋์ด์๋ try catch๋ผ๋ ์ก์ง ๋ชปํ๋ค.
setTimout์ด๋ผ๋ ๋ณ๋์ ๋น๋๊ธฐ ํ๊ฒฝ์์ ๋ฐ์ํ ์๋ฌ์ด๊ธฐ ๋๋ฌธ์ ๋ด๋ถ์ try catch๋ก ๊ฐ์ธ๊ณ catch ์ Promise์ reject๋ฅผ ํธ์ถํด์ค์ผ ํ๋ค.
๋ธ๋ผ์ฐ์ ๋ฅผ ๋ ๋๋งํ๋ ๊ณผ์ ๋ค ํ์ฑ, ๋ ๋ํธ๋ฆฌ ๊ตฌ์ถ, ๋ ์ด์์ ํ์ฑ, ํ์ธํธ, ์ปดํฌ์งํธ๋จ๊ณ (์ปดํฌ์งํฐ ์ค๋ ๋ ์์ )์ ํ๋์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ด๋ผ๊ณ ํ๋ค.
-
ํด๋์ค๋ช ์๋ํ ๊ณ ๋ฏผ์ ์ค์ผ ์ ์์
-
ํ์ฌ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๊ณ , ๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ ์์ ๋กญ๊ฒ ์คํ์ผ๋ง์ ํ ์ ์์
- ๋์ ์ธ ์คํ์ผ์ ์ํด ์ด์ฉ์ ์์ด ์ธ๋ผ์ธ์คํ์ผ์ ์ฌ์ฉํด์ผํ๋ ์ํฉ์ด ์๊ธด๋ค.
์ฌ๊ธฐ์ ์ธ๋ผ์ธ์คํ์ผ์ด ์ ๋ฌธ์ ๊ฐ ์์๊น๋ผ๋ ์๊ฐ์ ํด๋ณด์๋๋ฐ,
reflow
๊ฐ ๋ฐ์ํ์ฌ ๋ ์ด์์ ๊ณ์ฐ์ ๋ค์ ํ ๋ ์ธ๋ผ์ธ์ผ๋ก ์์ฑ๋๋ ์คํ์ผ์ ์ฌ๋ฌ ์คํ์ผ์ด ํฉ์ณ์ ธ์๋ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋๊ฒ์ผ๋ก ํ๋ฒ์ ๋ถ์ฌํ์ฌ ์ผ๊ด ๊ณ์ฐํ๋๊ฒ์ด ์๋๋ผ ์คํ์ผ์ ํ๋์ฉ ํ๋์ฉ ๋ฐ์ํ์ฌ ๊ฐ๊ฐ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์reflow
์ ๋น์ฉ์ด ๋น๊ต์ ๋ ํฌ๋ค๋๊ฒ ๊ฐ๋ค.
- ๋์ ์ธ ์คํ์ผ์ ์ํด ์ด์ฉ์ ์์ด ์ธ๋ผ์ธ์คํ์ผ์ ์ฌ์ฉํด์ผํ๋ ์ํฉ์ด ์๊ธด๋ค.
-
๋ณ๋์ ์คํ์ผ ํ์ผ์ ๊ด๋ฆฌํ ํ์๊ฐ ์์
- ๊ทผ๋ฐ ์๊ฐํด๋ณด๋ฉด css-in-js๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์คํ์ผ์ ๋ณ๋์ ํ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ import ํด ์ฌ์ฉํ๊ธด ํจ..
-
๊ฒฐ๊ตญ ์์กดํ๋ ์๋ก์ด ๋ชจ๋์ด ์ถ๊ฐ๋๋ ๊ฒ
-
css-in-css๋ฅผ ํตํด ์์ฑ๋์ด์๋ ํด๋์ค๋ฅผ ์ฆ์ ๋ฐ์ํ๋๊ฒ๊ณผ, ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ ์๋ก์ด ์คํ์ผ์ ์ฝ๊ณ ๊ณ์ฐํ์ฌ ๋ฐ์ํ๋๊ฒ์ ์ฐจ์ด๊ฐ ์๋ค๊ณ ํจ
- ์ด์จ๋ ๊ฒฐ๊ตญ ์คํ์ผ์ ์ ์ฉํ๊ธฐ ์ํด ์คํฌ๋ฆฝํธ๋ฅผ ํ๋ฒ ๋ ์ฝ๊ณ ๊ณ์ฐํ๊ณ ํด์ํด์ผ ํ๋ ์
๋ณ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ ์๋ ํ ์คํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ ๊ธฐ๋ฒ์ ์๋ฏธํ๋ค. A๋ผ๋ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ค๊ณ ํ์์ ๋, ์ค์ ์ฝ๋์ ์ฆ์ ๊ฐ๋ฐ์ ํ๋๊ฒ์ด ์๋ ๋ค๋ฅธ ์์๋ก ์งํ์ด ๋๋ค.
- ํ ์คํธ์ฝ๋์ A ๊ธฐ๋ฅ์๋ํ ํ ์คํธ ์์ฑ
- ํ ์คํธ ์คํ
- ํ
์คํธ ์ค๋ฅ
์์ง ๊ธฐ๋ฅ์ ๋ํ ์์ฑ์ด ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ์ค๋ฅ
- ๋ฑ ํ ์คํธ๋ฅผ ํต๊ณผํ ์์ค์ ์ฝ๋๋ฅผ ์์ฑ
- ํ ์คํธ ์คํ
- ํ ์คํธ ์ฑ๊ณต
- B ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ํด 1๋ฒ๋ถํฐ ๋ค์ ์งํ
-
๊ตฌํํ๊ณ ์ ํ๋ ๊ธฐ๋ฅ์ ํน์ง ๋ฐ ํต์ฌ์ ์ธ ๋ถ๋ถ๋ง์ ๊ณ ๋ คํ ์ ์๊ฒ ๋จ
ํ ์คํธ๋ฅผ ์ฑ๊ณต์ํค๊ธฐ ์ํ ์ต์ํ์ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ๋์ด, ๋ถํ์ํ ์ฝ๋๋ค์ ์์ฑ๋์ง ์์๊ฒ ๊ฐ์.
-
์ง์ ์ด๋ฒคํธ๋ฅผ ํธ์ถํ๋๋ฑ์ ํ ์คํธ๋ฅผ ํตํด ์ฌ์ฉ์ ์ ์ฅ์์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ๋จ.
-
๊ฐ๋ฐ์ ์๋ฃํ ๊ธฐ๋ฅ์ ๋ํด ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋๋ผ๋ ๋ก์ปฌํ๊ฒฝ์์ ์คํ์์ผ ์ง์ ํ์ธํ๋ํ์ ํ ์คํธ๋ ํ์์ ์ด๋ค. ํ์ง๋ง, ํด๋ฆญ ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ฑ์ ํ ์คํธํ๊ณ ์ ํ ๋, ๋ค์ ํ ์คํธํ๊ธฐ์ํด ์๋๋๋ก ๋์์์ผ ํ๋ ๋ฑ ๋ถ์์ ์ธ ์์ ๋ค์ด ์๊ธธ ์ ์๋๋ฐ, ํ ์คํธ์ฝ๋๋ ๊ทธ๋ด ํ์๊ฐ ์๋ค.
์ด์ ์ ์ฐ์ตํด๋ณธ๋ค๊ณ ์์ฑํ๋ ํ ์คํธ์ฝ๋๋ค์ ๋ช๋ช์ ์๋ชป๋, ์คํจํ ํ ์คํธ์ฝ๋์ธ๊ฒ ๊ฐ์.
- ์ปดํฌ๋ํธ์ ๋ด๋ถ๊ฐ ๋ฆฌํฉํ ๋ง์ด ๋ ๋, ํ ์คํธ์ฝ๋๊ฐ ๋ถ๊ดด๋จ
- ์ฌ์ฉ์์ ์ด๋ฒคํธ์ ๊ด๊ณ์์ด ๊ทธ๋ฅ ์ฒซ ๋ ๋๋ง์ด ์ ๋๋์ง? ํด๋ฆญํ์ ๋ ํธ์ถ์ด ๋๋์ง? ํ๋ ์์ํฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋น์ฐํ ํด์ฃผ๋ ์์
๋ค์ ํ
์คํธํจ.
์๋ฏธ์์ด ๋จ์ํ ์คํธ์ ๊ท๋ชจ๊ฐ ์ปค์ก์์.
์๋ฌด๋๋ 1๋ฒ๊ณผ ๊ฐ์ด ๋ฆฌํฉํ ๋ง์ ํ์์ ๋, ํ ์คํธ์ฝ๋๊ฐ ๊นจ์ง๋ค๋์ ์ ์น๋ช ์ ์ด์๊ณ ์ด๋ ์ด๋ค ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ์ปดํฌ๋ํธ ์์ฒด๋ฅผ ํ ์คํธํ๋๊ฒ์ด ์๋ ๋ด๋ถ์ ์์ ๊ธฐ๋ฅ๋ค ์์ฒด๋ฅผ ํ ์คํธํ์๊ธฐ ๋๋ฌธ์ด์๋๊ฒ ๊ฐ๋ค.
ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ชฉํ๋ฅผ ์๊ฐํ๊ณ ๋ค์์์ฑํด๋ด์ผํ ๊ฒ ๊ฐ๋ค. ์ฌ์ฉ์์ ์ ์ฅ์์ ์ด๋ ํ ํ์(์ด๋ฒคํธ)๋ฅผ ํ์์ ๋ ๊ฐ๋ฐ์๊ฐ ์๋ํ ๋๋ก ์๋๋๋์ง๋ฅผ ํ์ธํ์
์ฌ์ฉ์์ ์ ์ฅ์์ ๋์ ์ธ ์์๋ง(์ฌ์ฉ์์ ์ด๋ฒคํธ ํน์ ๋ฐ๋ณต์ ์ธ ๋ณํ ๋ฑ๋ฑ)์ ํ ์คํธํ๊ณ , ์์์์์ ์ง์คํ๊ธฐ๋ณด๋ค๋ ๊ฒฐ๊ณผ๊ฐ ์ฐธ์ธ์ง๋ฅผ ํ์ธํ๊ธฐ
import React from "react";
import { render } from "utils/test";
import TimerContainer from "./timerList";
import List from "components/list/list";
const initialData = [
{
name: "๋ฌด๋ฆ๋์",
src: "/img/island/island_04.png",
time: ["00:00", "06:00", "12:00", "18:00"],
endTime: "18:00",
lv: 400,
position: "๋ํญํด",
contType: "ISLAND",
},
{
name: "๊ธฐ์๋",
contType: "CO_OCEAN",
lv: "-",
src: "/img/ocean/ocean_01.png",
position: ["์๋ฅด๋ฐํ์ธ", "๋ฒ ๋ฅธ", "์ ๋์ธ "],
endPosition: "์ ๋์ธ ",
time: ["00:00", "12:00", "18:00"],
endTime: "18:00",
},
];
const expectData = [
{
name: "๋ฌด๋ฆ๋์",
src: "/img/island/island_04.png",
time: ["18:00"],
endTime: "18:00",
lv: 400,
position: "๋ํญํด",
contType: "ISLAND",
},
{
name: "๊ธฐ์๋",
contType: "CO_OCEAN",
lv: "-",
src: "/img/ocean/ocean_01.png",
position: ["์ ๋์ธ "],
endPosition: "์ ๋์ธ ",
time: ["18:00"],
endTime: "18:00",
},
];
// ํธ์ด์คํ
๋จ
jest.mock("components/list/list.tsx", () => (props: any) => (
<div data-testid={JSON.stringify(props.data)} />
));
describe("TimerContainer", () => {
afterEach(() => {
jest.clearAllMocks();
jest.restoreAllMocks();
});
it("์ปจํ
์ธ ์์ ์ข
๋ฃ๋์ง ์์ ์๊ฐ๋๋ง ์ ์ง ๋ฐ ๋น ๋ฅธ์์ผ๋ก ์ ๋ ฌ", () => {
const notification = jest.fn();
// mock ํจ์๊ฐ ๋๊ธฐ ์ ์ date ์บ์ฑ
const mockDateObject = new Date(2021, 1, 1, 17);
jest
.spyOn(global, "Date")
.mockImplementation(() => (mockDateObject as unknown) as string);
const { getByTestId } = render(
<TimerContainer data={initialData} notification={notification} />
);
expect(getByTestId(JSON.stringify(expectData))).toBeTruthy();
});
it("clear", () => {});
});
๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ธฐ ์ํด ํ
์คํธ ๋์ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ, ํน์ ๋ณํ๊ฐ ์ฆ์ ๊ฐ์ ๋ฐํํ๋ ๋ฉ์๋๋ค์ mocking
ํ์๋ค.
ํ
์คํธ๋ฅผ ์งํํ๊ณ , ์ฌ์ฉ์์ ์์ ์์ ๊ฒฐ๊ณผ๋ฌผ์ด ์ํ๋ ๊ฐ๊ณผ ๋์ผํ์ง true
์ฐธ์ธ์ง๋ง์ ํ์ธํ์๋ค.
- ์ผ๊ธํจ์์ ์ญํ ๋ก ํจ์๋ด๋ถ์์ ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจํจ์๊ฐ ๊ฐ๋ฅํ๊ณ , ํจ์์์ฒด๋ฅผ ์ธ์๋ก ๋ณด๋ผ ์ ๋ ์๋ค.
- ์ธ๋ถ์ ๋ฐ์ดํฐ๋ ์ ๋ ๋ณํ์ง ์๋ ๋ถ๋ณ์ฑ์ ๊ฐ๋๋ค
- ์์ฑ์ผ๋ก ์ ๋ฌ๋ ๊ฐ๋ค์ ์ ๋๋ก ์ง์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ, ์๋กญ๊ฒ ๋ณต์ฌ๋? ๊ฐ ๋ง์ ์ ๋ฐ์ดํธํ ์ ์๋ค.
- ํจ์ ๋ด๋ถ๋ก ์ ๋ฌ๋๋ ๊ฐ์ ์ฌ์ฉํ์ฌ ํจ์ ์ธ๋ถ์ ์ปจํ
์คํธ์ ์ํฅ์ ์ฃผ์ง ์๋ ์์ํ ํจ์์ด๋ค.
์ธ๋ถ์ ๋ณํ์ง ์๋ ์์๋ฅผ ์ฐธ์กฐํ์ฌ ์๋ก์ด ๊ฐ์ ๋ฐํํ๋๊ฒ์ ๊ด์ฐฎ๋ค๋๊ฒ ๊ฐ์
- ์ด ์ ์ ์์ด์, ๋ค์ ํผ๋๋๋์ ์ด ์๋๋ฐ
React
์์๋useEffect
์ ๊ฐ์ด ๊ณต๋ฌธ์์ ๋๋๊ณ ์ค๋ช ํ๊ธฐ๋ฅผ ์ฌ์ด๋์ดํํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํhook
์ด๋ผ๊ณ ์ค๋ช ํ๊ณ ์๊ณ , ํด๋น ํจ์ ์ธ๋ถ์ ์ปจํ ์คํธ์ ์ ๊ทผํ๋ ์ญํ ์ ์ํํ๋ค. ์ค๋ก์งreturn
๋ง ์ํํ๋ ์์ํจ์์ ๋ค๋ฅด๊ฒuseEffect
๋ฅผ ํตํดDOM
์กฐ์์ ํ๊ฑฐ๋ ์ธ๋ถ ์ปจํ ์คํธ์ ์ ๊ทผํ๋๋ฑ์ ํ์๊ฐ ๊ฐ๋ฅํด์ก๋ค..
์ฌ๊ธฐ์ React์ ํจ์ํ ์ปดํฌ๋ํธ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ์๋๋๊ฒ์ด ๋ณด์ฌ์ง
- ์ด ์ ์ ์์ด์, ๋ค์ ํผ๋๋๋์ ์ด ์๋๋ฐ
- ๋ด๋ถ์ ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ํ๋์ ๋ชฉ์ ์ ์ํํ๊ธฐ ์ํ ์ฌ๋ฌ๊ฐ์ ์ํ(์์ฑ), ๋ฉ์๋๋ค์ ํ๋๋ก ์บก์ํ ํ์ฌ ์ํ๋ฅผ ๋ณํ์ํฌ ์ ์๋ ๊ฐ์ฒด์งํฅ๊ณผ ๋ค๋ฅด๊ฒ ํจ์ํ์ ํจ์ ๋ด๋ถ์ ์ํ๋ฅผ ๊ฐ์ง์ ์๊ณ , ์ธ๋ถ์ ์ํ์ ๋ณํ๋ฅผ ์ฃผ์ด์๋ ์๋๋ค. ๋ด๋ถ์ ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค๋๊ฒ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ํ ํจ์๊ฐ ํธ์ถ๋ ๋ ๋ง๋ค ์ํ๊ฐ ์ด๊ธฐํ๋๋ ๋๋ฌธ์ด ์๋๊น ์ถ๋ค.
- ์ด ๋ํ ์๋ฌธ์ธ ์ ์ด,
useState
๋ฅผ ํตํด ๊ณ ์ ํ ์ํ๋ฅผ ๊ฐ์ง ์ ์๊ฒ ๋์๋ค.hook
์ ๋์ ์๋ฆฌ๋ฅผ ๊ณ ๋ คํด๋ณด์์ ๋, ํจ์ ์ธ๋ถ์ ์ปจํ ์คํธ์์ ๊ณต๋ฌธ์์ ์๊ฐ๋ ๊ฐ์ฒด ์๋ฃ๊ตฌ์กฐ์์ ์์๋๋ก ์ ์ฅ๋์ด์๋ ์ํ๊ฐ์ ์ ๋ฐ์ดํธํ๋์ ์ด ์์ํจ์์ ์ฌ์ด๋์ดํํธ๋, ์ํ๊ฐ์ ๊ฐ์ง ์ ์๋ค๋ ํน์ง๊ณผ๋ ๋ค๋ฅธ ๋ชจ์ต์ ๋ณด์ฌ์ค.
๋๋ถ๋ถ์ ๋์คํ๋ ์ด๋ ์ด๋น 60๋ฒ (์ด๋ฅผ 60fps) ํ๋ฉด์ ์๋ก๊ณ ์น๋ค๊ณ ํ๋ค.
๋ธ๋ผ์ฐ์ ๋ํ ๋ค๋ฅด์ง ์๋ค๊ณ ํ๋๋ฐ ์ด ํ์๊ฐ ์ฌ์ฉ์์๊ฒ ์์ด ์์ฐ์ค๋ฌ์ด ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ๋ค.
ํ์ง๋ง, ๋ง์ฝ ์์์ ํ ๋นํ ์ ๋๋ฉ์ด์ ์ด ๊ทธ 1/60์ด ๋ด์ ๋ชจ๋ ํด๊ฒฐ๋์ง ์์ผ๋ฉด ํ์ด์ง๊ฐ ํน์ ์ ๋๋ฉ์ด์ ์ด ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋๊ฒ์ฒ๋ผ ๋ณด์ฌ์ง๋ค.
๋ ๋๋ง์์ ๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ์ ๋ชจ๋ ๋ ๋๋งํ๋ก์ธ์ค์ ๋ฉ์ธ์ค๋ ๋์์ ์๋๋๊ธฐ ๋๋ฌธ์, ๊ธด ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ๋๋ฉ์ด์ ์ด ์คํ๋๋ค๋ฉด ์์ ์ด๋น 60๋ฒ์ ๊ฒ์ฐ์ด ์ค๋จ๋ ์ ์๋ค๊ณ ํ๋ค.
requestAnimationFrame
์ ์ด๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์์
์ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋๋์ด์ ๋ชจ๋ ํ๋ ์์ ์คํ๋๋๋ก ๋์์ค๋ค๊ณ ํ๋ค.
60fps๋ฅผ ์ ์งํ๋ ํ๋ฉด์ ์๋ก๊ณ ์นจ ์์ ์ด 1/60์ด ์ด์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ ์ ์ค๋จ๋์ด ๋๊ธฐํ์ง ์๋๋ก ๋๋๋๊ฒ ๊ฐ์
setInterval
์ด๋ setTimeout
๊ณผ ๊ฐ์ ๋ฐ๋ณต์ ์ธ ์ ๋๋ฉ์ด์
์ ์ฌ์ฉํ๊ณ ์ ํ ๋ ์งํ๋๋ ์ฝ๋ฐฑํจ์๊ฐ ํ๋ ์์ ์ข
๋ฃ์์ ์์๋ ์ ์์ด์ ๋๋ฝ๋ ์ ๋ ์๋ค๊ณ ํ๋ค.
requesetAnimationFrame
์ ์ฌ์ฉํ๋ฉด ํ๋ ์ ์์ ์์ ์คํ๋๋๋ก ๋ณด์ฅํด์ค๋ค๊ณ ํจ.
requesetAnimationFrame
๋ํ ๋น๋๊ธฐ๋ก ์์
์ด ์ฒ๋ฆฌ๋์ง๋ง, ๋งคํฌ๋กํ์คํฌ ํ๊ฐ ์๋ ๋ณ๋์ ์ ๋๋ฉ์ด์
ํ์ ์ ์ฅ๋์ด ์คํฌ๋ฆฝํธ์ ์งํ์ํฉ์ ์ํฅ์ ๋ฐ์ง์๋๊ฒ์ด ํต์ฌ์ธ๊ฒ ๊ฐ๋ค.
Vue
์ ํน์ง์ ๋น๊ต์ ์ ์๊ณ ์๋ React
์ ๋น๊ตํ์ฌ ์๊ฐํด๋ด
Vue
๋ MVVM
๋์์ธ ํจํด์ ๊ฐ๊ณ ์๊ณ , Model
, View
, ViewModel
์ ์ฝ์ด๋ผ๊ณ ํจ. Model
๊ณผ View
๋ ๋ค๋ฅธ ๋์์ธํจํด๊ณผ ๋์ผํ๊ณ , ViewModel
์ ๊ฒฝ์ฐ Vue Instance
๋ก ๊ตฌ์ฑ๋๋ View
์์ ์ฌ์ฉ๋๋ Model
์ ๋ฐ์ดํฐ๋ค์ View
์ ๋๊ฒจ์ฃผ๋ ์ญํ ์ ํ๊ณ , View
์ ๊ด๋ จ๋ ๋ก์ง๋ค์ ๊ด๋ฆฌํ๊ธฐ๋ ํจ.
Controller
๊ฐ์๊ฑด๊ฐ?
Vue
์์ template
์ด view
Vue instance
์์ data
๊ฐ model
, View instance
์ ๋๋จธ์ง๊ฐ ViewModel
์ธ๋ฏ ํจ.
React
์ hook
์ค useEffect
์ ๊ฐ์ด ํน์ ์ํ์ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ ์ดํ์ ์ฌ์ด๋์ดํํธ ์์
์ ์ฒ๋ฆฌํ๋๊ฒ์ watch
๊ฐ ๋์ ํ ์ ์์๊ฒ ๊ฐ์. ๋ค๋ง ๋ฐฐ์ดํ์์ด ์๋ ๋จ์ผ ์ํ๊ฐ์ key
๋ก ํ์ฌ ์๋๋๋๋ฏ ํจ.
React
์์๋ HTML
๊ณผ JS
๊ฐ ํจ๊ป ์์ฑ๋์ด ํ๋์ createElement
์ ์ญํ ์ ์ํํ๋ JSX
๋ฅผ ์ฌ์ฉํ์ง๋ง, Vue
๋ ํ๋์ ํ์ผ์ HTML
, CSS
, JS
๊ฐ ๋ชจ๋ ์ฌ์ฉ๋จ.
template
,css
,script
Vue Cli
๋ฅผ ์ฌ์ฉํ๊ฒ๋ ๊ฒฝ์ฐ, new Vue
๋ก ํ๋์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ๊ทธ ๋ด๋ถ๋ฅผ ๊ตฌ์ฑํ๋ ํ์์ธ๋ฏ ํจ. ์ดํ์ ์ปดํฌ๋ํธ๋จ์๋ export
๋๋ ๋จ์ผ ๊ฐ์ฒด๋ก ์งํ
๋จ ํ๋์ ์ธ์คํด์ค
new Vue({
render: h => h(App),
}).$mount('#app')
ReactDOM.render(
<App />
document.getElementById('root')
)
React
์ ReactDOM.render
๊ณผ ์ ์ฌํ๊ฒ ์๋๋๋๋ฏ ํจ.
React
์ ๊ฒฝ์ฐ ์์ ์์๋ค์ ๊ทธ๋๋ก ์์ฑํด, ์์์์๋ค์ ๊ฐ๋ ์ปดํฌ๋ํธ์ children
์์ฑ์ ์ฌ์ฉํ์ฌ ์ ์ฐํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์
Vue
์ ๊ฒฝ์ฐ, slot
์ด๋ผ๋ ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ slot
์ name
์์ฑ์ ๋ถ์ฌํ์ฌ 1๋1 ๋งค์นญ์ ํด์ค์ ์ ์ฐํ ์ปดํฌ๋ํธ๋ก ๋ง๋๋๊ฒ ๊ฐ์.
<template #main>
<p>๋ฉ์ธ ์ปจํ
์ธ </p>
<p>๋ฉ์ธ ์ปจํ
์ธ </p>
<p>๋ฉ์ธ ์ปจํ
์ธ </p>
</template>
components: {
"my-component": {
template: `
<slot name="main">๋ฉ์ธ์ปจํ
์ธ 1์ด ์์ต๋๋ค</slot>
`,
},
},
๊ด์ฐฎ์ ์ ์, slot
์ ๋งค์นญ๋๋ ์์๊ฐ ์๋ค๋ฉด ๋์ฒด๋๋ ๋ด์ฉ์ ์ง์ ํด์ค ์ ์์์.
๋จ์ฝ, pํ๊ทธ์ ๋ฉ์ธ์ปจํ ์ธ 3๊ฐ๊ฐ ์๋ค๋ฉด ๋ฉ์ธ์ปจํ ์ธ 1์ด ์์ต๋๋ค๊ฐ ๋ ๋๋จ
<div id="slot3">
<my-list :items="arr">
<template #item="{item : {id, text}}">
<li>{{id}}, {{text}}</li>
</template>
</my-list>
</div>
new Vue({
el: '#slot3',
data: {
arr: [
{ id: 1, text: 'banana' },
{ id: 2, text: 'apple' },
{ id: 3, text: 'grapes' },
],
},
components: {
'my-list': {
props: ['items'],
template: `
<ul>
<slot
name="item"
v-for="item in items"
:item="item"
>
</slot>
</ul>
`,
},
},
})
vue
๋ v-for
๋๋ ํฐ๋ธ๋ฅผ ํตํด React
์์์ .map
์ฒ๋ผ ์ฌ๋ฌ๊ฐ์ ์์์์๋ฅผ ์์ฑํ ์ ์๋๋ฐ, ์ด ๋์ ์ํฉ์์๋ v-slot
์ ์ฌ์ฉํ์ฌ ์ ์ฐํ๊ฒ ์ค๊ณํ๋๋ก ๋์์ ์ฃผ์์.
ํน์ดํ๋์ ์, ๋ฐฐ์ด์ ์์ฑ์ผ๋ก ์ ๋ฌํ๊ฒ๊น์ง๋ ๋น์ฐํ๋ฐ, ๋ฐ๋ณตํ์ฌ ์กฐํํ๋ ๋ฐฐ์ด ๋ด ๋จ์ผ ์์๋ฅผ ๋ง์น ์์์ปดํฌ๋ํธ์ slot
์ ๋งค์นญ๋ ์์๋ก ์ ๋ฌํด์ฃผ๋ ๋๋์ฒ๋ผ ์๋๋จ.
์๋ง template ํ๊ทธ์ ๋ด์ฉ์ด ๋งค์นญ๋ slot๊ณผ ๋์ฒด๋๋ฉด์ ์์ฑ์ ๊ณต์ ํ๋ค๋๊ฒ ์๋๊น ๋ผ๋ ์๊ฐ?
- ํํ์(
expression
)์ ๋ณ์ํ ๋น,*
+
์ ๊ฐ์ ์์๋ค์ ์๋ฏธํ๋ค. - ๊ตฌ๋ฌธ(
statement
)์ ํ๋ก๊ทธ๋๋ฐ์์ ์คํ ๊ฐ๋ฅํ ์ต์์ ๋ ๋ฆฝ์ ์ธ ์กฐ๊ฐ์ ์๋ฏธํ๋ค. - ์ปดํจํฐ๊ฐ ์คํ์ ํ๋๊ฒ์ ๊ตฌ๋ฌธ ๋จ์ ํ ๋น๊ณผ๊ฐ์๊ฒ์ ํํ์์ธ๋ฏ ํจ. ๋ฐ๋ผ์ ๋ชจ๋ ํํ์๋ค์ ๊ตฌ๋ฌธ์ ํฌํจ๋จ
es6
->es5
์ ๊ฐ์ด ํ๋์ ์ธ์ด๋ฅผ ๋ค๋ฅธ ์์ค์ผ๋ก ๋ณํํ๋๊ฒ์ ํธ๋์คํ์ผ- ์์ ๋ค๋ฅธ ์ธ์ด๋ก ๋ณํํ๋๊ฒ์ ์ปดํ์ผ
100
~500
์ํ์ฝ๋- type alias vs interface
ํฐ ์ฐจ์ด๋ก
interface
๋ ๋์ผํ ํค์๋๋ก ๋๋ฒ ์ ์ธ๋์์ ๋, ๋ณํฉ์ ํ์ง๋งtype alias
๋ ๊ทธ๋ ์ง ์์. ๋๋๋กinterface
์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ๋ฐฐ์ด๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ ๊ฐฏ์์ ์์น์ ๋ง๋ ํ์ ์ ๊ณ ์ ํ๋ ํํ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์type alias
๋ฅผ ์ฌ์ฉ - http header