๋ชจ๋ฐ์ผ ์ฌํ๋ฆฌ ๋๋ฒ๊น #
์์ดํฐ์ ๋งฅ๋ถ์ ์ฐ๊ฒฐํ๋ค.
์์ดํฐ์์ ๋๋ฒ๊น ํ๊ณ ์ ํ๋ ์นํ์ด์ง๋ฅผ Safari์ ๋์ด๋ค.
๋งฅ๋ถ์์ Safari๋ฅผ ์คํํ๋ค.
๊ฐ๋ฐ์์ฉ > iPhone > Safari ์น ํ์ด์ง ์ ํ

์์, ์ฝ์, ์์ค, ๋คํธ์ํฌ ๋ฑ ์ฌํ๋ฆฌ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ๋๋ฒ๊น ํ ์ ์๋ค.

Debugging Your iPhone Mobile Web App With Safari Dev Tools
๋ชจ๋ฐ์ผ ์ฌํ๋ฆฌ๋ฅผ ๋งฅ์ Chrome์์ ๋๋ฒ๊น ํ๊ธฐ#
๋ชจ๋ฐ์ผ Safari๋ฅผ ๋งฅ์ Chrome์์ ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ์ ๋ค์์ ์์๋ด์ผ๊ฒ ๋ค.
Jon Sadka - How to debug an issue in Chrome for iOS using remote debugging
๋ฆฌ์กํธ#
๋ฆฌ์กํธ๋ ๋ด๋ถ์ ์ผ๋ก ์ปดํฌ๋ํธ๊ฐ ๋ฐํํ๋ ์๋ฆฌ๋จผํธ๋ค์ ํธ๋ฆฌ ํํ๋ก ๊ด๋ฆฌํ๊ณ ํํํ๋ค.
์ด๋ฅผ Virtual-DOM์ผ๋ก ๋ถ๋ฅด๋๋ฐ, ์ด๋ JavaScript ์ผ๋ฐ ๊ฐ์ฒด์ด๋ค. (Plain Object)
๊ธฐ์กด VanillaJS๋ UI๋ฅผ ๋ช ๋ นํ์ผ๋ก ์์ฑํด์ผ ํ์ง๋ง, React๋ ์ ์ธํ์ผ๋ก UI๋ฅผ ์์ฑํ ์ ์๋ค.
์ปดํฌ๋ํธ#
์ปดํฌ๋ํธ๋ ๋ด๋ถ์์ ๊ด๋ฆฌํ๋ ์ํ ๊ฐ์ธ
state์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๋ด๋ ค ์ฃผ๋์์ฑ ๊ฐprops๋ฅผ ๊ฐ์ง๋ค.์ปดํฌ๋ํธ๋
state,props๊ฐ ๋ณ๊ฒฝ๋๋ฉดrender()ํจ์๊ฐ ์คํ๋์ด ํ๋ฉด์ ๊ฐฑ์ ํ๋ค.UI ๋ฐ์ดํฐ(์ํ๊ฐ๊ณผ ์์ฑ๊ฐ)๋ก ๋ทฐ๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ด ๋ฆฌ์กํธ์ ํต์ฌ์ด๋ค.
setState๋ ๋น๋๊ธฐ๋ก ๋์ํ๋ค.
๋ฆฌ์กํธ์ ๋ ๋๋ง ๊ณผ์ #
์ปดํฌ๋ํธ์ Props๋ State์ ๋ณ๊ฒฝ์ด ์์ ๋, ์ปดํฌ๋ํธ์ ์ด์ ์ํ ์๋ฆฌ๋จผํธ์ ์๋ก ๋ง๋ค์ด์ง ์๋ฆฌ๋จผํธ๋ฅผ ๋น๊ตํ๊ณ ์ค์ DOM์ ์ ๋ฐ์ดํธ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. ๋น๊ตํ์ฌ์ฐพ์ ๋ณ๊ฒฝ ์ ์ ๋ํด์๋ง ๊ฐฑ์ ํ๋ค.
์ปดํฌ๋ํธ์
setState๋ฉ์๋๊ฐ ์ํ๋๋ฉด, ํด๋น ์ปดํฌ๋ํธ๋ฅผ Dirty ์ฒดํฌํ๊ณ , ๋ค์์ด๋ฒคํธ ๋ฃจํ์์ ๋ฐฐ์น ์์ ์ผ๋ก ๋์ ์ปดํฌ๋ํธ๋ค์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ ๋๋งํ๋ค. (๋น๋๊ธฐ )์ด๋ฌํ ๋ฆฌ์กํธ์ ๋ ๋๋ง ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ชผ๊ฐค ์ ์๋ค.
๋ณ๊ฒฝ ์ ์ ์ฐพ๋ Reconciliation์ Diffing ์๊ณ ๋ฆฌ์ฆ (render or reconciliation phase)
๋ณ๊ฒฝ ์ ์ ์ค์ UI์ ์ ์ฉํ๋ ReactDOMComponent.updateComponent (commit phase)
Reconciliation: The diffing algorithm#
Reconciliation์ ์ด๋ค ๋ณ๊ฒฝ์ ๋ํ ์ /ํ ์๋ฆฌ๋จผํธ ํธ๋ฆฌ๋ฅผ ๋น๊ต(Diff)ํ์ฌ, ๊ฐฑ์ ์ดํ์ํ ๋ถ๋ถ๋ง์ ์ฐพ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์ DOM ์กฐ์์์ต์ํ์ํจ๋ค.
๋ค์ ์ ๋ฆฌ
render()์์ ์๋ก์ด ์๋ฆฌ๋จผํธ ํธ๋ฆฌ๋ฅผ ์์ฑ์ด์ ์๋ฆฌ๋จผํธ ํธ๋ฆฌ์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ ์ ์ ์ฐพ์ ์ ๋ฐ์ดํธ
๊ทธ๋ฐ๋ฐ Diff ์๊ณ ๋ฆฌ์ฆ์ O(n^3)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ฆฌ์กํธ๋ ๋ค์์ ๋ฐฉ๋ฒ์ผ๋ก O(n)์ ๊ทผ์ฌํ ํด๋ฆฌ์คํฑ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ์๋ค.
๋ค๋ฅธ ํ์ ์ ๋ ์๋ฆฌ๋จผํธ๋ ๋ค๋ฅธ ํธ๋ฆฌ๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค.
๊ฐ์ ๋ ๋ฒจ์ ์๋ฆฌ๋จผํธ์
keyํ๋กํผํฐ๋ฅผ ํตํด ๋ณ๊ฒฝ๋์ง ์์์ผ ํ ์๋ฆฌ๋จผํธ๋ฅผ ํ์ํ๋ค.
โ ํด๋ฆฌ์คํฑ ์๊ณ ๋ฆฌ์ฆ : ์ง๊ด์ ์์กดํ๋ ์๊ณ ๋ฆฌ์ฆ. ์ฆ ํด๋ฆฌ์คํฑ์ ๋ณดํต ํฉ๋ฆฌ์ ์ธ์คํ ์๊ฐ์ ๊ฐ์ง์ง๋ง ๊ทธ๊ฒ์ด ํญ์ ๊ทธ๋ ๋ค๋ ์ด๋ ํ ์ถ๋ก ๊ณผ์ ์ด๋ ์ฆ๋ช ์ด ์๋ค.
๊ฐ์ ์์น์์ ์๋ฆฌ๋จผํธ์ ํ์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ
๊ธฐ์กด ํธ๋ฆฌ๋ฅผ ์ ๊ฑฐ ํ ์๋ก์ด ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
๊ธฐ์กด ํธ๋ฆฌ ์ ๊ฑฐ ์ ํธ๋ฆฌ ๋ด๋ถ(ํ์)์ ์๋ฆฌ๋จผํธ/์ปดํฌ๋ํธ๋ค์ ๋ชจ๋ ์ ๊ฑฐํ๋ค. (์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ์ ๊ฑฐ๋๋ฉด์
componentWillUnmount()๊ฐ ์คํ๋จ.) ์ด์ ํธ๋ฆฌ์ ๋ชจ๋ state๊ฐ ์ฌ๋ผ์ง๋ค.์๋ก์ด ํธ๋ฆฌ๋ฅผ ๋ง๋ค ๋ ๋ด๋ถ ์๋ฆฌ๋จผํธ/์ปดํฌ๋ํธ๋ค๋ ๋ชจ๋ ์๋ก ๋ง๋ ๋ค. (์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ
componentDidMount()๊ฐ ์คํ๋จ.)
๊ฐ์ ์์น์์ ์๋ฆฌ๋จผํธ์ ํ์ ์ด ๊ฐ์ ๊ฒฝ์ฐ
์๋ฆฌ๋จผํธ์
attributes๋ฅผ ๋น๊ตํ๋ค.๋ณ๊ฒฝ๋
attributes๋ง ์ ๋ฐ์ดํธํ๋ค.์์ ์๋ฆฌ๋จผํธ๋ค์
diff์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉํ๋ค.
๊ฐ์ ์์น์์ ์๋ฆฌ๋จผํธ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ํํํ๊ณ ๊ทธ ํ์ ์ด ๊ฐ์ ๊ฒฝ์ฐ
์ปดํฌ๋ํธ ์ธ์คํด์ค ์์ฒด๋ ๋ณํ์ง ์๋๋ค. (state๊ฐ ์ ์ง๋๋ค.)
์ปดํฌ๋ํธ ์ธ์คํด์ค์ ์ ๋ฐ์ดํธ ์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋ ๋ค์ด ํธ์ถ๋๋ฉฐ props๊ฐ ์ ๋ฐ์ดํธ ๋๋ค.
render()๋ฅผ ํธ์ถํ๊ณ ์ปดํฌ๋ํธ์ ์ด์ ์๋ฆฌ๋จผํธ ํธ๋ฆฌ์ ๋ค์ ์๋ฆฌ๋จผํธ ํธ๋ฆฌ์๋ํด diff ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉํ๋ค.
์์ ์๋ฆฌ๋จผํธ ์ฌ๊ท
๋ฆฌ์กํธ๋ ์์ ์๋ฆฌ๋จผํธ์ ๋ํ ๋ฐ๋ณต์ ์ธ ๋น๊ต๋ฅผ ํ ๋ ๋ ๋ฆฌ์คํธ๋ฅผ ์ํํ๊ณ ์ฐจ์ด์ ์ด ์์ผ๋ฉด ๋ณ๊ฒฝ์ ์์ฑํ๋ค.
์ ๋ ฌ๊ณผ ๊ฐ์ ์ํฉ์ ์ทจ์ฝํ๋ค.
keys
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ์๋ฆฌ๋จผํธ๋ค์ด key๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด key๋ฅผ ํตํด ๊ธฐ์กด ํธ๋ฆฌ์ ์ดํ ํธ๋ฆฌ์ ์์ ๋ค์ด ์ผ์นํ๋์ง ํ์ธํ๋ค.
Avoid Reconciliation#
์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ ๋๋ง์ ํผํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
ShouldComponentUpdateํจ์๊ฐreturn falseํ๋๋ก ํ๋ค.์ปดํฌ๋ํธ๊ฐ
PureComponent๋ฅผ ์์๋ฐ๋๋ก ํ๋ค.ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ
React.memo()๋ก ๊ฐ์ธ์exportํ๋ค.
โ ํต์ฌ์ ํด๋น ์ปดํฌ๋ํธ๊ฐ
state,props๊ฐ ๋ณ๊ฒฝ ๋์์ ๋๋ง ๋ ๋๋งํ๋๋กํ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋ฆฌ์กํธ๊ฐ ์ปดํฌ๋ํธ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์งํ๋๊ฒ์ด๋ค.
๊ฐ์ฅ ์ข์ ์ผ์ด์ค๋ ๊ฐ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํด ๊ฐ์ props ๋ก ์์ฃผ ๋ ๋๋ง ๋ ๋์ด๋ค. ์ด์ ๋ฉ๋ชจ์ด์ง ๊ฒฐ๊ณผ์ props ๊ฐ ๊ฐ๋ค๋ฉด ๋ด๋ถ๋ฅผ ๋น๊ตํ์ง ์๊ณ ๋ฉ๋ชจ์ด์ง๋๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ๋ค.
ํ์ง๋ง ๋ฐ๋๋ก props ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ผ๋ฉด, ์ด์ props ์ ๋ค์ props ๋น๊ต๋ฅผ ํ๊ณ , ์ปดํฌ๋ํธ ๋ ๋๋ง์ ํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ props ๋น๊ต๋ฅผ ํ๊ฒ ๋ง๋ ๋ค. ๋ํ ๋ฉ๋ชจ์ด์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋จ์ฉํด์ ์๋๋ค.
์ฒ์๋ถํฐ ์ฑ๋ฅ์ ์ต์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ๋ ๊ฒ ์์ฒด๊ฐ ๋นํจ์จ์ ์ด๋ค. ํ์ง๋ง ์ปดํฌ๋ํธ๋ฅผ ์ ์ ํ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์ค์ํ๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ ์ ํ ๋ถ๋ฆฌํ์ฌ ์ด์๋ฅผ๋น ๋ฅด๊ฒ ํ์ ํ๊ณ ๋์ํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ ๋ต์ด๋ค.
UI ๋ฐํ์์ผ๋ก์์ React
์ฌ์กฐ์ (Reconciliation) - React
React ๋ ๋๋ง๊ณผ ์ฑ๋ฅ ์์๋ณด๊ธฐ : TOAST Meetup
React.memo() ํ๋ช ํ๊ฒ ์ฌ์ฉํ๊ธฐ
๋ฆฌ์กํธ ํ (Hook)#
ํ (Hook)์ด๋?#
ํจ์ ์ปดํฌ๋ํธ์์ React state๋ฅผ ์ฐ๋(hook into)ํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์.
์ฆ ์ํ๋ฅผ ํจ์ ์ปดํฌ๋ํธ์ ๋๊ธฐํ ํด์ค๋ค. (์ด ๋ง์ ์ํ๊ฐ ํจ์ ์ปดํฌ๋ํธ ์ธ๋ถ์์ ๊ด๋ฆฌ๋๊ณ ์๋ค๋ ์๋ฏธ๋ฅผ ๋ดํฌํจ.)
๋๊ธฐ#
์ปดํฌ๋ํธ ์ฌ์ด์์ ์ํ์ ๊ด๋ จ๋ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค.
- render props, HOC์ ๊ฐ์ ํจํด์ ๋ํผ๋ฅผ ๊น๊ฒ ๋ง๋ ๋ค.
๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋ ๋ค์ด ์ปดํฌ๋ํธ๋ฅผ ๋ณต์กํ๊ณ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.
ํด๋์ค๋ณด๋ค ํจ์๊ฐ ์ง๊ด์ ์ด๋ค.
this๋ฐ์ธ๋ฉ
ํ ์ ๊ท์น#
โ ๋ฆฌ์กํธ๋ ํ ์ด ํธ์ถ๋๋ ์์์ ์์กดํ๋ค. (์ํ๋ฅผ ์๋ณํ๊ธฐ ์ํด ํธ์ถ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.)
์ต์์(at the Top Level)์์๋ง ํ ์ ํธ์ถํด์ผ ํ๋ค. (๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ํธ์ถํ์ง ๋ง๋ผ)
// ๐ด ์กฐ๊ฑด๋ฌธ์ Hook์ ์ฌ์ฉํจ์ผ๋ก์จ ์ฒซ ๋ฒ์งธ ๊ท์น์ ๊นผ์ต๋๋คif (name !== '') { useEffect(function persistForm() { localStorage.setItem('formData', name); });}์ค์ง React ํจ์ ๋ด์์ Hook์ ํธ์ถํด์ผ ํ๋ค. (์ผ๋ฐ JS ํจ์์์ ํธ์ถํ์ง ๋ง๋ผ)
โ ๋ฆฌ์กํธ์ ํ ์ ๋ ๋๋ง ๋๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ํ ์์ค ์์ ์ธ๋ถ ๊ณต๊ฐ(์คํ ์ปจํ ์คํธ)์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(๋ฐฐ์ด)ํํ๋ก ์ ์ฅ๋๋ ๋ฐ์ดํฐ(
state,setter)์ด๋ค. ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๊ณต์ ๋์ง ์๊ณ , ๋ฆฌ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ์์ ์์ธ์คํ ์ ์๋ค.
useState#
useState์์ ๋ฐํ๋ setter ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, React์๊ฒ ๋ด๋ถ์ ์ผ๋ก ์ก์ ์ dispatch ํ๊ฒ ๋๊ณ , ์ด ์ปดํฌ๋ํธ๊ฐ new state๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ ๋ฐ์ดํธ ํด์ผ ๋๋ค๋ ๊ฒ์ ์๋ฆฐ๋ค.
React hooks: not magic, just arrays
useEffect#
- ๋ ๋๋ง ์ดํ(DOM ์ ๋ฐ์ดํธ ํ)์ ์ํํ "side effect"๋ฅผ ์ํํ ์ ์๋ค.
Fiber#
virtualDOM์ ์ฆ๋ถ ๋ ๋๋ง์ ํ์ฑํํ๊ธฐ ์ํจ.
requestIdleCallback์ ํ์ฉ.์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ๊ธฐ ์ํ ๋ด๋ถ ๊ฐ์ฒด
๋ด์ฅ ์คํ์ ์์กดํ ๋๊ธฐ์ ์ฌ๊ท ๋ชจ๋ธ์์ ๋งํฌ๋ ๋ฆฌ์คํธ์ ํฌ์ธํฐ๊ฐ ์๋ ๋น๋๊ธฐ์๋ชจ๋ธ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ตฌํํจ.
- ํธ์ถ ์คํ์ ๋ง์๋๋ก ์ค๋จํ๊ณ ์คํ ํ๋ ์์ ์๋์ผ๋ก ์กฐ์ํ๊ธฐ ์ํด