JSX
Keyword
JSX
React Element
Virtual DOM
3-1 ์ฌ์กฐ์ (Reconciliation)
์ ์ธ์ API
1. JSX
JSX๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ฅ๋ ๋ฌธ๋ฒ์ผ๋ก ์ด๋ฆฐ ํ๊ทธ ๋ซํ ํ๊ทธ๋ก ๊ตฌ์ฑ๋ XML ๋ฌธ๋ฒ์ ๋ฐ๋ฅด๋ฉฐ HTML ๋ฌธ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
Babel ํธ๋์คํ์ผ๋ฌ
Babel ํธ๋์คํ์ผ๋ฌ
Babel์ด JSX๋ฌธ๋ฒ์
React.createElement(components, props, โฆchildren)
ํจ์๋ก ํธ๋์คํ์ผ๋งํ์ฌ ๋ฌธ๋ฒ์ ์คํ์ ์ ๊ณตํ๋ค.
๋ฌธ๋ฒ์ ์คํ
์ฝ๋ ์ฌ๋ ๋๋ ์ฌ์ฉํ๋ ์ฌ๋์๊ฒ ํธ์๋ฅผ ์ํด ๋์์ธ๋ ๋ฌธ๋ฒ์ผ๋ก ๋ชจ๋ ์ํฉ์์ ์ ํฉํ์ง๋ ์์ง๋ง, ์์ฑ์์ ์๋๋ฅผ ํ์ ํ ์ ์๋ ์ํฉ์ ์ฌ์ฉ์ ์ง๊ด์ ์ธ ๋ฌธ๋ฒ์ผ๋ก ๊ฐ๋ ์ฑ์ ๋์ธ๋ค. ex) ์ผํญ์ฐ์ฐ์, nullish ๋ณํฉ ์ฐ์ฐ์ ๋ฑ
React๋ ํด๋น ํจ์๋ฅผ ์ฌ์ฉํด React element ํธ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค.
JSX๋ก ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ Vanilla JS๋ก๋ ๊ฐ๋ฅํ๋ค.
์ฝ๋ ์์
์์ ์ฝ๋์์ ๋ง์ฝ div ์๋ฆฌ๋จผํธ๋ฅผ ์ ๊ฑฐํ๋ค๋ฉด?
์ธ์ ํ JSX element๋ ๋๋ฌ์ธ๋ ํ๊ทธ๋ก ๋ฌถ์ด์ผ ํ๋ค๋ ์๋ฌ๋ฉ์์ง๊ฐ ๋ฐ์ํ๋ค. ๋ง์น ๋ฌธ์ฅ์ ์ธ๋ฏธ์ฝ๋ก (;)์ ์ฌ์ฉํ์ง ์๊ณ ํ ์ค์ ์ฐ์์ ์ผ๋ก ์ ๋ ฅํ์ ๊ฒฝ์ฐ์ ๊ฐ์ ์ ์ด๋ค. ex) add(1, 2) add(3, 4) => Missing semicolon error
2. React Element
React์์ UI๋ฅผ ๊ตฌ์ฑํ๋ ์ต์ ๋จ์ React Element, ์ผ๋ฐ์ ์ผ๋ก JSX๋ก ํํ๋๋ค. JSX ๋ฌธ๋ฒ์ ์ ์ธ์ API๋ฅผ ์ ๊ณตํด ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ณ ๊ฐ๋ฐ ์์ฐ์ฑ์ ์ฆ๊ฐ์ํค์ง๋ง, ๊ณต์๋ฌธ์๋ React์์ JSX๊ฐ ํ์๊ฐ ์๋๋ผ๊ณ ์ค๋ช ํ๋ค.
์ ํ์๊ฐ ์๋๊ฐ?
์ ํ์๊ฐ ์๋๊ฐ?
์์ JSX์์ ์ค๋ช ํ ๊ฒ ์ฒ๋ผ Babel, swc์ ๊ฐ์ ํด์ด JSX ๋ฌธ๋ฒ์ React.createElement ํจ์๋ก ๋ณํํ๋ ๊ฒ์ผ ๋ฟ์ด๋ค. (document.createElement ํจ์๊ฐ ๋์ํ๋ ๊ฒ ์ฒ๋ผ!)
React automatic runtime
React automatic runtime
React 17๋ถํฐ automatic runtime์ด ๋์
๋์๋๋ฐ, ๋ ์ด์ import React from 'react';
๊ตฌ๋ฌธ์ ์
๋ ฅํ์ง ์์๋ ๋๋ค. ์ด์ ์๋ JSX๊ฐ React.createElement() ํจ์๋ก ์ปดํ์ผ ๋์๊ธฐ ๋๋ฌธ์ ํด๋น import ๊ตฌ๋ฌธ์ด scope์์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
classic runtime
automatic runtime
์ฝ๋ ๋ณํ ์ import {jsx as _jsx} from 'react/jsx-runtime';
import ๊ตฌ๋ฌธ์ด ์ถ๊ฐ๋๋ค.
3. Virtual DOM
Virtual DOM์ ๋ฆฌ์กํธ๊ฐ DOM์ ์ถ์ํ, ๊ฐ์์ ์ผ๋ก ํํํด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , ReactDOM๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด Real DOM๊ณผ ๋๊ธฐํํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ด๋ค.
ํน์: VDOM์ ์ฌ์ฉํ๋ ๊ฒ์ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค! (X)
๋ฆฌ์กํธํ ๊ฐ๋ฐ์ Dan Abramov์ ๋ต๋ณ: ํ์ค์ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ผ๋ฉฐ, ๋๋ถ๋ถ์ ์ฌ๋ก์์ ์ถฉ๋ถํ ๋น ๋ฅด๋ค.
maiatainable
Vanilla JS๋ก DOM element๋ฅผ ์ง์ ์ ๋ ํธํด ๊ฐ๊ณตํ๋ ๊ฒ์ด ๊ณผ์ฐ ์ ์ง๋ณด์์ ์ฉ์ดํ ๊น?
React๋ ์ ์ธ์ API๋ฅผ ํตํด ๊ฐ๋ฐ์๊ฐ ์ํ๋ UI๋ฅผ ์ง์ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ํ๋ ๊ฒ์ด ์๋, ์ํ๋ ์ํ๋ฅผ ์ ์ธ์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐํด React๊ฐ ์๋์ผ๋ก UI๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์ง๋ณด์์ ์ฉ์ดํ๋ค.
Fast enough
์ฌ์กฐ์ (Reconciliation)
์ ํตํด ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ถฉ๋ถํ ๋น ๋ฅด๋ค.
3-1 ์ฌ์กฐ์ (Reconciliation)
ํ๋์ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ๋ค๋ฅธ ํธ๋ฆฌ๋ก ๋ณํํ๊ธฐ ์ํ ์ต์ํ์ ์ฐ์ฐ ์๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ O(n3)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ฐ์ฐ ๋น์ฉ์ด ๋๋ฌด ๋๋ค. React๋ ๋ ๊ฐ์ง ๊ฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก O(n) ๋ณต์ก๋์ ํด๋ฆฌ์คํฑ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ค. ์ฌ๊ธฐ์ ํด๋ฆฌ์คํฑ์ด๋ ์ค์ํ์ง ์์ ๋ถ๋ถ์ ์ ์ธํ๊ณ ์ค์ํ ๋ถ๋ถ๋ง์ ๊ณ ๋ คํด์ ์ต์ ์ ๊ฐ์ ์ฐพ์๋ด์๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋ก ๋ค๋ฅธ ํ์ ์ ๋ ์๋ฆฌ๋จผํธ๋ ์๋ก ๋ค๋ฅธ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
๊ฐ๋ฐ์๊ฐ key prop์ ํตํด, ์ฌ๋ฌ ๋ ๋๋ง ์ฌ์ด(๋ฐฐ์ด์ ์๋ฆฌ๋จผํธ ๋ ๋๋ง)์์ ์ด๋ค ์์ ์๋ฆฌ๋จผํธ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ผ ํ ์ง ํ์ํด ์ค ์ ์๋ค.
๋น๊ต(Diffing) ์๊ณ ๋ฆฌ์ฆ
Diffing ์๊ณ ๋ฆฌ์ฆ์ Reconciliation ๊ณผ์ ์์ ์ด์ ์ํ์ ์๋ก์ด ์ํ๋ฅผ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ ๊ฐ์ ํธ๋ฆฌ๋ฅผ ๋น๊ตํ ๋, ๋ฆฌ์กํธ๋ DOM Tree์ ๋์ผ ๋ ๋ฒจ/๊ณ์ธต๋ผ๋ฆฌ level-by-level
๋ก ํ์ํ๋ค. ํด๋น ์์ด๋์ด๊ฐ ํด๋ฆฌ์คํฑ ์๊ณ ๋ฆฌ์ฆ์ ์ค์ํ ๋ถ๋ถ์ ๊ณ ๋ คํ๋ ๊ฒ์ด๋ค!
1-1. ์๋ฆฌ๋จผํธ์ ํ์
์ด ๋ค๋ฅธ ๊ฒฝ์ฐ
๋ ๋ฃจํธ ์๋ฆฌ๋จผํธ์ ํ์ ์ด ๋ค๋ฅด๋ฉด, React๋ ์ด์ ํธ๋ฆฌ๋ฅผ ๋ฒ๋ฆฌ๊ณ ์์ ํ ์๋ก์ด ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ค.
๋ฃจํธ ์๋ฆฌ๋จผํธ๋ผ๋ ๊ฒ์ด ํธ๋ฆฌ์ ํ๋ ํ ๊ตฌ์กฐ์ ๊ด์ ์ผ๋ก ํน์ ์ปดํฌ๋ํธ์์์ ๋ฃจํธ ์๋ฆฌ๋จผํธ ๋ํ ์ ์ฉ๋๋ ์๋ฏธ์ธ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ํด๋น ์ปดํฌ๋ํธ ํน์ ์๋ฆฌ๋จผํธ์ ํ์ ์ด ๋ค๋ฅด๋ค๋ฉด ์์์ ์ํํ ํ์์์ด ํด๋น ๋ ธ๋๋ฅผ ํฌํจํ ์์ ๋ ธ๋๋ฅผ ์๋ก์ด Virtual DOM์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ด๋ค.
1-2. ์๋ฆฌ๋จผํธ์ ํ์
์ด ๊ฐ์ ๊ฒฝ์ฐ
React๋ ๋ ์๋ฆฌ๋จผํธ์ ์์ฑ์ ํ์ธํ์ฌ, ๋์ผํ ์์ฑ์ ๋ด์ฉ์ ์ ์งํ๊ณ ๋ณ๊ฒฝ๋ ์์ฑ๋ง ๊ฐฑ์ ํ๋ค.
2-1. ์์์ ๋ํ ์ฌ๊ท์ ์ฒ๋ฆฌ
๋ฐฐ์ด์ ๋งจ ๋์ ์๋ฆฌ๋จผํธ๊ฐ ์ฝ์ ๋์ง ์๊ณ ๋ง์ฝ 3๋ฒ ์ธ๋ฑ์ค์ ์๋ฆฌ๋จผํธ๊ฐ ์ฝ์ ๋ ๊ฒฝ์ฐ์ ๋ค์ชฝ์ ์์นํ ์๋ฆฌ๋จผํธ๋ฅผ ์๋ก์ด ์๋ฆฌ๋จผํธ๋ก ์ธ์ํ๊ณ 4๋ฒ ์ธ๋ฑ์ค๋ถํฐ ๊ทธ ๋ค์ ๋ชจ๋ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฆฌ๋ ๋๋งํ๋ค. ๋๋ฌธ์ React์์๋ ๋ฆฌ์คํ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ํ ๋ key๊ฐ์ ์๊ตฌํ๋ค. ์ด key๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ฆฌ๋จผํธ์ ์ธ๋ฑ์ค๊ฐ ๋ณ๊ฒฝ๋๋คํด๋ ๊ธฐ์กด๊ณผ ๋์ผํ๋ค๋ ๊ฒ์ ํ์ธํ๊ณ ๊ทธ์ ์์น๋ง ์ด๋ํ๋ค.
์๋ฆฌ๋จผํธ๊ฐ ๋ฐฐ์ด์ ์ฝ์ ๋๋ค๋ฉด?
key prop์ ํตํด React๊ฐ ๊ธฐ์กด๊ณผ ๋์ผํ ์๋ฆฌ๋จผํธ์์ ํ์ธํ๊ณ ์์น๋ง ์ด๋!
4. ์ ์ธ์ API
๊ฐ๋ฐ์๊ฐ DOM element๋ฅผ ์ ํํด addEventLinster๋ก ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๊ฑฐ๋, classList๋ฅผ add ํ๊ฑฐ๋, ์ด๋ ํ ๋ถ๋ชจ ๋ ธ๋์ ์์ ์๋ฆฌ๋จผํธ๋ก ์ถ๊ฐ๋ ์ง ์ง์ DOM ์กฐ์๊ณผ ์ํ ๋ณํ์ ๋ํด ๋ช ๋ นํ ํ์์์ด ์ ์ธ์ ์ผ๋ก React์๊ฒ UI๋ฅผ ์ด๋ป๊ฒ ํํํด์ผ ํ๋์ง๋ฅผ ์๋ ค์ฃผ๋ ๋ฐฉ์์ด๋ค.
์ ์ธ์ API์ Virtual DOM์ด ๋ฌด์จ ์๊ด์ธ๊ฐ?
์ ์ธ์ ์ผ๋ก UI ๊ตฌ์กฐ๋ฅผ ์์ฑํ๊ณ , ์ปดํฌ๋ํธ๊ฐ ๋ฐํํ React element ํธ๋ฆฌ๊ฐ Virtual DOM์ด๋ฉฐ ์ํ, ํ์ ์ด ๋ณ๊ฒฝ๋์ ๊ฒฝ์ฐ Real DOM๊ณผ ๋น๊ต(diffing) ์ํํ์ฌ ๋ฆฌ๋ ๋๋ง ์ต์ ํ๋ฅผ ์ํํ๋๋ฐ ์ด ๊ณผ์ ์ React์๊ฒ ์ ์ธ์ ์ผ๋ก ์๋ ค์ฃผ๋ฉด ์์์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ถ๊ธํ ํค์๋
React Fiber
Last updated