#
๋ชจ๋ฐ์ผ ์ฌํ๋ฆฌ ๋๋ฒ๊น์์ดํฐ์ ๋งฅ๋ถ์ ์ฐ๊ฒฐํ๋ค.
์์ดํฐ์์ ๋๋ฒ๊น ํ๊ณ ์ ํ๋ ์นํ์ด์ง๋ฅผ 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 algorithmReconciliation์ ์ด๋ค ๋ณ๊ฒฝ์ ๋ํ ์ /ํ ์๋ฆฌ๋จผํธ ํธ๋ฆฌ๋ฅผ ๋น๊ต(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
)์ด๋ค. ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๊ณต์ ๋์ง ์๊ณ , ๋ฆฌ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ์์ ์์ธ์คํ ์ ์๋ค.
#
useStateuseState์์ ๋ฐํ๋ setter ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, React์๊ฒ ๋ด๋ถ์ ์ผ๋ก ์ก์ ์ dispatch ํ๊ฒ ๋๊ณ , ์ด ์ปดํฌ๋ํธ๊ฐ new state๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ ๋ฐ์ดํธ ํด์ผ ๋๋ค๋ ๊ฒ์ ์๋ฆฐ๋ค.
React hooks: not magic, just arrays
#
useEffect- ๋ ๋๋ง ์ดํ(DOM ์ ๋ฐ์ดํธ ํ)์ ์ํํ "side effect"๋ฅผ ์ํํ ์ ์๋ค.
#
FibervirtualDOM์ ์ฆ๋ถ ๋ ๋๋ง์ ํ์ฑํํ๊ธฐ ์ํจ.
requestIdleCallback
์ ํ์ฉ.์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ๊ธฐ ์ํ ๋ด๋ถ ๊ฐ์ฒด
๋ด์ฅ ์คํ์ ์์กดํ ๋๊ธฐ์ ์ฌ๊ท ๋ชจ๋ธ์์ ๋งํฌ๋ ๋ฆฌ์คํธ์ ํฌ์ธํฐ๊ฐ ์๋ ๋น๋๊ธฐ์๋ชจ๋ธ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ตฌํํจ.
- ํธ์ถ ์คํ์ ๋ง์๋๋ก ์ค๋จํ๊ณ ์คํ ํ๋ ์์ ์๋์ผ๋ก ์กฐ์ํ๊ธฐ ์ํด