๋ฉํ ๋ง 5๋ฒ์งธ
๐ F-lab ๋ฉํ ๋ง ๊ธฐ๋ก
๋ฉํ ๋ง ์ดํ ๋ถ์กฑํ ๋ถ๋ถ์ ์ฑ์ฐ๊ธฐ ์ํ ๊ธฐ๋ก
DOM์ด๋?
- Document Object Model์ ์ฝ์๋ก HTML ๋ฌธ์์ ๊ณ์ธต ๊ตฌ์กฐ์ ์ ๋ณด๋ฅผ ํํํ๊ณ ์ด๋ฅผ ์ ์ดํ ์ ์๋ API(ํ๋กํผํฐ, ๋ฉ์๋)๋ฅผ ์ ๊ณตํ๋ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ
SPA๋?
- Single Page Application์ ์ฝ์๋ก ์ด๋ค ์น ์ฌ์ดํธ์ ์ ์ฒด ํ์ด์ง๋ฅผ ํ๋์ ํ์ด์ง์ ๋ด์ ๋์ ์ผ๋ก ํ๋ฉด์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ํํํ๋ ๊ฒ
- ๊ณผ๊ฑฐ ์น ์ฌ์ดํธ์ ๊ท๋ชจ๊ฐ ์์ ๋, ์ด๋ค ์์๋ฅผ ํด๋ฆญ ์ ์๋ฒ์์ ๋งค๋ฒ ์ ์ฒด html ํ์ผ์ ์ ์กํด์ฃผ์๋ค.
- ๊ทธ๋ฌ๋ ์ ์ ์น ์ฌ์ดํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ์์ ํ๋๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ ์ฒด๋ฅผ ๋ณด๋ด๋ ๊ฒ์ด ๋๋ฌด ๋นํจ์จ์
- ๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด
SPA
SPA์์ SEO๊ฐ ๋์ํ๊ธฐ ์ด๋ ค์ด ์ด์ ?
- ํ๋์ ํ์ด์ง์ ์ฌ๋ฌ ํ์ด์ง๋ฅผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํ(Client Side Rendering; CSR)ํ๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ง ๋ชปํ๋ ๊ฒ์ ์์ง์ ๋ํด์๋ ํฌ๋กค๋ง์ด ๋์ง ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
SEO๋?
- Search Engine Opimization์ ์ฝ์๋ก ๋ง ๊ทธ๋๋ก ๊ฒ์ ์์ง์ ์ต์ ํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์์ SPA์ ๊ฒฝ์ฐ ๊ฒ์ ์์ง์ ๋
ธ์ถ๋๊ธฐ ์ด๋ ต๊ธฐ์ ๊ฒ์ ์์ง์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌํ๋ค.
- (1) SSR(Server Side Rendering)์ผ๋ก ๊ตฌ์ถํ๊ธฐ
- SPA์ด๋ฉด์ SSR ๋ฐฉ์์ผ๋ก ์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅ
- React์ Next.js
- Vue์ Nuxt
- Angular์ Angular Universal
- SPA์ด๋ฉด์ SSR ๋ฐฉ์์ผ๋ก ์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅ
- (2) ๋์ ๋ ๋๋ง(Dynamic Rendering)
- ์ด๋ฏธ CSR ๋ฐฉ์์ผ๋ก SPA๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ ์ฌ์ฉ
- ์๋ฒ์์ ์์ฒญํ๋ ์ฃผ์ฒด๊ฐ ์ฌ๋์ธ์ง, ํฌ๋กค๋ฌ์ธ์ง ๊ตฌ๋ถ
- ์ฌ๋: HTML๊ณผ JS๋ฅผ ์ ๊ณต
- ํฌ๋กค๋ฌ: ๋ ๋๋ง๋ HTML ๋ฒ์ ์ ํ์ด์ง๋ฅผ ์ ๊ณต
- react-helmet, prerender-spa-plugin, prerender.io, puppeteer, rendertron ๋ฑ์ด ์๋ค.
- (3) History API
- SPA๋ ์น ์ฌ์ดํธ ์ฃผ์๊ฐ ๋ฐ๋์ง ์๊ธฐ์, SPA์ด์ง๋ง ์ฃผ์๋ฅผ ๋ถ์ฌํ๋ ๊ธฐ๋ฅ
- (1) SSR(Server Side Rendering)์ผ๋ก ๊ตฌ์ถํ๊ธฐ
inline, block, inline-block ์ฐจ์ด
inline
- ์ ํ ์ค๋ฐ๊ฟ ์์ด ํ ์ค์ ๋ฐฐ์น
- width์ height ์์ฑ์ ์ง์ ํด๋ ๋ฌด์๋จ(ํด๋น ํ๊ทธ์ ์ปจํ ์ธ ํฌ๊ธฐ ๋งํผ ๊ณต๊ฐ์ ์ฐจ์งํ๊ธฐ ๋๋ฌธ)
- margin๊ณผ padding ์ ์ข์ฐ ๊ฐ๊ฒฉ๋ง ๋ฐ์(์ํ ๊ฐ๊ฒฉ์ ๋ฐ์๋์ง ์์)
- span, a, em ๋ฑ
block
- ์ ํ ์ค๋ฐ๊ฟ์ด ์์ด ๋ง์น ์์๋ฅผ ์๋ฏ์ด ๋ณธ์ธ์ด ํ ์ค์ ์ฐจ์งํจ
- width, height, margin, padding ๋ชจ๋ ๋ฐ์๋จ
- div, p, , h1~6 ๋ฑ
inline-block
- ๊ธฐ๋ณธ์ ์ผ๋ก inline๊ณผ ๊ฐ์ด ์ ํ ์ค๋ฐ๊ฟ ์์ด ํ์ค์ ๋ฐฐ์น
- block์ฒ๋ผ width, height, margin, padding ๋ชจ๋ ๋ฐ์๋จ
- ์ฆ, ๋ด๋ถ์ ์ผ๋ก๋ block์ด์ง๋ง ์ธ๋ถ์ ์ผ๋ก๋ inline
- button, input, select ๋ฑ
์ด๋ฒคํธ ๋ฒ๋ธ๋ง, ์ด๋ฒคํธ ์บก์ฒ๋ง
์ด๋ฒคํธ ๋ฒ๋ธ๋ง
- ์์ ํ๊ทธ(๋ ธ๋)์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ ์, ๊ทธ ์ด๋ฒคํธ๊ฐ ๋ถ๋ชจ ํ๊ทธ๋ก ์ฌ๋ผ๊ฐ๋ฉฐ ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๋ ํ์
- ๋จ, focus์ ๊ฐ์ด ๋ฒ๋ธ๋ง๋์ง ์๋ ์ด๋ฒคํธ๋ ์กด์ฌ. ๊ทธ๋ฌ๋
๊ฑฐ์ ๋ชจ๋ ์ด๋ฒคํธ
๋ ๋ฒ๋ธ๋ง์ด ์ผ์ด๋๋ค. - body ํ๊ทธ ๋ฟ ์๋๋ผ, html ํ๊ทธ ์ฌ์ง์ด document ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ ๊น์ง ๋ชจ๋ ๋ ธ๋์์ ๋ฐ์ํ๋ฉฐ ๋ช๋ช ์ด๋ฒคํธ๋ window ๊ฐ์ฒด๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๊ธฐ๋ ํ๋ค.
์ด๋ฒคํธ ์บก์ฒ๋ง
- ์ด๋ฒคํธ๊ฐ ํ์ ์์๋ก ์ ํ๋๋ ๊ฒ
- ์ค์ ๋ก ์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ ๋จ๊ณ๋
- (1) ์บก์ฒ๋ง ๋จ๊ณ(๋ถ๋ชจ์์ ์์๋ ธ๋๋ก ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋จ)
- (2) ํ๊ฒ ๋จ๊ณ(์ด๋ฒคํธ ํ๊ฒ์์ ์ด๋ฒคํธ ๋ฐ์)
- (3) ๋ฒ๋ธ๋ง ๋จ๊ณ(์์์์ ๋ถ๋ชจ๋ ธ๋๋ก ์ด๋ฒคํธ ์ ๋ฌ๋จ)
- ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ์บก์ฒ๋ง ๋จ๊ณ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ({capture: false})๋์ด ์๊ธฐ ๋๋ฌธ์ ์บก์ฒ๋ง์ ์ ๋ง ์ฌ๋งํ๋ฉด ์ฌ์ฉํ์ง ์๋๋ค.
event.stopPropagation()๊ณผ event.preventDefault()
event.stopPropagation()
- ํน์ ๋ ธ๋์์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ค๋จ์ํฌ ๋ ์ฌ์ฉ
- event.stopImmediatePropagation(): ํน์ ์ด๋ฒคํธ๋ฟ ์๋๋ผ, ํด๋น ์์์ ํ ๋น๋ ๋ชจ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋์๋ ๋ง์ ๋ ์ฌ์ฉํ๋ค.
- โญ ์ ๋ง ํน์ํ ์ํฉ์ด ์๋๋ผ๋ฉด ๋ฒ๋ธ๋ง์ ๋ง๋ ํ์๋
์ง์
ํ ๊ฒ! ๋ฒ๋ธ๋ง์ ๋ง์๋ค๊ฐ ์ถํ์ ์์ ๋ ธ๋์์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ ์ผ์ด ์๊ธธ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
event.preventDefault()
- ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๋์์ ์ทจ์ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฉ์๋
์ด ๋์ ์ฐจ์ด์ ๋ํด์๋ ์ฐธ๊ณ ์์ ๋ ์์ธํ ๋ณด๋ ๊ฒ์ ์ถ์ฒ!
๊ฐ์ DOM
- DOM์ ์น ํ์ด์ง๋ฅผ ์ด๋ฃจ๋ HTMLํ๊ทธ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด์ฉํ ์ ์๊ฒ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๋ง๋ ๊ฐ์ฒด ๋ชจ๋ธ
- ์น์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ๊ทธ ๋ ๊ทธ ๋ DOM์ ์ง์ ์ ๊ทผํ์ฌ ๋ณํ๋ฅผ ์ฃผ๊ฒ ๋๋ฉด ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์
- DOM ์์ฒด๋ ๋น ๋ฅด์ง๋ง, ์น ๋ธ๋ผ์ฐ์ ๋จ์์ DOM์ ๋ณํ์ ๋ฐ๋ผ ๋๋๋งํ๋ ๊ณผ์ ์์ ์๊ฐ์ด ๋ ์๋ชจ๋๋ ๊ฒ
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด ๊ฐ์ DOM
!!!
์์) ๋ฆฌ์กํธ์์ ๊ฐ์ DOM์ ๋ฐ์ํ๋ ์ ์ฐจ
- ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ์, ์ ์ฒด UI๋ฅผ ๊ฐ์ DOM์ ๋ฆฌ๋๋๋ง
- ์ด์ ๊ฐ์ DOM๊ณผ ํ์ฌ์ ๊ฐ์ DOM์ ๋น๊ต(๊ฐ์ฒด์ ๋น๊ต -> ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ์ค์ํ ์ด์ )
- ๋ณํํ ๋ถ๋ถ๋ง ์ค์ DOM์ ์ผ๊ด ์ ๋ฐ์ดํธ -> ๋ ์ด์์ ๊ณ์ฐ์ด ํ๋ฒ์ ํ๋ฒ๋ง ์ด๋ค์ง
- ์ฆ, ์์ ๊ท๋ชจ์ DOM ๋ณํ๊ฐ ์ฌ๋ฌ๋ฒ ์ผ์ด๋๋ ๊ฒ๋ณด๋ค ํฐ ๊ท๋ชจ์ ๋ ์ด์์ ๋ณํ๋ฅผ ํ ๋ฒ ๋ฐ์์ํด์ผ๋ก์จ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์๋ค.
JSON
- JavaScript Object Notation์ ์ฝ์๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด ํํ๋ฅผ ์๋ฏธ
- ์ฌ๋๊ณผ ์ปดํจํฐ๊ฐ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ฉ๋์ด ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋, XML์ด ์๋ JSON ํํ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- ํน์ ์ธ์ด์ ์ข ์๋์ง ์๊ณ , ๋ชจ๋ ์ธ์ด์์ JSON ๋ฐ์ดํฐ๋ฅผ ํธ๋ค๋งํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
(์ถ๊ฐ)CSS link ํ๊ทธ๋ฅผ head ํ๊ทธ์ ๋์ด์ผํ๋ ์ด์ ?
์ต์ ํ๋ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋๋ฐ ์ ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์น์ฌ์ดํธ๊ฐ ๋ก๋๋ ๋, HTML๊ณผ CSS๋ ๋์์ ํ์ฑ๋์ด ๊ฐ๊ฐ DOM๊ณผ CSSOM์ ๋ง๋ค๊ฒ ๋๋๋ฐ, ์น์ฌ์ดํธ์ ์๊ฐ์ ์์๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ๋ ๊ฐ์ง ๋ชจ๋ ํ์ํ๋ค. HTML๊ณผ CSS๊ฐ ํ์ฑ๋๋ฉฐ first meanigful paint๋ฅผ ํ๊ฒ ๋๋ค.
(first meaningful paint๋ ์ฌ์ดํธ์ ์ฑ๋ฅ ์งํ ์ค ํ๋์ด๋ค.)
์ฆ, ๋ฌธ์ ์ตํ๋จ์ stylesheet link๋ฅผ ๋๋ ๊ฒ์ ์ด๋ฐ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ ์์ธ์ด ๋๋ค.
(์ถ๊ฐ) ๋ฐ์ํ vs ์ ์ํ
๋ฐ์ํ
- ํ๋์ ํ ํ๋ฆฟ์์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๊ธฐ ๋ณ๊ฒฝ ์ ๊ทธ ํฌ๊ธฐ์ ๋ฐ์ํด์ ์๋ํ๋๋ก ํ๋ ์น์ฌ์ดํธ
- ์ด๋ค ๊ธฐ๊ธฐ๋ ๋ชจ๋ ์ปจํ ์ธ ๋ฅผ ๋ค์ด๋ก๋ ํ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ๋ฐ๋ผ ์กฐ์ ํ๋ฏ๋ก ์๋๊ฐ ๋๋ฆฌ๋ค.
์ ์ํ
- ์ผ์ ํ๋ฉด ํฌ๊ธฐ์ ๋ง๊ฒ ๊ฐ๊ฐ ๋ค๋ฅธ ํ ํ๋ฆฟ์ ์ ์ฉํจ์ผ๋ก์จ ๊ฐ๊ฐ์ ํ๋ฉด ํฌ๊ธฐ์ ๋์ํ ์ ์๋ ์น์ฌ์ดํธ
- ์ฌ๋ฌ ํ ํ๋ฆฟ์ ์ค๋นํด๋๊ณ ์ ์ด์ ํด๋น ๊ธฐ๊ธฐ์ ์ ๋ณด๋ฅผ ์๋ฒ ํน์ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์งํ์ฌ ๊ธฐ๊ธฐ์ ๋ง๋ ํ ํ๋ฆฟ, ์ปจํ ์ธ ๋ง ๋ค์ด๋ก๋ํ๋ฏ๋ก ์๋๊ฐ ๋น ๋ฅด๋ค.