์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ๋ฅผ ๋ง์คํฐํ์ฌ ๋ค์ํ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ ์ ๋ฐ์ ๊ฑธ์ณ ์ํํ ํตํฉ๊ณผ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ: ํ๋ ์์ํฌ ๊ฐ ํธํ์ฑ ๊ฒ์ฆ
์ค๋๋ ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๋ ํ๋ก ํธ์๋ ํ๊ฒฝ์์ ๊ฐ๋ฐ์๋ค์ ์ฌ์ฌ์ฉ์ฑ, ์ ์ง๋ณด์์ฑ, ๊ฐ๋ฐ์ ํจ์จ์ฑ์ ์ฆ์ง์ํค๋ ์๋ฃจ์ ์ ๋์์์ด ์ฐพ๊ณ ์์ต๋๋ค. ์น ์ปดํฌ๋ํธ๋ ์บก์ํ๋๊ณ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋ UI ์์๋ฅผ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ํ์ค์ผ๋ก ๋ถ์ํ์ผ๋ฉฐ, ์ด๋ ์ฌ๋ฌ ๋ค๋ฅธ ํ๋ก์ ํธ์ ์ฌ์ง์ด ๋ค๋ฅธ JavaScript ํ๋ ์์ํฌ์์๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์น ์ปดํฌ๋ํธ์ ์ง์ ํ ํ์ ๊ธฐ๋ณธ ํ๋ ์์ํฌ์ ๊ด๊ณ์์ด ์ด๋ค ํ๊ฒฝ์๋ ์ํํ๊ฒ ํตํฉ๋ ์ ์์ ๋ ๋ฐํ๋ฉ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์๊ฒฉํ ์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ๊ฐ ๊ฐ์ฅ ์ค์ํด์ง๋๋ค. ์ด ๊ธ์์๋ ์ฌ๋ฌ๋ถ์ ์น ์ปดํฌ๋ํธ๊ฐ ๋ค์ํ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์๋ํ์ฌ ์ง์ ํ ํ๋ ์์ํฌ ๊ฐ ํธํ์ฑ์ ์ด์งํ๋ ๋ฐ ํ์ํ ํต์ฌ์ ์ธ ์ธก๋ฉด๋ค์ ์ฌ๋ ์๊ฒ ๋ค๋ฃน๋๋ค.
์น ์ปดํฌ๋ํธ์ ๊ฐ๋ฅ์ฑ
์น ์ปดํฌ๋ํธ๋ ์น ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ๋ํ๊ธฐ ์ํด ์๋กญ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์บก์ํ๋ ์ปค์คํ HTML ํ๊ทธ๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ์น ํ๋ซํผ API ๋ชจ์์ ๋๋ค. ํต์ฌ ๊ธฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Custom Elements: ์ปค์คํ HTML ์์์ ๊ทธ ๋์์ ์ ์ํ๊ณ ์ธ์คํด์คํํ๋ API.
- Shadow DOM: DOM๊ณผ CSS๋ฅผ ์บก์ํํ์ฌ ์คํ์ผ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ปดํฌ๋ํธ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์ฅํ๋ API.
- HTML Templates: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋งํฌ์
๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํ
<template>๋ฐ<slot>์์.
์น ์ปดํฌ๋ํธ์ ๋ณธ์ง์ ์ธ ํ๋ ์์ํฌ ๋ ๋ฆฝ์ ํน์ฑ์ ์ด๋ค JavaScript ํ๋ ์์ํฌ์๋ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋๋ก ์ค๊ณ๋์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ฝ์์ ์ปดํฌ๋ํธ๊ฐ React, Angular, Vue.js, Svelte์ ๊ฐ์ ๋ค์ํ ์ธ๊ธฐ ํ๋ ์์ํฌ ๋ฐ ์์ HTML/JavaScript ๋ด์์ ์ฌ๋ฐ๋ฅด๊ฒ ํตํฉ๋๊ณ ๊ธฐ๋ฅํ ๋๋ง ์์ ํ ์คํ๋ฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ํธ ์ด์ฉ์ฑ ํ ์คํธ๋ผ๋ ์ค์ํ ๋ถ์ผ๋ก ์ด์ด์ง๋๋ค.
์ํธ ์ด์ฉ์ฑ ํ ์คํธ๊ฐ ์ ์ค์ํ๊ฐ?
ํฌ๊ด์ ์ธ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ๊ฐ ์๋ค๋ฉด "ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ค"๋ ์ฝ์์ ์๋นํ ๋์ ๊ณผ์ ๊ฐ ๋ ์ ์์ต๋๋ค:
- ์ผ๊ด์ฑ ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ํ๋ ์์ํฌ ๋ด์์ ์ฌ์ฉ๋ ๋ ๋ค๋ฅด๊ฒ ๋ ๋๋ง๋๊ฑฐ๋ ์์์น ๋ชปํ๊ฒ ๋์ํ์ฌ ๋จํธ์ ์ด๊ณ ํผ๋์ค๋ฌ์ด ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ ์ค๋ฒํค๋ ์ฆ๊ฐ: ๊ฐ๋ฐ์๋ ์ํํ๊ฒ ํตํฉ๋์ง ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ํด ํ๋ ์์ํฌ๋ณ ๋ํผ(wrapper)๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์ฑํด์ผ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฌ์ฌ์ฉ์ฑ์ ์ด์ ์ ์์์ํต๋๋ค.
- ์ ์ง๋ณด์์ ์ ๋ชฝ: ์ฌ๋ฌ ๋ค๋ฅธ ํ๊ฒฝ์์ ๋ถ๊ท์นํ๊ฒ ๋์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋๋ฒ๊น ํ๊ณ ์ ์ง๋ณด์ํ๋ ๊ฒ์ ์๋นํ ๋ถ๋ด์ด ๋ฉ๋๋ค.
- ์ ํ์ ์ธ ์ฑํ: ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฃผ์ ํ๋ ์์ํฌ ์ ๋ฐ์์ ์์ ์ ์ผ๋ก ์๋ํ๋ค๋ ๊ฒ์ด ์ ์ฆ๋์ง ์์ผ๋ฉด, ๊ทธ ์ฑํ์ ์ฌ๊ฐํ๊ฒ ์ ํ๋์ด ์ ์ฒด์ ์ธ ๊ฐ์น๊ฐ ๊ฐ์ํ ๊ฒ์ ๋๋ค.
- ์ ๊ทผ์ฑ ๋ฐ ์ฑ๋ฅ ์ ํ: ํ๋ ์์ํฌ๋ณ ๋ ๋๋ง์ด๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ๋จ์ผ ํ๋ ์์ํฌ ํ ์คํธ ํ๊ฒฝ์์๋ ๋๋ฌ๋์ง ์์ ์ ์๋ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋์น ์๊ฒ ์ ๋ฐํ ์ ์์ต๋๋ค.
๋ค์ํ ๊ธฐ์ ์คํ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ์น ์ปดํฌ๋ํธ์ ์ง์ ํ ์ํธ ์ด์ฉ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ ๋จ์ํ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์๋๋ผ, ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ๋ขฐํ ์ ์๋ ๊ฐ๋ฐ์ ์ํ ํ์ ์๊ฑด์ ๋๋ค.
์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ์ ํต์ฌ ์์ญ
ํจ๊ณผ์ ์ธ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ๋ ๋ช ๊ฐ์ง ํต์ฌ ์์ญ์ ์ด์ ์ ๋ง์ถ ์ฒด๊ณ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ํ์๋ก ํฉ๋๋ค:
1. ๊ธฐ๋ณธ ๋ ๋๋ง ๋ฐ ์์ฑ(Attribute/Property) ์ฒ๋ฆฌ
์ด๋ ํ ์คํธ์ ๊ธฐ์ด ๋จ๊ณ์ ๋๋ค. ์น ์ปดํฌ๋ํธ๋ ์ด๋ป๊ฒ ์ธ์คํด์คํ๋๋ ๊ด๊ณ์์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋๊ณ ์์ฑ(attribute) ๋ฐ ํ๋กํผํฐ(property)์ ์์๋๋ก ๋ฐ์ํด์ผ ํฉ๋๋ค:
- ์์ฑ ๋ฐ์ธ๋ฉ(Attribute Binding): ๋ฌธ์์ด ์์ฑ์ด ์ด๋ป๊ฒ ์ ๋ฌ๋๊ณ ํ์ฑ๋๋์ง ํ ์คํธํฉ๋๋ค. ํ๋ ์์ํฌ๋ ์ข ์ข ์์ฑ ๋ฐ์ธ๋ฉ์ ๋ํด ๋ค๋ฅธ ๊ท์น(์: kebab-case vs. camelCase)์ ๊ฐ์ง๋๋ค.
- ํ๋กํผํฐ ๋ฐ์ธ๋ฉ(Property Binding): ๋ณต์กํ ๋ฐ์ดํฐ ํ์
(๊ฐ์ฒด, ๋ฐฐ์ด, ๋ถ๋ฆฌ์ธ)์ด ํ๋กํผํฐ๋ก ์ ๋ฌ๋ ์ ์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ ์ข
์ข
ํ๋ ์์ํฌ ๊ฐ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ ์ง์ ์
๋๋ค. ์๋ฅผ ๋ค์ด, React์์๋ ํ๋กญ(prop)์ ์ง์ ์ ๋ฌํ ์ ์์ง๋ง, Vue์์๋
v-bind๋ก ๋ฐ์ธ๋ฉ๋ ์ ์์ต๋๋ค. - ์ด๋ฒคํธ ๋ฐ์(Event Emission): ์ปค์คํ
์ด๋ฒคํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์คํจ์น๋๊ณ ํธ์คํธ ํ๋ ์์ํฌ์์ ์์ ๋ ์ ์๋์ง ํ์ธํฉ๋๋ค. ํ๋ ์์ํฌ๋ ์ข
์ข
์์ฒด ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ(์: React์
onEventName, Vue์@event-name)์ ์ ๊ณตํฉ๋๋ค. - ์ฌ๋กฏ ์ฝํ ์ธ ํฌ์(Slot Content Projection): ์ฌ๋กฏ(๊ธฐ๋ณธ ๋ฐ ๋ช ๋ช ๋ ์ฌ๋กฏ)์ผ๋ก ์ ๋ฌ๋ ์ฝํ ์ธ ๊ฐ ๋ชจ๋ ํ๋ ์์ํฌ์์ ์ ํํ๊ฒ ๋ ๋๋ง๋๋์ง ํ์ธํฉ๋๋ค.
์์: color์ ๊ฐ์ ์์ฑ๊ณผ disabled์ ๊ฐ์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ปค์คํ
๋ฒํผ ์ปดํฌ๋ํธ <my-button>์ ์๊ฐํด ๋ณด์ธ์. ํ
์คํธ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ์์ HTML์์
<my-button color="blue"></my-button>์ฌ์ฉ. - React์์
<my-button color={'blue'}></my-button>์ฌ์ฉ. - Vue์์
<my-button :color='"blue"'></my-button>์ฌ์ฉ. - ๊ฐ ์ปจํ
์คํธ์์
disabledํ๋กํผํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋๊ณ ํด์ ๋ ์ ์๋์ง ํ์ธ.
2. Shadow DOM ์บก์ํ ๋ฐ ์คํ์ผ๋ง
Shadow DOM์ ์น ์ปดํฌ๋ํธ ์บก์ํ์ ํต์ฌ์ ๋๋ค. ๊ทธ๋ฌ๋ ํธ์คํธ ํ๋ ์์ํฌ์ ์คํ์ผ๊ณผ ์ปดํฌ๋ํธ์ Shadow DOM ์คํ์ผ ๊ฐ์ ์ํธ ์์ฉ์ ์ ์คํ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค:
- ์คํ์ผ ๊ฒฉ๋ฆฌ: ์น ์ปดํฌ๋ํธ์ Shadow DOM ๋ด์ ์ ์๋ ์คํ์ผ์ด ์ธ๋ถ๋ก ์ ์ถ๋์ด ํธ์คํธ ํ์ด์ง๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ๋ฏธ์น์ง ์๋์ง ํ์ธํฉ๋๋ค.
- ์คํ์ผ ์์: CSS ๋ณ์(์ปค์คํ ํ๋กํผํฐ)์ ๋ผ์ดํธ DOM(light DOM)์์ ์์๋ ์คํ์ผ์ด Shadow DOM์ผ๋ก ์ด๋ป๊ฒ ์นจํฌํ๋์ง ํ ์คํธํฉ๋๋ค. ๋๋ถ๋ถ์ ์ต์ ํ๋ ์์ํฌ๋ CSS ๋ณ์๋ฅผ ์กด์คํ์ง๋ง, ๊ตฌํ ๋ฒ์ ์ด๋ ํน์ ๊ตฌ์ฑ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ ์ญ ์คํ์ผ์ํธ: ์ ์ญ ์คํ์ผ์ํธ๊ฐ CSS ๋ณ์๋ ํน์ ์ ํ์๋ฅผ ํตํด ๋ช ์์ ์ผ๋ก ์๋๋์ง ์์ ํ, ์ปดํฌ๋ํธ ์คํ์ผ์ ์๋์น ์๊ฒ ๋ฎ์ด์ฐ์ง ์๋์ง ํ์ธํฉ๋๋ค.
- ํ๋ ์์ํฌ๋ณ ์คํ์ผ๋ง ์๋ฃจ์ : ์ผ๋ถ ํ๋ ์์ํฌ๋ ์์ฒด ์คํ์ผ๋ง ์๋ฃจ์ (์: CSS ๋ชจ๋, React์ styled-components, Vue์ ์ค์ฝํ CSS)์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์คํ์ผ ํ๊ฒฝ ๋ด์ ์น ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐ์นํ์ ๋ ์ด๋ป๊ฒ ๋์ํ๋์ง ํ ์คํธํฉ๋๋ค.
์์: ํค๋, ๋ณธ๋ฌธ, ํธํฐ์ ๋ํ ๋ด๋ถ ์คํ์ผ๋ง์ด ์๋ ๋ชจ๋ฌ ์ปดํฌ๋ํธ. ์ด๋ฌํ ๋ด๋ถ ์คํ์ผ์ด ๊ฒฉ๋ฆฌ๋๊ณ ํ์ด์ง์ ์ ์ญ ์คํ์ผ์ด ๋ชจ๋ฌ์ ๋ ์ด์์์ ๊นจ๋จ๋ฆฌ์ง ์๋์ง ํ
์คํธํฉ๋๋ค. ๋ํ, ํธ์คํธ ์์์ ์ ์๋ CSS ๋ณ์๊ฐ ๋ชจ๋ฌ์ Shadow DOM ๋ด์์ ๋ชจ์์ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋์ง ํ
์คํธํฉ๋๋ค(์: --modal-background-color).
3. ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ๋ฐ ์ํ ๊ด๋ฆฌ
์น ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๋ค์ด์ค๊ณ ๋๊ฐ๋์ง๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค:
- ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ: ์ปดํฌ๋ํธ๊ฐ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ(์: ์
๋ ฅ ํ๋)์ ์ง์ํ๋ ๊ฒฝ์ฐ, ์์ฒด ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ ๋ฉ์ปค๋์ฆ(Angular์
ngModel๋๋ Vue์v-model๋ฑ)์ ๊ฐ์ง ํ๋ ์์ํฌ์ ์ํํ๊ฒ ์๋ํ๋์ง ํ์ธํฉ๋๋ค. ์ด๋ ์ข ์ข ์ ๋ ฅ ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ณ ํ๋กํผํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. - ํ๋ ์์ํฌ ์ํ ํตํฉ: ์ปดํฌ๋ํธ์ ๋ด๋ถ ์ํ(์๋ ๊ฒฝ์ฐ)๊ฐ ํธ์คํธ ํ๋ ์์ํฌ์ ์ํ ๊ด๋ฆฌ ์๋ฃจ์ (์: Redux, Vuex, Zustand, Angular ์๋น์ค)๊ณผ ์ด๋ป๊ฒ ์ํธ ์์ฉํ๋์ง ํ ์คํธํฉ๋๋ค.
- ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ: ํ๋กํผํฐ๋ก ์ ๋ฌ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ๋ฐฐ์ด์ด, ํนํ ์ปดํฌ๋ํธ๋ ํ๋ ์์ํฌ ๋ด์์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๋์ง ํ์ธํฉ๋๋ค.
์์: Vue์์ v-model์ ์ฌ์ฉํ๋ ํผ ์
๋ ฅ ์ปดํฌ๋ํธ. ์น ์ปดํฌ๋ํธ๋ ์ ๊ฐ์ ํฌํจํ๋ `input` ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ์ผ ํ๋ฉฐ, Vue์ v-model์ ์ด๋ฅผ ์บก์ฒํ์ฌ ๋ฐ์ธ๋ฉ๋ ๋ฐ์ดํฐ ํ๋กํผํฐ๋ฅผ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
4. ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ ํต์
์ปดํฌ๋ํธ๋ ์ฃผ๋ณ ํ๊ฒฝ๊ณผ ํต์ ํด์ผ ํฉ๋๋ค. ํ๋ ์์ํฌ ์ ๋ฐ์ ๊ฑธ์น ์ด๋ฒคํธ ์ฒ๋ฆฌ ํ ์คํธ๋ ํ์์ ์ ๋๋ค:
- ์ปค์คํ ์ด๋ฒคํธ ์ด๋ฆ: ์ปค์คํ ์ด๋ฒคํธ ์ด๋ฆ๊ณผ ๋ฐ์ดํฐ ํ์ด๋ก๋์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ๋ค์ดํฐ๋ธ ๋ธ๋ผ์ฐ์ ์ด๋ฒคํธ: ๋ค์ดํฐ๋ธ ๋ธ๋ผ์ฐ์ ์ด๋ฒคํธ(
click,focus,blur๋ฑ)๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ํ๋๊ณ ํธ์คํธ ํ๋ ์์ํฌ์์ ์บก์ฒ๋ ์ ์๋์ง ํ์ธํฉ๋๋ค. - ํ๋ ์์ํฌ ์ด๋ฒคํธ ๋ํผ: ์ผ๋ถ ํ๋ ์์ํฌ๋ ๋ค์ดํฐ๋ธ ๋๋ ์ปค์คํ ์ด๋ฒคํธ๋ฅผ ๋ํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ํผ๊ฐ ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ฆฌ์ค๋ ๋ถ์ฐฉ์ ๋ฐฉํดํ์ง ์๋์ง ํ ์คํธํฉ๋๋ค.
์์: ์ขํ์ ํจ๊ป 'drag-end' ์ปค์คํ
์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ๋๋๊ทธ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ. ์ด ์ด๋ฒคํธ๊ฐ React ์ปดํฌ๋ํธ์์๋ onDragEnd={handleDragEnd}๋ก, Vue ์ปดํฌ๋ํธ์์๋ @drag-end="handleDragEnd"๋ก ํฌ์ฐฉ๋ ์ ์๋์ง ํ
์คํธํฉ๋๋ค.
5. ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ
์น ์ปดํฌ๋ํธ์๋ ์ ์๋ ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ(์: `connectedCallback`, `disconnectedCallback`, `attributeChangedCallback`)์ด ์์ต๋๋ค. ์ด๋ค์ ํ๋ ์์ํฌ ์๋ช ์ฃผ๊ธฐ์์ ์ํธ ์์ฉ์ ์ ์คํ ๊ณ ๋ ค๊ฐ ํ์ํฉ๋๋ค:
- ์ด๊ธฐํ ์์: ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ์ด ํธ์คํธ ํ๋ ์์ํฌ์ ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ ํ ๊ณผ ๊ด๋ จํ์ฌ ์ด๋ป๊ฒ ์คํ๋๋์ง ์ดํดํฉ๋๋ค.
- DOM ์ฐ๊ฒฐ/๋ถ๋ฆฌ: ํ๋ ์์ํฌ์ ๋ ๋๋ง ์์ง์ ์ํด ์ปดํฌ๋ํธ๊ฐ DOM์ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ๋ `connectedCallback`๊ณผ `disconnectedCallback`์ด ์์ ์ ์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋๋์ง ํ์ธํฉ๋๋ค.
- ์์ฑ ๋ณ๊ฒฝ: `attributeChangedCallback`์ด ์์ฑ ๋ณ๊ฒฝ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด์ฐฐํ๋์ง ํ์ธํฉ๋๋ค. ํนํ ํ๋ ์์ํฌ๊ฐ ์์ฑ์ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ ๋ ๊ทธ๋ ์ต๋๋ค.
์์: `connectedCallback`์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ปดํฌ๋ํธ. ์ด fetch ์์ฒญ์ด Angular, React ๋๋ Vue์ ์ํด ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ํ ๋ฒ๋ง ์ด๋ฃจ์ด์ง๋์ง, ๊ทธ๋ฆฌ๊ณ `disconnectedCallback`์ด ํธ์ถ๋ ๋ ์ ๋๋ก ์ ๋ฆฌ๋๋์ง(์: fetch ์ค๋จ) ํ ์คํธํฉ๋๋ค.
6. ์ ๊ทผ์ฑ(A11y)
์ ๊ทผ์ฑ์ ์ต์ฐ์ ์์์ฌ์ผ ํฉ๋๋ค. ์ํธ ์ด์ฉ์ฑ ํ ์คํธ๋ ์ ๊ทผ์ฑ ํ์ค์ด ๋ชจ๋ ํ๋ ์์ํฌ์์ ์ ์ง๋๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค:
- ARIA ์์ฑ: ์ ์ ํ ARIA ์ญํ , ์ํ, ํ๋กํผํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๊ณ ๋ณด์กฐ ๊ธฐ์ ์ ์ ๊ทผ ๊ฐ๋ฅํ์ง ํ์ธํฉ๋๋ค.
- ํค๋ณด๋ ๋ด๋น๊ฒ์ด์ : ๊ฐ ํ๋ ์์ํฌ์ ์ปจํ ์คํธ ๋ด์์ ์ปดํฌ๋ํธ๊ฐ ํค๋ณด๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ํ์ ๋ฐ ์กฐ์ ๊ฐ๋ฅํ์ง ํ ์คํธํฉ๋๋ค.
- ํฌ์ปค์ค ๊ด๋ฆฌ: Shadow DOM ๋ด์ ํฌ์ปค์ค ๊ด๋ฆฌ์ ํธ์คํธ ํ๋ ์์ํฌ์ ํฌ์ปค์ค ๊ด๋ฆฌ ์ ๋ต๊ณผ์ ์ํธ ์์ฉ์ด ๊ฒฌ๊ณ ํ์ง ํ์ธํฉ๋๋ค.
- ์๋งจํฑ HTML: ๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ ์๋ฏธ์ ์ ์ ํ HTML ์์๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธํฉ๋๋ค.
์์: ์ปค์คํ ๋ค์ด์ผ๋ก๊ทธ ์น ์ปดํฌ๋ํธ๋ ํฌ์ปค์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ์ด๋ ค ์์ ๋๋ ๋ค์ด์ผ๋ก๊ทธ ๋ด์ ํฌ์ปค์ค๋ฅผ ๊ฐ๋๊ณ , ๋ซํ ๋๋ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์์๋ก ํฌ์ปค์ค๋ฅผ ๋ณต์ํด์ผ ํฉ๋๋ค. ์ด ๋์์ ๋ค์ด์ผ๋ก๊ทธ๊ฐ Angular ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ์์ HTML ํ์ด์ง์์ ์ฌ์ฉ๋๋ ์ผ๊ด๋์ด์ผ ํฉ๋๋ค.
7. ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
์ฑ๋ฅ์ ํ๋ ์์ํฌ๊ฐ ์น ์ปดํฌ๋ํธ์ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ์ํด ์ํฅ์ ๋ฐ์ ์ ์์ต๋๋ค:
- ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ: ๋ค๋ฅธ ํ๋ ์์ํฌ์ ํตํฉ๋์์ ๋ ์ปดํฌ๋ํธ๊ฐ ์ผ๋ง๋ ๋นจ๋ฆฌ ๋ ๋๋ง๋๋์ง ์ธก์ ํฉ๋๋ค.
- ์ ๋ฐ์ดํธ ์ฑ๋ฅ: ์ํ ๋ณ๊ฒฝ ๋ฐ ์ฌ๋ ๋๋ง ์ค ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํฉ๋๋ค. ์ปดํฌ๋ํธ์ ์ํธ ์์ฉํ๋ ํ๋ ์์ํฌ์ ๋นํจ์จ์ ์ธ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๋ ๊ณผ๋ํ DOM ์กฐ์์ ์๋ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ๋ฒ๋ค ํฌ๊ธฐ: ์น ์ปดํฌ๋ํธ ์์ฒด๋ ์ข ์ข ๊ฐ๋ณ์ง๋ง, ํ๋ ์์ํฌ ๋ํผ๋ ๋น๋ ๊ตฌ์ฑ์ด ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์์: ๋ณต์กํ ๋ฐ์ดํฐ ๊ทธ๋ฆฌ๋ ์น ์ปดํฌ๋ํธ. React ์ฑ๊ณผ ๋ฐ๋๋ผ JavaScript ์ฑ์์ ์์ฒ ๊ฐ์ ํ์ผ๋ก ์ฑ์์ก์ ๋์ ์คํฌ๋กค ์ฑ๋ฅ๊ณผ ์ ๋ฐ์ดํธ ์๋๋ฅผ ํ ์คํธํฉ๋๋ค. CPU ์ฌ์ฉ๋๊ณผ ํ๋ ์ ๋๋กญ์ ์ฐจ์ด๋ฅผ ์ฐพ์ต๋๋ค.
8. ํ๋ ์์ํฌ๋ณ ๋ฏธ๋ฌํ ์ฐจ์ด์ ์์ง ์ผ์ด์ค
๊ฐ ํ๋ ์์ํฌ๋ ์น ํ์ค์ ๋ํ ์์ฒด์ ์ธ ํน์ง๊ณผ ํด์์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฒ ์ ํ ํ ์คํธ๋ ์ด๋ฌํ ๊ฒ๋ค์ ๋ฐ๊ฒฌํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค:
- ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR): ์น ์ปดํฌ๋ํธ๊ฐ SSR ์ค์ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ? ์ผ๋ถ ํ๋ ์์ํฌ๋ ์ด๊ธฐ ์๋ฒ ๋ ๋๋ง ํ ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ด๋๋ ์ด์ (hydrate)ํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ ์ ์์ต๋๋ค.
- ํ์ ์์คํ (TypeScript): TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์น ์ปดํฌ๋ํธ์ ๋ํ ํ์ ์ ์๊ฐ ํ๋ ์์ํฌ๊ฐ ์ด๋ฅผ ์๋นํ๋ ๋ฐฉ์๊ณผ ํธํ๋๋์ง ํ์ธํฉ๋๋ค.
- ํด๋ง ๋ฐ ๋น๋ ํ๋ก์ธ์ค: ๋ค๋ฅธ ๋น๋ ๋๊ตฌ(Webpack, Vite, Rollup)์ ํ๋ ์์ํฌ CLI๋ ์น ์ปดํฌ๋ํธ๊ฐ ๋ฒ๋ค๋ง๋๊ณ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
์์: Angular Universal์์ SSR๋ก ์น ์ปดํฌ๋ํธ ํ ์คํธ. ์ปดํฌ๋ํธ๊ฐ ์๋ฒ์์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋ ๋ค์ ์ค๋ฅ๋ ์๊ธฐ์น ์์ ์ฌ๋ ๋๋ง ์์ด ํด๋ผ์ด์ธํธ์์ ์ ๋๋ก ํ์ด๋๋ ์ด์ ๋๋์ง ํ์ธํฉ๋๋ค.
ํจ๊ณผ์ ์ธ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ ์ ๋ต
๊ฒฌ๊ณ ํ ํ ์คํธ ์ ๋ต์ ์ฑํํ๋ ๊ฒ์ด ์ ๋ขฐํ ์ ์๋ ํ๋ ์์ํฌ ๊ฐ ํธํ์ฑ์ ๋ฌ์ฑํ๋ ํต์ฌ์ ๋๋ค:
1. ํฌ๊ด์ ์ธ ํ ์คํธ ์ค์ํธ ์ค๊ณ
ํ ์คํธ ์ค์ํธ๋ ์์์ ์ธ๊ธํ ๋ชจ๋ ์ค์ํ ์์ญ์ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค. ๋ค์์ ๊ณ ๋ คํ์ธ์:
- ๋จ์ ํ ์คํธ: ๊ฐ๋ณ ์ปดํฌ๋ํธ ๋ก์ง ๋ฐ ๋ด๋ถ ์ํ๋ฅผ ์ํ ํ ์คํธ.
- ํตํฉ ํ ์คํธ: ์น ์ปดํฌ๋ํธ์ ํธ์คํธ ํ๋ ์์ํฌ ๊ฐ์ ์ํธ ์์ฉ์ ํ์ธํ๊ธฐ ์ํ ํ ์คํธ. ์ฌ๊ธฐ์ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ๊ฐ ์ง๊ฐ๋ฅผ ๋ฐํํฉ๋๋ค.
- End-to-End (E2E) ํ ์คํธ: ๋ค๋ฅธ ํ๋ ์์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ฌ์ฉ์ ํ๋ฆ์ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํ ํ ์คํธ.
2. ํ ์คํธ ํ๋ ์์ํฌ ํ์ฉ
๊ฒ์ฆ๋ ํ ์คํธ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ธ์:
- Jest/Vitest: ๋จ์ ๋ฐ ํตํฉ ํ ์คํธ๋ฅผ ์ํ ๊ฐ๋ ฅํ JavaScript ํ ์คํธ ํ๋ ์์ํฌ.
- Playwright/Cypress: ์ฌ๋ฌ ํ๋ ์์ํฌ์์ ์ค์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ ์ ์๋ End-to-End ํ ์คํธ์ฉ ๋๊ตฌ.
- WebdriverIO: ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๋ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ E2E ํ ์คํธ ํ๋ ์์ํฌ.
3. ํ๋ ์์ํฌ๋ณ ํ ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
์ํธ ์ด์ฉ์ฑ์ ํ ์คํธํ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ๊ฐ ๋์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ณ ์ ์ฉ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ํ ์คํธ ํ๋ค์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด:
- React ํ ์คํธ ์ฑ: ์น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ์ต์ํ์ React ์ฑ.
- Angular ํ ์คํธ ์ฑ: ์ปดํฌ๋ํธ๋ฅผ ์์ฐํ๋ ๊ฐ๋จํ Angular ํ๋ก์ ํธ.
- Vue ํ ์คํธ ์ฑ: ๊ธฐ๋ณธ์ ์ธ Vue.js ์ ํ๋ฆฌ์ผ์ด์ .
- Svelte ํ ์คํธ ์ฑ: Svelte ํ๋ก์ ํธ.
- ์์ HTML/JS ์ฑ: ํ์ค ์น ๋์์ ๊ธฐ์ค์ .
์ด๋ฌํ ์ฑ ๋ด์์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ฌ์ ์ธ ํจ์ ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋์์ผ๋ก ํ๋ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
4. ์๋ํ๋ ํ ์คํธ ๋ฐ CI/CD ํตํฉ
๊ฐ๋ฅํ ํ ํ ์คํธ๋ฅผ ์๋ํํ๊ณ ์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ(CI/CD) ํ์ดํ๋ผ์ธ์ ํตํฉํ์ธ์. ์ด๋ฅผ ํตํด ๋ชจ๋ ์ฝ๋ ๋ณ๊ฒฝ์ด ๋ชจ๋ ๋์ ํ๋ ์์ํฌ์ ๋ํด ์๋์ผ๋ก ๊ฒ์ฆ๋์ด ํ๊ท(regression)๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
CI/CD ์ํฌํ๋ก์ฐ ์์:
- ์ฝ๋๋ฅผ ๋ฆฌํฌ์งํ ๋ฆฌ์ ํธ์ํฉ๋๋ค.
- CI ์๋ฒ๊ฐ ๋น๋๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
- ๋น๋ ํ๋ก์ธ์ค๋ ์น ์ปดํฌ๋ํธ๋ฅผ ์ปดํ์ผํ๊ณ React, Angular, Vue์ ๋ํ ํ ์คํธ ํ๊ฒฝ์ ์ค์ ํฉ๋๋ค.
- ๊ฐ ํ๊ฒฝ์ ๋ํด ์๋ํ๋ ํ ์คํธ(๋จ์, ํตํฉ, E2E)๊ฐ ์คํ๋ฉ๋๋ค.
- ํ ์คํธ ์ฑ๊ณต ๋๋ ์คํจ ์ ์๋ฆผ์ด ์ ์ก๋ฉ๋๋ค.
- ํ ์คํธ๊ฐ ํต๊ณผํ๋ฉด ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ด ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
5. ์ฑ๋ฅ ํ๋กํ์ผ๋ง ๋ฐ ๋ชจ๋ํฐ๋ง
์๋ํ๋ ์ค์ํธ์ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ํตํฉํ์ธ์. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์ ๋ฌธ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํ๋ ์์ํฌ ์ปจํ ์คํธ์์ ๋ก๋ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ์ํธ ์์ฉ ์๋ต์ฑ๊ณผ ๊ฐ์ ์ฃผ์ ์งํ๋ฅผ ์ธก์ ํฉ๋๋ค.
6. ํ๋ ์์ํฌ ํตํฉ์ ์ํ ๋ฌธ์ํ
์น ์ปดํฌ๋ํธ๋ฅผ ์ธ๊ธฐ ์๋ ํ๋ ์์ํฌ์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ธ์. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ์ค์น ์ง์นจ.
- ์์ฑ ๋ฐ ํ๋กํผํฐ ๋ฐ์ธ๋ฉ ์์ .
- ์ปค์คํ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ.
- ํ๋ ์์ํฌ๋ณ ๋ฏธ๋ฌํ ์ฐจ์ด(์: SSR)๋ฅผ ๋ค๋ฃจ๋ ํ.
์ด ๋ฌธ์๋ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ์์ ๋ฐ๊ฒฌ๋ ์ฌํญ์ ๋ฐ์ํด์ผ ํฉ๋๋ค.
7. ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ ๋ฐ ๋ฒ๊ทธ ๋ณด๊ณ
์ฌ์ฉ์๋ค์ด ๋ง์ฃผ์น๋ ์ํธ ์ด์ฉ์ฑ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ๋๋ก ์ฅ๋ คํ์ธ์. ๋ค์ํ๊ณ ๊ธ๋ก๋ฒํ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์ฌ๋ฌ๋ถ์ด ๋์ณค์ ์ ์๋ ์์ง ์ผ์ด์ค๋ฅผ ํ์ฐ์ ์ผ๋ก ๋ฐ๊ฒฌํ ๊ฒ์ ๋๋ค. ๋ฒ๊ทธ ๋ณด๊ณ ๋ฅผ ์ํ ๋ช ํํ ์ฑ๋์ ๊ตฌ์ถํ๊ณ ๋ณด๊ณ ๋ ๋ฌธ์ ๋ฅผ ์ ๊ทน์ ์ผ๋ก ํด๊ฒฐํ์ธ์.
์ํธ ์ด์ฉ์ฑ์ ์ํ ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ ์คํธ ์ธํ๋ผ๋ฅผ ์ฒ์๋ถํฐ ๊ตฌ์ถํ ์๋ ์์ง๋ง, ์ฌ๋ฌ ๋๊ตฌ๊ฐ ํ๋ก์ธ์ค๋ฅผ ํฌ๊ฒ ๊ฐ์ํํ ์ ์์ต๋๋ค:
- LitElement/Lit: ์น ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์์ฒด์ ์ผ๋ก ๊ด๋ฒ์ํ ํ๋ ์์ํฌ ๊ฐ ํ ์คํธ๋ฅผ ๊ฑฐ์นฉ๋๋ค. ๋ด์ฅ๋ ํ ์คํธ ์ ํธ๋ฆฌํฐ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
- Stencil: ํ์ค ์น ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ์ปดํ์ผ๋ฌ์ด์ง๋ง ํ๋ ์์ํฌ ๋ฐ์ธ๋ฉ์ ์ํ ๋๊ตฌ๋ ์ ๊ณตํ์ฌ ํตํฉ ๋ฐ ํ ์คํธ๋ฅผ ๋จ์ํํฉ๋๋ค.
- Testing Library (React Testing Library, Vue Testing Library ๋ฑ): ์ฃผ๋ก ํ๋ ์์ํฌ๋ณ ์ปดํฌ๋ํธ๋ฅผ ์ํ ๊ฒ์ด์ง๋ง, ์ฌ์ฉ์ ์ํธ ์์ฉ ๋ฐ ์ ๊ทผ์ฑ ํ ์คํธ ์์น์ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. ํ๋ ์์ํฌ๊ฐ ์ปค์คํ ์๋ฆฌ๋จผํธ์ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ํ ์คํธํ๋ ๋ฐ ์ด๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
- ํ๋ ์์ํฌ๋ณ ๋ํผ: ๊ฐ ํ๋ ์์ํฌ์ ๋ํด ์น ์ปดํฌ๋ํธ๋ฅผ ์ํ ๊ฒฝ๋ ๋ํผ๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. ์ด๋ฌํ ๋ํผ๋ ํ๋ ์์ํฌ๋ณ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ๊ท์น๊ณผ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฒ๋ฆฌํ์ฌ ํตํฉ์ ๋ ์ํํ๊ฒ ํ๊ณ ํ ์คํธ๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, React ๋ํผ๋ React ํ๋กญ์ ์น ์ปดํฌ๋ํธ ํ๋กํผํฐ์ ์ด๋ฒคํธ๋ก ๋ณํํ ์ ์์ต๋๋ค.
์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ์ ์ํ ๊ธ๋ก๋ฒ ๊ณ ๋ ค์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ์น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ๊ณ ํ ์คํธํ ๋, ์์ํ ๊ธฐ์ ์ ํธํ์ฑ์ ๋์ด ๋ช ๊ฐ์ง ์์ธ์ด ์์ฉํฉ๋๋ค:
- ์ง์ญํ ๋ฐ ๊ตญ์ ํ(i18n/l10n): ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ์ธ์ด, ๋ ์ง ํ์, ์ซ์ ํ์์ ์ฝ๊ฒ ์์ฉํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ํ๋ ์์ํฌ ๊ธฐ๋ฐ ์ง์ญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ปดํฌ๋ํธ์ ํ ์คํธ ์ฝํ ์ธ ๋ฐ ์์๊ณผ ์ด๋ป๊ฒ ์ํธ ์์ฉํ๋์ง ํ์ธํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ์๊ฐ๋ ๋ฐ ํตํ: ์ปดํฌ๋ํธ๊ฐ ์๊ฐ์ด๋ ๊ธ์ ์ ๊ฐ์น๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ, ํนํ ์ฌ์ฉ์๋ณ ์ค์ ์ ๊ด๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉ๋ ๋ ๋ค๋ฅธ ์๊ฐ๋์ ํตํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ค๋ฅธ ์ง์ญ์์์ ์ฑ๋ฅ: ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ ์ ์ธ๊ณ์ ์ผ๋ก ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์๋ฎฌ๋ ์ด์ ๋ ๋๋ฆฐ ๋คํธ์ํฌ์์ ์น ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ํ ์คํธํ์ฌ ์ธํฐ๋ท ์ธํ๋ผ๊ฐ ๋ ๋ฐ๋ฌ๋ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ์ข์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ง์: ์น ์ปดํฌ๋ํธ๋ ๋๋ฆฌ ์ง์๋์ง๋ง, ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ํน์ ๋ธ๋ผ์ฐ์ ๋ฒ์ ์๋ ๋ถ์ผ์น๊ฐ ์์ ์ ์์ต๋๋ค. ๋ค์ํ ๊ธ๋ก๋ฒ ์์ฅ์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ณ ๋ คํ์ฌ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธํฉ๋๋ค.
์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ์ ๋ฏธ๋
์น ์ปดํฌ๋ํธ๊ฐ ์ฑ์ํ๊ณ ํ๋ ์์ํฌ๊ฐ ์ด๋ฅผ ์ ์ ๋ ์์ฉํจ์ ๋ฐ๋ผ, ๋ค์ดํฐ๋ธ ์น ์ปดํฌ๋ํธ์ ํ๋ ์์ํฌ๋ณ ์ปดํฌ๋ํธ ๊ฐ์ ๊ฒฝ๊ณ๋ ๊ณ์ํด์ ํ๋ ค์ง๊ณ ์์ต๋๋ค. ํ๋ ์์ํฌ๋ ์น ์ปดํฌ๋ํธ๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๋ฐ ๋ ๋ฅ์ํด์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ฌํ ํตํฉ์ ๋์ฑ ์ํํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ํด๋ง๋ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ํธ ์ด์ฉ์ฑ ํ ์คํธ์ ์ด์ ์ ์ฑ๋ฅ ๊ฐ์ , ๋ณต์กํ ์๋๋ฆฌ์ค์์์ ์ ๊ทผ์ฑ ํฅ์, ๊ทธ๋ฆฌ๊ณ SSR ๋ฐ ์๋ฒ ์ปดํฌ๋ํธ์ ๊ฐ์ ๊ณ ๊ธ ํ๋ ์์ํฌ ๊ธฐ๋ฅ๊ณผ์ ์ํํ ํตํฉ์ ๋ณด์ฅํ๋ ์ชฝ์ผ๋ก ์ด๋ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๊ฒฐ๋ก
์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ ํ ์คํธ๋ ์ ํ์ ์ธ ๋ถ๊ฐ ๊ธฐ๋ฅ์ด ์๋๋๋ค. ์ด๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ๊ฒฌ๊ณ ํ๋ฉฐ ๋ณดํธ์ ์ผ๋ก ํธํ๋๋ UI ์์๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์๊ตฌ ์ฌํญ์ ๋๋ค. ๋ค์ํ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ์ ํ๊ฒฝ ์ ๋ฐ์ ๊ฑธ์ณ ์์ฑ/ํ๋กํผํฐ ์ฒ๋ฆฌ, Shadow DOM ์บก์ํ, ๋ฐ์ดํฐ ํ๋ฆ, ์ด๋ฒคํธ ํต์ , ์๋ช ์ฃผ๊ธฐ ์ผ๊ด์ฑ, ์ ๊ทผ์ฑ ๋ฐ ์ฑ๋ฅ์ ์ฒด๊ณ์ ์ผ๋ก ํ ์คํธํจ์ผ๋ก์จ ์น ์ปดํฌ๋ํธ์ ์ง์ ํ ์ ์ฌ๋ ฅ์ ๋ฐํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์น์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ปดํฌ๋ํธ๊ฐ ์ด๋์ ๋๋ ์ด๋ป๊ฒ ๋ฐฐํฌ๋๋ ์ผ๊ด๋๊ณ ์ ๋ขฐํ ์ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋๋ก ๋ณด์ฅํ๋ฉฐ, ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ๋ ์ข๊ณ ์ํธ ์ฐ๊ฒฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.