์ฐธ๊ณ ์๋ฃ: ์ปดํฌ๋ํธ ๋ผ์ดํ ์ฌ์ดํด, DOM
DOM์ ์ ํํ ๋ฌด์์ผ๊น? | WIT๋ธ๋ก๊ทธ
์ต๊ทผ ์๋ชป ์ดํดํ๊ณ ์์๋ DOM์ ๋ํด ์ ํํ ๊ฐ๋ ์ ์ ๋ฆฌํด ๋ณด๊ณ ์ What, exactly, is the DOM? ๋ฌธ์๋ฅผ ๋ฒ์ญํด ๋ณด์์ต๋๋ค.
wit.nts-corp.com
[React] ์ปดํฌ๋ํธ ๋ผ์ดํ ์ฌ์ดํด๊ณผ ์ฃผ์ ๋ฉ์๋ ํธ์ถ ์์
์ปดํฌ๋ํธ ๋ผ์ดํ์ฌ์ดํด ์ด๋ ์ปดํฌ๋ํธ ๋ผ์ดํ์ฌ์ดํด์ ์ปดํฌ๋ํธ์ ์์ฑ๋ถํฐ ์๋ฉธ์ ์ด๋ฅด๋ ์ผ๋ จ์ ์ด๋ฒคํธ๋ก ์๊ฐํ ์ ์์ต๋๋ค. ๋ชจ๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์๋ LifeCycle์ ๊ฐ์ต๋๋ค. LifeCycle์ ์ธ๊ฐ
koras02.tistory.com
โญ๏ธ ์ปดํฌ๋ํธ ๋ผ์ดํ์ฌ์ดํด
- ์ปดํฌ๋ํธ์ ์์ฑ๋ถํฐ ์๋ฉธ์ ์ด๋ฅด๋ ์ผ๋ จ์ ์ด๋ฒคํธ
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ๋ผ์ดํ์ฌ์ดํด์ ๊ฐ๋๋ค
- ํฌ๊ฒ ์ธ๊ฐ์ง ์นดํ
๊ณ ๋ฆฌ๋ก ๋๋๋ฉฐ ๊ฐ๊ด์ ์ธ ๊ทธ๋ฆผ์ ๋ค์๊ณผ ๊ฐ์
๐ ์ปดํฌ๋ํธ ๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋ ์์๋ณด๊ธฐ
โจ 1. Mounting
- ์ปดํฌ๋ํธ์ ์ธ์คํด์ค๊ฐ ์์ฑ ๋ผ DOM ์์ ์ฝ์
๋๋ ๋จ๊ณ
- ๋ง์ดํ
์ ๋ผ์ดํ์ฌ์ดํด์ด ์ข
๋ฃ๋ ๋๊น์ง ํ ๋ฒ๋ง ์ผ์ด๋จ
- ์๋ ๋ฉ์๋๋ค์ ์ด ๋จ๊ณ์์ ์์๋๋ก ํธ์ถ
โ
๋ฉ์๋ ๋จ๊ณ
- constructor : ์ปดํฌ๋ํธ์ ์ธ์คํด์ค๋ฅผ ์๋ก ๋ง๋ค ๋๋ง๋ค ์์ฑ์ ๋ฉ์๋ ํธ์ถ
- render: ํ๋ฉด์ ํ์๋ JSX ๋ฐํํ๊ณ ํ๋ฉด์ ๊ทธ๋ฆผ
- componentDidMount: ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ชจ๋ ๊ทธ๋ ค์ง ์ด๋ฃจ ํธ์ถ๋จ
๐ componentDidMount๋ โ
- componentDidMount ๋ฉ์๋๋ ์ฒซ ๋ ๋๋ง ์ดํ ์คํ
- ์๋ํฌ์ธํธ์์ ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ผ ํ๋ ๊ฒฝ์ฐ API ํธ์ถ์ ํ๊ธฐ ์ํ ์ข์ ์์น
- ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๋ setState๋ฉ์๋๋ฅผ ์ด์ฉํด ์ปดํฌ๋ํธ๋ฅผ ์
๋ฐ์ดํธ ํ ์ ์์
โจ2. Updating
- props ๋๋ state๊ฐ ๋ณ๊ฒฝ ๋ผ ์ปดํฌ๋ํธ๊ฐ ์
๋ฐ์ดํธ๋๋ ๋จ๊ณ
- ์๋์ ๊ฐ์ด ์์๋๋ก ํธ์ถ
โ
๋ฉ์๋ ๋จ๊ณ
- static GetDerivedStateFromProps
- shouldComponentUpdate
- render: ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก ํธ์ถ
- getSnapshotBeforeUpdate
- componentDidUpdate: ํ๋ฉด์ด ๋ค์ ๊ทธ๋ ค์ง ํ ํธ์ถ
โจ3. Unmounting
- ์ปดํฌ๋ํธ๊ฐ DOM ์์์ ์ ๊ฑฐ๋๋ ๋จ๊ณ
โ
๋จ๊ณ
- compnentWillUnmount : ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์ ๊ฑฐ๋๊ธฐ ์ ์ ํธ์ถ
โญ๏ธ ์ฌ๊ธฐ์ DOM์ด๋โ
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ณธ HTML ๋ฌธ์๋ฅผ ์ฝ์ ํ, ์คํ์ด์ ์
ํ๊ณ ๋ํํ ํ์ด์ง๋ก ๋ง๋ค์ด ๋ทฐ ํฌํธ์ ํ์ํ๊ธฐ๊น์ง ๊ณผ์ ์ "Critical Rendering Path"
- ์น ํ์ด์ง์ ๋ํ ์ธํฐํ์ด์ค
- ์ฌ๋ฌ ํ๋ก๊ทธ๋จ๋ค์ด ํ์ด์ง์ ์ฝํ
์ธ ๋ฐ ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ ์คํ์ผ์ ์ฝ๊ณ ์กฐ์ํ ์ ์๋๋ก API ์ ๊ณต
โ ํฌ๊ฒ ๋๊ฐ์ง ๋จ๊ณ
1. ๋ธ๋ผ์ฐ์ ์์ ๋ฐ์๋ค์ธ ๋ฌธ์๋ฅผ ํ์ฑํ์ฌ ์ต์ข
์ผ๋ก ์ด๋ค ๋ด์ฉ์ ํ์ด์ง์ ๋ ๋๋งํ ์ง ๊ฒฐ์
- ์ด ๊ณผ์ ์์ ๋ ๋ ํธ๋ฆฌ ์์ฑ
- ์น ํ์ด์ง์ ํ์๋ HTML ์์๋ค๊ณผ ๊ด๋ จ๋ ์คํ์ผ ์์ ๊ตฌ์ฑ
- ๋ธ๋ผ์ฐ์ ๋ ๋ ๋ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ ๋ชจ๋ธ์ด ํ์ํจ
- DOM(Document Object Model) - HTML ์์๋ค์ ๊ตฌ์กฐํ๋ ํํ
- CSSOM(Cascading Style Sheets Object Model) - ์์๋ค๊ณผ ์ฐ๊ด๋ ์คํ์ผ ์ ๋ณด์ ๊ตฌ์กฐํ๋ ํํ
2. ๋ ๋๋ง ์ํ
๐ ์ด๋ป๊ฒ ์์ฑ๋ ๊น? ( ์ด๋ป๊ฒ ๋ณด์ฌ์ง๊น?)
- DOM์ ์๋ณธ HTML ๋ฌธ์์ ๊ฐ์ฒด ๊ธฐ๋ฐ ํํ ๋ฐฉ์
- HTML๊ณผ DOM์ ์ฐจ์ด๋ ๋จ์ ํ
์คํธ๋ก ๊ตฌ์ฑ๋ HTML ๋ฌธ์์ ๋ด์ฉ๊ณผ ๊ตฌ์กฐ๊ฐ ๊ฐ์ฒด ๋ชจ๋ธ๋ก ๋ณํ๋์ด ๋ค์ํ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋ ์ ์์
- DOM์ ๊ฐ์ฒด ๊ตฌ์กฐ๋ "๋
ธ๋ ํธ๋ฆฌ"๋ก ํํ
- ํ๋์ ๋ถ๋ชจ ์ค๊ธฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ ์์ ๋๋ญ๊ฐ์ง๋ก ๊ฐ๊ณ ์๊ณ , ๊ฐ๊ฐ์ ๋๋ญ๊ฐ์ง๋ ์๋ค์ ๊ฐ์ง ์ ์๋ ๋๋ฌด์ ๊ฐ์ ๊ตฌ์กฐ๋ผ์
- ๋ฃจํธ ์์์ธ <html>์ "๋ถ๋ชจ ์ค๊ธฐ", ๋ฃจํธ์์์ ๋ดํฌ๋ ํ๊ทธ๋ค์ "์์ ๋๋ญ๊ฐ์ง", ์์ ์์ ์ปจํ
์ธ ๋ "์"
๐ DOM์ด ์๋ ๊ฒ
- DOM์ ๋ง์น HTML ๋ฌธ์์ 1 ๋ 1 ๋งคํ์ด ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ฐจ์ด์ ์ด ์์
โ
1. DOM์ HTML์ด ์๋๋ค
- DOM์ HTML ๋ฌธ์๋ก ๋ถํฐ ์์ฑ๋์ง๋ง ๋์ผํ์ง ์์
- DOM์ด ์๋ณธ HTML ์์ค์ ๋ค๋ฅผ ์ ์๋ ๋๊ฐ์ง ์ผ์ด์ค๊ฐ ์์
๐ ์์ฑ๋ HTML ๋ฌธ์๊ฐ ์ ํจํ์ง ์์ ๋
- DOM์ ์ ํจํ HTML ๋ฌธ์์ ์ธํฐํ์ด์ค
- DOM์ด ์์ฑ๋๋ ๋์, ๋ธ๋ผ์ฐ์ ๋ ์ ํจํ์ง ์์ HTML ์ฝ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ต์ ํจ
<html>
Hello, world!
</html>
๋ฌธ์์ ์ ํจํ HTML ๊ท์น์ ํ์ ์ฌํญ์ธ <head>์ <body>์์๊ฐ ๋น ์ง
- ํ์ง๋ง ์์ฑ๋ DOM ํธ๋ฆฌ์์ ๊ต์ ํจ
๐ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ํด DOM์ด ์์ ๋ ๋
- DOM์ HTML ๋ฌธ์์ ๋ด์ฉ์ ๋ณผ ์ ์๋ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ ๋์์ ๋์ ์์์ด ๋์ด ์์ ๋ ์ ์์
โ
2. DOM์ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ด๋ ๊ฒ์ด ์๋
- ๋ธ๋ผ์ฐ์ ๋ทฐ ํฌํธ์ ๋ณด์ด๋ ๊ฒ์ ๋ ๋ ํธ๋ฆฌ๋ก DOM๊ณผ CSSOM์ ์กฐํฉ
- ๋ ๋ ํธ๋ฆฌ๋ ์ค์ง ์คํฌ๋ฆฐ์ ๊ทธ๋ ค์ง๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ด DOM๊ณผ๋ ๋ค๋ฆ
- ๋ฌ๋ฆฌ ๋งํ๋ฉด, ๋ ๋๋ง๋๋ ์์๋ง์ด ๊ด๋ จ์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ ์ผ๋ก ๋ณด์ด์ง ์๋ ์์๋ ์ ์ธ
<p style="display: none;">How are you?</p>
-๐ก ) display: none ์คํ์ผ ์์ฑ์ด ์์ ๋, DOM์ <p> ์์๋ฅผ ํฌํจ ์ํค์ง๋ง, ๋ ๋ ํธ๋ฆฌ์ ํด๋นํ๋ ๋ทฐ ํฌํธ์ <p> ์์๋ฅผ ํฌํจํ์ง ์์
โ
3. DOM์ ๊ฐ๋ฐ๋๊ตฌ์์ ๋ณด์ด๋ ๊ฒ์ด ์๋
- ๊ฐ๋ฐ๋๊ตฌ์ ์์ ๊ฒ์ฌ๊ธฐ๋ DOM๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ทผ์ฌ์น๋ฅผ ์ ๊ณต
- ๊ฐ๋ฐ๋๊ตฌ์ ์์ ๊ฒ์ฌ๊ธฐ๋ DOM์ ์๋ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ํฌํจ
- ๐ก ) CSS ๊ฐ์ ์์ : ::before๊ณผ ::after ์ ํ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ๊ฐ์ ์์๋ CSSOM๊ณผ ๋ ๋ ํธ๋ฆฌ์ ์ผ๋ถ๋ฅผ ๊ตฌ์ฑ
- ํ์ง๋ง, ๊ธฐ์ ์ ์ผ๋ก DOM์ ์ผ๋ถ๊ฐ ์๋. DOM์ ์ค์ง ์๋ณธ HTML ๋ฌธ์๋ก๋ถํฐ ๋น๋๋๊ณ , ์์์ ์ ์ฉ๋๋ ์คํ์ผ์ ํฌํจํ์ง ์์
๐ ์์ฝ ์ ๋ฆฌ
- DOM์ HTML ๋ฌธ์์ ๋ํ ์ธํฐํ์ด์ค
- ์ฒซ์งธ๋ก ๋ทฐ ํฌํธ( ํ์ฌ ํ๋ฉด์ ๋ณด์ฌ์ง๊ณ ์๋ ๋ค๊ฐํ(๋ณดํต ์ง์ฌ๊ฐํ)์ ์์ญ)์ ๋ฌด์์ ๋ ๋๋งํ ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉ
- ๋์งธ๋ก ํ์ด์ง์ ์ฝํ
์ธ ๋ฐ ๊ตฌ์กฐ, ์คํ์ผ์ด ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋จ์ ์ํด ์์ ๋๊ธฐ ์ํด ์ฌ์ฉ
โ
DOM์ ์๋ณธ HTML ๋ฌธ์ ํํ์ ๋น์ทํ์ง๋ง ์ฐจ์ด์ ์ด ์์
- ํญ์ ์ ํจํ HTML ํ์
- ์๋ฐ์คํฌ๋ฆฝํธ์ ์์ ๋ ์ ์๋ ๋์ ๋ชจ๋ธ
- ๊ฐ์ ์์๋ฅผ ํฌํจํ์ง ์์(์: ::after)
โ ๊ฐ์์์๋ โ
-๊ฐ์ ์์ ํค์๋ ๋ณ๋ก ๋ฏธ๋ฆฌ ๊ธฐ๋ฅ์ด ์ ์๋์ด ์์ผ๋ฉฐ, ์์์ CSS ์์ฑ์ ์ ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์ํ CSS ์์ฑ์ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ง์น ํ๋์ ํ์ ์์์ฒ๋ผ ์ฌ์ฉ
- HTML์ ์กด์ฌํ์ง ์๋ ์์๋ฅผ CSS๊ฐ ์์๋ก ์์ฑํด์ ์คํ์ผ๋ง
โ ๊ฐ์ ์์ ์ข ๋ฅ
- ::before => ํน์ ์์ content ๋ฐ๋ก ์์ ์์
- ::after => ํน์ ์์ content ๋ฐ๋ก ๋ค์ ์ฝ์
- ::first-letter => ์์์ ์ฒซ ๊ธ์๋ฅผ ์ ํ
- ::first-line => ์์์ ์ฒซ ๋ฒ์งธ ์ค์ ์ ํ
- ::marker => marker ๋ชฉ๋ก ํญ๋ชฉ์ ๋ง์ปค๋ฅผ ์ ํ
- ::selection => ํด๋น ์์์์ ์ฌ์ฉ์๊ฐ ์ ํํ ์์ ๋ถ๋ถ์ ์ ํ
- ::placeholder => input ํ๋ ์ ํ ์คํธ๋ฅผ ์ ํ
- ๋ณด์ด์ง ์๋ ์์๋ฅผ ํฌํจ (์: display: none)
'React์ ๊ณ ์ ๐ข' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฆฌ์กํธ] ํ (hook) ์ ๋ฆฌ โจ (0) | 2024.01.18 |
---|---|
[๋ฆฌ์กํธ] component์ props ์ ๋ฆฌ โจ (0) | 2023.09.24 |
[๋ฆฌ์กํธ] element ์ ๋ฆฌ (0) | 2023.09.24 |
[๋ฆฌ์กํธ] JSX ๋ฌธ๋ฒ (0) | 2023.09.24 |
[๋ฆฌ์กํธ] forms ์ ๋ฆฌ โจ (0) | 2023.09.23 |