1.0.7 (2024.02.04)
DOM ์กฐ์ ๋ฐฉ์ ๋ณ๊ฒฝ, ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ, ๋ฆฌ์คํธ ๊ฐ์ํ ๋์ , DB ์บ์ ๊ตฌ์กฐ ๋ณ๊ฒฝ
Refactor
DOM ์กฐ์ ๋ฐฉ์ ๋ณ๊ฒฝ
- ๋ฌธ์
- innerHTML์ ์ฌ์ฉํ๋ฉด์ ์๋ ์ด์๊ฐ ๋ฐ์ํจ
- XSS ์ทจ์ฝ์ : ์ฌ์ฉ์ ์ ๋ ฅ์ด HTML๋ก ์ง์ ํ์ฑ๋์ด ์คํฌ๋ฆฝํธ ์คํ ์ํ์ด ์กด์ฌํจ
- ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง: ํ ์คํธ ๋ณ๊ฒฝ์ ํ ์คํธ ์ ์ฒด DOM์ ์ฌํ์ฑํ๊ณ ์์
- innerHTML์ ์ฌ์ฉํ๋ฉด์ ์๋ ์ด์๊ฐ ๋ฐ์ํจ
- ํด๊ฒฐ
- ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ innerHTML์์ documentFragment๋ก ๋ณ๊ฒฝ
- HTML ํ์ฑ โ DOM ํธ๋ฆฌ ๊ตฌ์ฑ
- innerHtml์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ ์ฒด DOM์ ๋ค์ ํ์ฑํด ๊ธฐ์กด DOM์ ์์ ํ ๋ฎ์ด์ฐ๊ธฐ ๋๋ฌธ์ ํ ์คํธ์ ์์ด ๋ง์์ง ๊ฒฝ์ฐ ์ฑ๋ฅ์ ๋ฌธ์ ๋ฐ์
- documentFragment๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ DOM์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ์์ ํ๊ณ , ๊ธฐ์กด DOM๊ณผ ๋น๊ต ํ ํ์ํ ๋ถ๋ถ๋ง ๊ฐฑ์ ํจ
- ์ด๋ฅผ ํตํด ์ ์ฒด DOM์ด ๋ค์ ํ์ฑ๋์ง ์์ผ๋ฏ๋ก ๋ถํ์ํ ์ฐ์ฐ์ ์ ๊ฑฐํด DOM ์ ๋ฐ์ดํธ ํ์ ๊ฐ์
- Layout ๊ณ์ฐ โ ๋ฆฌํ๋ก์ฐ ๋ฐ์
- DOM ํธ๋ฆฌ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ์๋ก ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ๋ฅผ ์ ๋ ฅํ ๋๋ง๋ค ๋ฆฌํ๋ก์ฐ ๋ฐ์
- documentFragment๋ฅผ ์ฌ์ฉํด ๊ธฐ์กด DOM๊ณผ ์๋ก์ด DOM์ ๋น๊ตํด ์ฐจ์ด๊ฐ ์์๋๋ง ์ ๋ฐ์ดํธ ํ๋๋ก ์์
- Paint โ ๋ฆฌํ์ธํธ ๋ฐ์
- ํ ์คํธ์ ์คํ์ผ์ด ์ ์ฉ๋์ด ์์ ๋, ํ ์คํธ๋ฅผ ์ ๋ ฅํ ๋๋ง๋ค ๋ฆฌํ์ธํธ ๋ฐ์
- documentFragment๋ฅผ ์ฌ์ฉํด ํ ๋ฒ์ ํ์ธํธ ์์ ๋ง ์ํํ๊ฒ ๋์ด ๋ถํ์ํ ์ค๊ฐ ๋ ๋๋ง ํ์๋ฅผ ์ค์
- HTML ํ์ฑ โ DOM ํธ๋ฆฌ ๊ตฌ์ฑ
- ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ innerHTML์์ documentFragment๋ก ๋ณ๊ฒฝ
- ๊ณผ์
- innerHTML ๋ฌธ์์ด์ ์์ฑํ๋ ๋ถ๋ถ์ document.createDocumentFragment๋ก ๋ณ๊ฒฝ
- ๋ฌธ์์ด์ span ํ๊ทธ, ํ ์คํธ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ fragment.appendChild๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ
- ๊ธฐ์กด ๋ ธ๋์ ์๋ก์ด ๋ ธ๋๋ฅผ ๋น๊ตํด ๋ณ๊ฒฝ์ด ์์ ๋๋ง ์ ๋ฐ์ดํธํ๋๋ก ์์
- ๊ฒฐ๊ณผ
- XSS ์ทจ์ฝ์ ์ ๊ฑฐ
- DOM ํ์ฑ ๋ฐ ๋น๋ ๋น์ฉ ์ ๊ฐ
๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ
- ๋ฌธ์
- ํ์ด์ง์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ๋, ํ์ด์ง ๋ด๋ถ ์๋ํฐ ๋ฐ ๋ธ๋ก ๋ชจ๋๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ ๋ฌธ์ ๋ฐ์
- ์ด๋ก์ธํด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐ ๋ฆฌํ๋ก์ฐ๊ฐ ๋ฐ์ํจ
- ํด๊ฒฐ
- React memo, useMemo๋ฅผ ํ์ตํด ํ์ด์ง ๋ฆฌ์ฌ์ด์ง ์ค์๋ ์๋ํฐ ๋ฐ ๋ธ๋ก์ด ๋ฆฌ๋ ๋๋ง ๋์ง ์๋๋ก ๋ณ๊ฒฝ
- ๋ฆฌํ๋ก์ฐ/๋ฆฌํ์ธํธ ์ต์ ํ ๋ฐฉ๋ฒ์ ํ์ตํด ์ค๋ฒ๋ ์ด ์คํฌ๋ฆฐ์ด ๋ณด์ผ ๋๋ transform: scale(0) ์์ฑ์ ํตํด ํ์ด์ง ์ปดํฌ๋ํธ๊ฐ ๋ณด์ด์ง ์๋๋ก ๋ณ๊ฒฝ
- ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ์ธก์ ๋๊ตฌ๋ฅผ ๋ถ์ํด Chrome react devtool ์ฌ์ฉ
- profiler๋ฅผ ํตํด ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ถ์ํด ๋ ๋๋ง์ ๊ฑธ๋ฆฌ๋ ์๊ฐ ์ธก์
- ๊ณผ์
- ์ค๋ฒ๋ ์ด ์คํฌ๋ฆฐ ๋์ ์ ํตํด ํ์ด์ง ํฌ๊ธฐ ๋ณ๊ฒฝ์ ํ์ด์ง๊ฐ ํ๋ฒ๋ง ๋ ๋๋ง๋๋๋ก ์์
- ์๋ํฐ, ๋ธ๋ก์ React.memo๋ฅผ ํตํด ๋ฉ๋ชจ์ด์ ์ด์
์ ์ฉ
- ์ด๋ฅผ ํตํด ํ ์คํธ ์ ๋ณด๊ฐ ๋ณํ์ง ์์ ๊ฒฝ์ฐ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง
- ๊ฒฐ๊ณผ
- Render:
11.3ms
โ4.9ms
(์ฝ 56.6% ํฅ์) - Layout effects:
1.3ms
โ0.6ms
(์ฝ 53.8% ํฅ์) - Passive effects:
1ms
โ0.6ms
(์ฝ 40.0% ํฅ์) - ์ดํฉ:
13.6ms
โ6.1ms
(์ฝ 55.1% ํฅ์)
- Render:
- ์ถ๊ฐ ๋
ผ์์
- ์ค์ผ๋ ํคUI๋ ์ฌ์ฉ์๊ฒฝํ(UX)์ ์์ด์๋ ์ข์ง์๋ค๊ณ ํ๋จํจ
- ์ถํ ๋๋ฐ์ด์ฑ ๋ฐ ์ค๋กํ๋ง์ ํตํด ์๋ํฐ์ ๋ธ๋ก์ width๋ฅผ ๋ณ๊ฒฝํ๋๋ก ์์ ํด ๋ฆฌํ๋ก์ฐ ํ์๋ฅผ ์ค์ด๋ฉด์ ๋ฆฌ์ฌ์ด์ง ์ค์๋ ๋ฌธ์ ๋ด์ฉ์ ํ์ ํ ์ ์๋๋ก ์์ ํ ์์
๋ฆฌ์คํธ ๊ฐ์ํ
- ๋ฌธ์
- ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋, ์๋ณด์ด๋ ๋ธ๋ญ๊น์ง ๋ชจ๋ ์ฌ๋ ๋๋ง๋จ
- ์ด๋ ์๋ณด์ด๋ ๋ธ๋ญ์ด DOM ์๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ํ์ด์ง ํฌ๊ธฐ(width)๋ฅผ ๋ฐ๊พธ๋ฉด ์์ ์์์ธ ๋ธ๋ญ๊น์ง ์ฌ๋ ๋๋ง์ด ๋๋ ๋ฌธ์ ๋ก ํ์ ๋จ
- ํด๊ฒฐ
- ๋ฆฌ์คํธ ๊ฐ์ํ ๊ธฐ๋ฒ์ ๋์ ํด ๋ณด์ด์ง ์๋ ๋ธ๋ก์ DOM์์ ์ ๊ฑฐํ๋๋ก ์์
- ๊ณผ์
- ์ด๋ถ ํ์์ ์ฌ์ฉํด ํ๋ฉด์ ๋ณด์ฌ์ผ ํ ์ฒซ ๋ฒ์งธ item ํ์
- ์คํฌ๋กค ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์ ๋ณด์ฌ์ผํ ์ฒซ ๋ฒ์งธ item, ๋ง์ง๋ง item์ ๊ตฌํ์ฌ ์ ์ ๋์ด ๊ธฐ๋ฐ์ ๋ฆฌ์คํธ ๊ฐ์ํ ๊ตฌํ
- ๊ฐ ๋ธ๋ญ์ ๋์ด๊ฐ ๋์ ์ผ๋ก ๋ณํ๊ธฐ ๋๋ฌธ์ ๋์ ๋์ด๋ฅผ ์ง์ํ๋ TanStack Virtual ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์
- ๊ฒฐ๊ณผ
- ํ๋ฉด์ ๋ณด์ด๋ ๋ธ๋ญ๋ค๋ง DOM์ ์กด์ฌํ๋๋ก ์์
DB ์บ์ ๊ตฌ์กฐ ๋ณ๊ฒฝ
- ๋ฌธ์
- Nocta๋ ๋ฌธ์ ํธ์ง์ CRDT ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด ํด๋ผ์ด์ธํธ๊ฐ ๋ฌธ์๋ฅผ ํธ์งํ๋ฉด, ํด๋น ํธ์ง ๋ด์ฉ์ CRDT ์ฐ์ฐ ๋จ์๋ก ์๋ฒ์ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก๋จ
- ์ด ๊ณผ์ ์์ ์ฌ์ฉ์๊ฐ ๋ฌธ์๋ฅผ ์ ๋ ฅํ ๋๋ง๋ค ์ฐ์ฐ์ด ๋งค์ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํด ๋ง์ฝ ๋ชจ๋ CRDT ์ฐ์ฐ์ DB์ ์ฆ์ ๋ฐ์ํ๋ค๋ฉด, ์ฆ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋๋ฌธ์ DB ๋ถํ๊ฐ ํฌ๊ฒ ์ฆ๊ฐํจ
- ์ด๋ฅผ ์ํํ๊ธฐ ์ํด ์ธ๋ฉ๋ชจ๋ฆฌ ์บ์์ ํธ์ง ๋ด์ฉ์ ๋ชจ์๋๋ค๊ฐ ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ํ๊บผ๋ฒ์ DB์ ์ ์ฅํ๋ ๋ฐฉ์์ ๋์
ํด DB ์ฝ๊ธฐ/์ฐ๊ธฐ ๋น์ฉ์ ์ค์์ผ๋ ๋ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ: ์ ์ฒด ์ํฌ์คํ์ด์ค ๋ฐ์ดํฐ๋ฅผ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ํต์งธ๋ก ๋ณด๊ดํ๋ค ๋ณด๋, ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ถํ์ํ๊ฒ ์ปค์ง
- ์ฅ์ ์ ๋ฐ์ดํฐ ์์ค: ์๋ฒ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์บ์์๋ง ์กด์ฌํ๋(์์ง DB์ ๋๊ธฐํ๋์ง ์์) ๋ณ๊ฒฝ ๋ด์ญ์ด ์ฌ๋ผ์ง
- ๊ณผ๊ฑฐ ๊ธฐ๋ก ์ถ์ ์ด๋ ค์: ์ฐ์ฐ์ ์ฆ์ ์ ์ฉํ๋ค ๋ณด๋, ์ด๋ ์์ ์์ ์ด๋ค ์ฐ์ฐ์ด ์์๋์ง ์ถ์ ํ๊ธฐ ์ด๋ ค์
- ํด๊ฒฐ
- ์ํฌ์คํ์ด์ค ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์บ์ํ์ง ์๊ณ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ํ๋ CRDT ์ฐ์ฐ ๋จ์๋ง ๋ณ๋๋ก ์บ์ฑํ๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝ
- ์ ๋ก์ง์ ๊ตฌํํ๊ธฐ ์ํด ์ด๋ฒคํธ ์์ฑ ํจํด(Event Sourcing Pattern)์ ๋์
. ์ด๋ฒคํธ ์์ฑ ํจํด์ ๋ค์๊ณผ ๊ฐ์ด ๋์ํจ
- ์ด๋ฒคํธ ์คํ ์ด์ ์ฐ์ฐ ๋์ : ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ CRDT ์ฐ์ฐ(์ด๋ฒคํธ)์ ์ด๋ฒคํธ ์คํ ์ด์ ์์
- ์ค๋ ์ท ์์ฑ: ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ์ด๋ฒคํธ ์คํ ์ด์ ๊ธฐ๋ก๋ ์ฐ์ฐ์ DB ์ค๋ ์ท์ ์ฌ์(Replay)ํ์ฌ ์ต์ ์ํ๋ฅผ DB์ ์ ์ฅํจ
- ์ต์ ์ํ ์ ๊ณต: ํด๋ผ์ด์ธํธ๊ฐ ์ต์ ์ํ๋ฅผ ์์ฒญํ๋ฉด, ์๋ฒ๋ DB ์ค๋ ์ท์ ์ ์ฅ๋ ์ํ๋ฅผ ๊ฐ์ ธ์จ ๋ค ์ดํ์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ํด ์ต์ ์ ๋ณด๋ฅผ ์ ๊ณต
- Nocta์ CRDT๋ ์ฐ์ฐ ๊ธฐ๋ฐ์ด๋ฏ๋ก, ํด๋ผ์ด์ธํธ๊ฐ ๋ฌธ์๋ฅผ ํธ์งํ๋ฉด ๊ทธ CRDT ์ฐ์ฐ์ ์ด๋ฒคํธ๋ก ๋ณด๊ดํจ
- ์๋ฒ๋ ๋ฐ์ ์ฐ์ฐ์ ์ด๋ฒคํธ ์คํ ์ด์ ์ ์ฅํ๊ณ , ๋์์ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์๊ฒ ๋ธ๋ก๋์บ์คํธํจ
- ์ผ์ ์ฃผ๊ธฐ๋ก ์ด๋ฒคํธ๋ฅผ ์ฌ์ํ์ฌ DB์ ์๋ก์ด ์ค๋ ์ท์ ์ ์ฅํจ
- ๊ณผ์
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ์ฐ์ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ ์ํฌ์คํ์ด์ค ๋ฐ์ดํฐ์ ์ฆ์ ์ ์ฉํ๋ ๋ก์ง์ ์ ๊ฑฐํ๊ณ ์ฐ์ฐ ์์ฒด๋ฅผ ์ด๋ฒคํธ ์คํ ์ด์ ์ ์ฅํ๊ณ ๋ธ๋ก๋์บ์คํธํ๋๋ก ์์
- ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ์ด๋ฒคํธ ์คํ ์ด์ ์์ธ ์ฐ์ฐ์ ์ฌ์ํด ์ํฌ์คํ์ด์ค ์ํ๋ฅผ ์ ๋ฐ์ดํธ(์ค๋ ์ท ์์ฑ)ํ๊ณ DB์ ๋ฐ์
- ํด๋ผ์ด์ธํธ๊ฐ ํน์ ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด DB์ ์ ์ฅ๋ ์ค๋ ์ท๊ณผ ์ด๋ฒคํธ ์คํ ์ด์ ์ ์ฌ๋ ์ฐ์ฐ์ ์กฐํฉํด ์ต์ ์ํ๋ฅผ ๋ฐํ
- ๊ฒฐ๊ณผ
- CRDT ์ฐ์ฐ์ ์ด๋ฒคํธ๋ก ์ ์ฅํ๋ ๊ตฌ์กฐ๋ก ์ ํํ๋ฉด์ ์๋ ์ด์ ํ๋ณด
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ฐ์: ์ํฌ์คํ์ด์ค ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋์ง ์๊ณ , ์ฐ์ฐ๋ง์ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ด ํฌ๊ฒ ๊ฐ์
- ์ด๋ ฅ ์ถ์ ๋ฐ ๋ณต๊ตฌ ์ฉ์ด: ์ด๋ฒคํธ๊ฐ ์์ฐจ์ ์ผ๋ก ๊ธฐ๋ก๋์ด ์์ผ๋ฏ๋ก, ๊ณผ๊ฑฐ ๋ณ๊ฒฝ ๋ด์ญ์ ์ฝ๊ฒ ์ฌ์ ๊ฐ๋ฅ\
- ์ด๋ ํฅํ ๋ฒ์ ๊ด๋ฆฌ๋ ์ฅ์ ๋ณต๊ตฌ ๋ก์ง์ ์ถ๊ฐํ๊ธฐ์ ์ ๋ฆฌํจ
- Redis ์ ์ฉ ์ ํจ์จ์ฑ ์ฆ๊ฐ(ํ์ฅ์ฑ): ์ถํ Redis ๋ฑ ์ธ๋ถ ์บ์๋ฅผ ๋์ ํ๋๋ผ๋ ์ ์ฒด ๋ฐ์ดํฐ๊ฐ ์๋ ์ฐ์ฐ๋ง ์ ์ฅํ๋ฏ๋ก, ์บ์ ์ฉ๋์ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์์
- CRDT ์ฐ์ฐ์ ์ด๋ฒคํธ๋ก ์ ์ฅํ๋ ๊ตฌ์กฐ๋ก ์ ํํ๋ฉด์ ์๋ ์ด์ ํ๋ณด