๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ข ํฉ ๊ฐ์ด๋๋ก ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ์์ ์น ์ปดํฌ๋ํธ์ ์ํํ ํตํฉ ์ ๋ต์ ๋ง์คํฐํ์ธ์.
์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ํ๋ ์์ํฌ ํตํฉ ์ ๋ต ๋ง์คํฐํ๊ธฐ
๋์์์ด ์งํํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์์, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋ UI ์์์ ๊ฐ๋ฅ์ฑ์ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ์ฌ๋ก์ก์์ต๋๋ค. ์น ํ๋ซํผ API์ ์งํฉ์ธ ์น ์ปดํฌ๋ํธ(Web Components)๋ ์ด ๊ณผ์ ์ ๋ํ ๊ฐ๋ ฅํ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง์ ํ ์ํธ ์ด์ฉ์ฑ, ์ฆ ์น ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ์กํธ(React), ์ต๊ทค๋ฌ(Angular), ๋ทฐ(Vue)์ ๊ฐ์ ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ๋ ๋ฌผ๋ก ์์ ์๋ฐ์คํฌ๋ฆฝํธ(vanilla JavaScript) ๋ด์์๋ ์ํํ๊ฒ ์๋ํ๋ ๋ฅ๋ ฅ์ ๋ฌ์ฑํ๋ ๊ฒ์ ์ฌ์ ํ ํต์ฌ ๊ด์ฌ์ฌ์ ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋๋ ์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ์ ํต์ฌ ๊ฐ๋ ์ ํ๊ตฌํ๊ณ , ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์ ๊ณ ๊ฐ์ ๋์์ผ๋ก ๋ค์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ฑธ์ณ ์ด๋ฅผ ํตํฉํ๊ธฐ ์ํ ํจ๊ณผ์ ์ธ ์ ๋ต์ ์ ์ํฉ๋๋ค.
์น ์ปดํฌ๋ํธ์ ํต์ฌ ์ดํดํ๊ธฐ
ํตํฉ ์ ๋ต์ ์ดํด๋ณด๊ธฐ ์ ์, ์น ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ฅผ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์ปค์คํ
์๋ฆฌ๋จผํธ(Custom Elements): ์ด๊ฒ์ ์ฌ์ฉ์ ์ ์ ๋์๊ณผ ์๋ฏธ๋ฅผ ๊ฐ์ง ์์ ๋ง์ HTML ํ๊ทธ๋ฅผ ์ ์ํ ์ ์๊ฒ ํด์ค๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ํํ์ ์บก์ํํ๋
<user-profile>
์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. - ์๋ DOM(Shadow DOM): ์ด๊ฒ์ ์ปดํฌ๋ํธ์ ๋งํฌ์ , ์คํ์ผ, ๋์์ ๋ํ ์บก์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์จ๊ฒจ์ง DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์คํ์ผ๊ณผ ์คํฌ๋ฆฝํธ๊ฐ ์ธ๋ถ๋ก ์ ์ถ๋๊ฑฐ๋ ๋ฉ์ธ ๋ฌธ์์ ์ถฉ๋ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๊ฒ์ด ์ง์ ํ ์ฌ์ฌ์ฉ์ฑ์ ์ด์์ ๋๋ค.
- HTML ํ
ํ๋ฆฟ(HTML Templates):
<template>
๊ณผ<slot>
์๋ฆฌ๋จผํธ๋ ์ปดํฌ๋ํธ์์ ๋ณต์ ํ๊ณ ์ฌ์ฉํ ์ ์๋ ๋นํ์ฑ ๋งํฌ์ ์ฒญํฌ๋ฅผ ์ ์ํ ์ ์๊ฒ ํฉ๋๋ค. ์ฌ๋กฏ์ ์ฝํ ์ธ ํ๋ก์ ์ ์ ๋งค์ฐ ์ค์ํ๋ฉฐ, ๋ถ๋ชจ ์๋ฆฌ๋จผํธ๊ฐ ์ปดํฌ๋ํธ์ ํน์ ์์ญ์ ์์ ์ ์ฝํ ์ธ ๋ฅผ ์ฃผ์ ํ ์ ์๋๋ก ํฉ๋๋ค. - ES ๋ชจ๋(ES Modules): ์๋ฐํ ๋งํด ์น ์ปดํฌ๋ํธ ์ฌ์์ ์ผ๋ถ๋ ์๋์ง๋ง, ES ๋ชจ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ด๋ณด๋ด๋ ํ์ค ๋ฐฉ์์ผ๋ก, ์น ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ๋ฐฐํฌํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
์น ์ปดํฌ๋ํธ์ ๋ณธ์ง์ ์ธ ๊ฐ์ ์ ์น ํ์ค์ ์ค์ํ๋ค๋ ๋ฐ ์์ต๋๋ค. ์ด๋ ํน์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํ๋๋ก ์ค๊ณ๋์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธ๊ธฐ ์๋ ํ๋ ์์ํฌ๋ก ๊ตฌ์ถ๋ ๊ธฐ์กด ๋๋ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฅผ ํตํฉํ๋ ์ค์ ์ ์ธ ์ธก๋ฉด์์๋ ๋ ํนํ ๋์ ๊ณผ์ ์ ๊ธฐํ๊ฐ ์กด์ฌํฉ๋๋ค.
์ํธ ์ด์ฉ์ฑ์ ๊ณผ์ : ํ๋ ์์ํฌ ๋ ์น ์ปดํฌ๋ํธ
์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ๋ฅญํ์ง๋ง, ์ข ์ข ์์ฒด ๋ ๋๋ง ์์ง, ์ํ ๊ด๋ฆฌ ํจ๋ฌ๋ค์, ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ ๋ ๋ฆฝ์ ์ธ ์น ์ปดํฌ๋ํธ๋ฅผ ํตํฉํ๋ ค๊ณ ํ ๋ ๋ง์ฐฐ์ ์ผ์ผํฌ ์ ์์ต๋๋ค:
- ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ: ํ๋ ์์ํฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ๊ตํ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์์คํ ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค. ๋ฐ๋ฉด์ ์น ์ปดํฌ๋ํธ๋ ์ฃผ๋ก ํ๋กํผํฐ(properties)์ ์ดํธ๋ฆฌ๋ทฐํธ(attributes)๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ํธ ์์ฉํฉ๋๋ค. ์ด ๊ฐ๊ทน์ ๋ฉ์ฐ๋ ค๋ฉด ์ ์คํ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
- ์ด๋ฒคํธ ์ฒ๋ฆฌ: ํ๋ ์์ํฌ๋ ํน์ ๋ฐฉ์์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋์คํจ์นํ๊ณ ์์ ํฉ๋๋ค. ์น ์ปดํฌ๋ํธ๊ฐ ๋์คํจ์นํ๋ ์ปค์คํ ์ด๋ฒคํธ(Custom Events)๋ ํ๋ ์์ํฌ์ ์ํด ์ฌ๋ฐ๋ฅด๊ฒ ์บก์ฒ๋๊ณ ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
- ์๋ช
์ฃผ๊ธฐ ํ
: ํ๋ ์์ํฌ๋ ์์ฒด์ ์ธ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋(์: ๋ฆฌ์กํธ์
componentDidMount
, ์ต๊ทค๋ฌ์ngOnInit
)๋ฅผ ๊ฐ์ง๋๋ค. ์น ์ปดํฌ๋ํธ๋ ์์ฒด ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ(์:connectedCallback
,attributeChangedCallback
)์ ๊ฐ์ง๋๋ค. ์ด๋ค์ ๋๊ธฐํํ๋ ๊ฒ์ ๋ณต์กํ ์ ์์ต๋๋ค. - DOM ์กฐ์ ๋ฐ ๋ ๋๋ง: ํ๋ ์์ํฌ๋ ์ข ์ข ์ ์ฒด DOM์ ๊ด๋ฆฌํฉ๋๋ค. ์น ์ปดํฌ๋ํธ๊ฐ ์์ฒด ์๋ DOM์ ๋ ๋๋งํ ๋, ์ด๋ ํ๋ ์์ํฌ์ ๋ ๋๋ง ํ๋ก์ธ์ค์ ์ง์ ์ ์ธ ์ ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ์์ต๋๋ค.
- ์คํ์ผ๋ง: ์๋ DOM์ด ์บก์ํ๋ฅผ ์ ๊ณตํ์ง๋ง, ํ๋ ์์ํฌ์ ์ ์ญ ์คํ์ผ์ํธ๋ ์ปดํฌ๋ํธ์ ์ค์ฝํ ์คํ์ผ์ ์น ์ปดํฌ๋ํธ์ ์๋ DOM๊ณผ ํตํฉํ๋ ๊ฒ์ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ณผ์ ๋ ํ์ด ๋ถ์ฐ๋์ด ์๊ณ , ๋ค์ํ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์น ์ปดํฌ๋ํธ ๊ธฐ์ ์ ๋ํ ์๋ จ๋๊ฐ ๋ค๋ฅธ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฆํญ๋ฉ๋๋ค.
์ํํ ํ๋ ์์ํฌ ํตํฉ์ ์ํ ์ ๋ต
๊ฒฌ๊ณ ํ ์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํด์๋ ์ ๋ต์ ์ธ ์ ๊ทผ์ด ํ์ํฉ๋๋ค. ๋ค์์ ๋ค์ํ ํ๋ ์์ํฌ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ์ฉ ๊ฐ๋ฅํ ๋ช ๊ฐ์ง ํต์ฌ ์ ๋ต์ ๋๋ค:
1. ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ ๊ทผ๋ฒ (ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋ ๊ธฐ๋ฐ)
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ๋ต์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ ์ฌ์์ ์๊ฒฉํ ์ค์ํ์ฌ ์น ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ฒ์๋ถํฐ ์ต๊ณ ์์ค์ ์ํธ ์ด์ฉ์ฑ์ ์ ๊ณตํฉ๋๋ค.
- ์ปดํฌ๋ํธ๋ฅผ ํ์ค ์ปค์คํ ์๋ฆฌ๋จผํธ๋ก ๊ตฌ์ถํ๊ธฐ: ํต์ฌ ๊ธฐ๋ฅ์ ํ๋ ์์ํฌ๋ณ API์ ์์กดํ์ง ์๊ณ ์ปค์คํ ์๋ฆฌ๋จผํธ, ์๋ DOM, HTML ํ ํ๋ฆฟ ์ฌ์ฉ์ ์ง์คํฉ๋๋ค.
- ํ์ค DOM API ์ฌ์ฉํ๊ธฐ: ๋ค์ดํฐ๋ธ DOM ๋ฉ์๋(์:
element.setAttribute()
,element.addEventListener()
,element.dispatchEvent()
)๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กํผํฐ, ์ดํธ๋ฆฌ๋ทฐํธ, ์ด๋ฒคํธ์ ์ํธ ์์ฉํฉ๋๋ค. - ์ปค์คํ ์ด๋ฒคํธ ํ์ฉํ๊ธฐ: ์น ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ(ํ๋ ์์ํฌ)๋ก์ ํต์ ์ ์ํด ์ปค์คํ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ถ๋ชจ ํ๋ ์์ํฌ๊ฐ ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
- ํ๋กํผํฐ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ ธ์ถํ๊ธฐ: ๊ฐ๋จํ ๋ฐ์ดํฐ๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํตํด ์ ๋ฌํ ์ ์์ต๋๋ค. ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋น๋ฒํ ์ ๋ฐ์ดํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋กํผํฐ๋ฅผ ํตํด ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๊ธ๋ก๋ฒ ์์: ๋ค๊ตญ์ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ <product-card>
์น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. ์ด ์ปดํฌ๋ํธ๋ ๋ฆฌ์กํธ๋ก ๊ตฌ์ถ๋ ๋ฉ์ธ ์ฌ์ดํธ, ๋ทฐ๋ก ๊ตฌ์ถ๋ ๊ณ ๊ฐ ํฌํธ, ์ฌ์ง์ด ๋ ๊ฑฐ์ ์ ์ด์ฟผ๋ฆฌ(jQuery) ์ ํ๋ฆฌ์ผ์ด์
์ธ ๋ด๋ถ ๋๊ตฌ ๋ฑ ๋ค์ํ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๊ฒ ํตํฉ๋ ์ ์์ต๋๋ค.
2. ํ๋ ์์ํฌ๋ณ ๋ํผ(Wrapper) ์ปดํฌ๋ํธ
์์ ๋ฐ๋๋ผ ์น ์ปดํฌ๋ํธ๊ฐ ์ต๊ณ ์ ์ํธ ์ด์ฉ์ฑ์ ์ ๊ณตํ์ง๋ง, ๋๋ก๋ ๋์ ํ๋ ์์ํฌ ๋ด์ ์์ ์ถ์ํ ๊ณ์ธต์ด ๊ฐ๋ฐ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ฆฌ์กํธ ๋ํผ: ์ปค์คํ
์๋ฆฌ๋จผํธ๋ฅผ ๋ ๋๋งํ๋ ๋ฆฌ์กํธ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ญ๋๋ค. ๋ฆฌ์กํธ props๋ฅผ ์ปค์คํ
์๋ฆฌ๋จผํธ ํ๋กํผํฐ ๋ฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ์๋์ผ๋ก ๋งคํํ๊ณ , ์ปค์คํ
์ด๋ฒคํธ์ ๋ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
react-to-webcomponent
๋@lit-labs/react
(Lit ์ปดํฌ๋ํธ์ฉ)์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด ๊ณผ์ ์ ๋ง์ ๋ถ๋ถ์ ์๋ํํ ์ ์์ต๋๋ค. - ์ต๊ทค๋ฌ ๋ํผ: ์ต๊ทค๋ฌ์ Angular Elements ํ๋ก์ ํธ๋ ๋ฐ๋ก ์ด ๋ชฉ์ ์ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ต๊ทค๋ฌ ์ปดํฌ๋ํธ๋ฅผ ํ์ค ์น ์ปดํฌ๋ํธ๋ก ํจํค์งํ ์ ์์ผ๋ฉฐ, ๊ธฐ์กด ์น ์ปดํฌ๋ํธ๋ฅผ ์ต๊ทค๋ฌ ์ปดํฌ๋ํธ๋ก ๊ฐ์ธ๋ ๋๊ตฌ๋ ์ ๊ณตํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ต๊ทค๋ฌ๊ฐ ์ปค์คํ ์๋ฆฌ๋จผํธ ํ๋กํผํฐ์ ์ด๋ฒคํธ๋ฅผ ์ธ์ํ๊ณ ๋ฐ์ธ๋ฉํ๋๋ก ๊ตฌ์ฑํ๋ ์์ ์ด ํฌํจ๋ฉ๋๋ค.
- ๋ทฐ ๋ํผ: ๋ทฐ๋ ์น ์ปดํฌ๋ํธ ํตํฉ์ ํ๋ฅญํ๊ฒ ์ง์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ทฐ๋ ์ ์ ์๋ ์๋ฆฌ๋จผํธ๋ฅผ ์ปค์คํ
์๋ฆฌ๋จผํธ๋ก ์ทจ๊ธํฉ๋๋ค. ๊ทธ๋ฌ๋ ํนํ ๋ณต์กํ ๋ฐ์ดํฐ์ prop ๋ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด์๋ ๋ทฐ์๊ฒ ์ด๋ค ์๋ฆฌ๋จผํธ๊ฐ ์ปค์คํ
์๋ฆฌ๋จผํธ์ธ์ง, ๊ทธ๋ฆฌ๊ณ props๋ฅผ ์ด๋ป๊ฒ ์ ๋ฌํด์ผ ํ๋์ง ๋ช
์์ ์ผ๋ก ์๋ ค์ค์ผ ํ ์ ์์ต๋๋ค.
vue-to-webcomponent
์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌํฉ๋๋ค.
์ค์ฉ์ ์ธ ํต์ฐฐ: ๋ํผ๋ฅผ ๋ง๋ค ๋ ๋ณต์กํ ๋ฐ์ดํฐ ์ ํ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ์ธ์. ํ๋ ์์ํฌ๋ ์ข ์ข ๋ฐ์ดํฐ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ์ ๋ฌํฉ๋๋ค. ์น ์ปดํฌ๋ํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ํด ๋ฌธ์์ด์ ๊ธฐ๋ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ/์ญ์ง๋ ฌํํ๊ฑฐ๋ ๋ณต์กํ ๋ฐ์ดํฐ์๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํด์ผ ํ ์ ์์ต๋๋ค.
3. ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ปดํ์ผ๋ฌ ํ์ฉ
๋ช๋ช ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ๋ ์น ์ปดํฌ๋ํธ์ ์์ฑ๊ณผ ํตํฉ์ ๋จ์ํํ๋ฉฐ, ์ข ์ข ํ๋ ์์ํฌ ํตํฉ์ ์ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํ๊ฑฐ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ํฉ๋๋ค.
- Lit (๊ตฌ LitElement): ๊ตฌ๊ธ์ด ๊ฐ๋ฐํ Lit์ ๋น ๋ฅด๊ณ , ์๊ณ , ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์น ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฒฝ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ ์ธ์ ํ ํ๋ฆฟ ์์คํ , ๋ฐ์ํ ํ๋กํผํฐ, ๊ทธ๋ฆฌ๊ณ ํ๋ ์์ํฌ ๋ํผ ์์ฑ์ ์ํ ํ๋ฅญํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฑ๋ฅ๊ณผ ํ์ค์ ์ค์ ์ ๋์ด ๋์์ธ ์์คํ ๊ตฌ์ถ์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
- StencilJS: ์คํ ์ค์ ํ์ค ์น ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ์ปดํ์ผ๋ฌ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ต์ํ ํ์ ์คํฌ๋ฆฝํธ, JSX, CSS ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด์ ๊ณ ๋๋ก ์ต์ ํ๋ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ถ๋ ฅํ ์ ์๊ฒ ํด์ค๋๋ค. ์คํ ์ค์ ๋ํ ํ๋ ์์ํฌ๋ณ ๋ฐ์ธ๋ฉ์ ์์ฑํ๋ ๋ด์ฅ ๊ธฐ๋ฅ๋ ๊ฐ์ถ๊ณ ์์ต๋๋ค.
- ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ๋ฒ: ์ผ๋ถ ํ์ ํต์ฌ UI ์์๋ ๋ฐ๋๋ผ ์น ์ปดํฌ๋ํธ๋ก ๊ตฌ์ถํ๊ณ , ํด๋น ์ปดํฌ๋ํธ ๋ด์ ๋ ๋ณต์กํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ๋ ๊ธฐ๋ฅ์ ๋ด๋ถ์ ์ผ๋ก ํ๋ ์์ํฌ๋ณ ๋ก์ง์ ํ์ฉํ๋ ๊ฒฝ๊ณ๋ฅผ ์ ์คํ๊ฒ ๊ด๋ฆฌํ๋ ์ ๋ต์ ์ฑํํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์์: ๊ธ๋ก๋ฒ ๊ธ์ต ์๋น์ค ํ์ฌ๋ ์คํ ์คJS๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๊ณ ๊ฐ ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ๋ด๋ถ ๋๊ตฌ๋ฅผ ์ํ ํฌ๊ด์ ์ธ ๋์์ธ ์์คํ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์คํ ์ค์ ์ต๊ทค๋ฌ, ๋ฆฌ์กํธ, ๋ทฐ ๋ฐ์ธ๋ฉ ์์ฑ ๋ฅ๋ ฅ์ ์ฌ๋ฌ ํ์ ๊ฐ๋ฐ์๋ค์ด ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์ฑํํ๊ณ ์ฌ์ฉํ์ฌ ๋ธ๋๋ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๊ฐ๋ฐ์ ๊ฐ์ํํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
4. ๊ฐ๊ทน ๋ฉ์ฐ๊ธฐ: ํ๋กํผํฐ, ์ดํธ๋ฆฌ๋ทฐํธ, ์ด๋ฒคํธ ์ฒ๋ฆฌ
์ ํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ ๊ด๊ณ์์ด, ํ๋ ์์ํฌ์ ์น ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ฆ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ดํธ๋ฆฌ๋ทฐํธ ๋ ํ๋กํผํฐ:
- ์ดํธ๋ฆฌ๋ทฐํธ: ์ฃผ๋ก HTML์ ์ ์๋ ๋ฌธ์์ด ๊ธฐ๋ฐ ๊ตฌ์ฑ์ ์ฌ์ฉ๋ฉ๋๋ค. DOM์ ๋ฐ์๋ฉ๋๋ค. ์ดํธ๋ฆฌ๋ทฐํธ ๋ณ๊ฒฝ์
attributeChangedCallback
์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. - ํ๋กํผํฐ: ๋ณต์กํ ๋ฐ์ดํฐ ์ ํ(๊ฐ์ฒด, ๋ฐฐ์ด, ๋ถ๋ฆฌ์ธ, ์ซ์)์ ์ ๋ฌํ๊ณ ๋ ๋์ ์ธ ์ํธ ์์ฉ์ ์ฌ์ฉ๋ฉ๋๋ค. DOM ์๋ฆฌ๋จผํธ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋กํผํฐ์ ๋๋ค.
์ ๋ต: ๊ฐ๋จํ ๊ตฌ์ฑ์๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ์ธ์. ๋ ๋ณต์กํ๊ฑฐ๋ ๋น๋ฒํ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ธ์. ํ๋ ์์ํฌ ๋ํผ๋ ํ๋ ์์ํฌ props๋ฅผ ์ดํธ๋ฆฌ๋ทฐํธ๋ ํ๋กํผํฐ ์ค ํ๋์ ๋งคํํด์ผ ํ๋ฉฐ, ๋ณต์กํ ์ ํ์ ๊ฒฝ์ฐ ๋ณดํต ํ๋กํผํฐ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํฉ๋๋ค.
- ์ดํธ๋ฆฌ๋ทฐํธ: ์ฃผ๋ก HTML์ ์ ์๋ ๋ฌธ์์ด ๊ธฐ๋ฐ ๊ตฌ์ฑ์ ์ฌ์ฉ๋ฉ๋๋ค. DOM์ ๋ฐ์๋ฉ๋๋ค. ์ดํธ๋ฆฌ๋ทฐํธ ๋ณ๊ฒฝ์
- ์ปค์คํ
์ด๋ฒคํธ ์ฒ๋ฆฌ:
- ์น ์ปดํฌ๋ํธ๋ ํ๊ฒฝ๊ณผ ํต์ ํ๊ธฐ ์ํด
CustomEvent
๋ฅผ ๋์คํจ์นํฉ๋๋ค. - ํ๋ ์์ํฌ๋ ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋๋ก ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ์กํธ์์๋
useEffect
ํ ์์ ์๋์ผ๋ก ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ทฐ์์๋v-on
์ง์๋ฌธ(@
)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๋ต: ํ๋ ์์ํฌ ํตํฉ ๊ณ์ธต์ด ์ปค์คํ ์๋ฆฌ๋จผํธ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๊ฒฐํ๊ณ ํด๋น ํ๋ ์์ํฌ ์ด๋ฒคํธ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋๋ก ๋ณด์ฅํ์ธ์.
- ์น ์ปดํฌ๋ํธ๋ ํ๊ฒฝ๊ณผ ํต์ ํ๊ธฐ ์ํด
- ์คํ์ผ๋ง๊ณผ ์๋ DOM:
- ์๋ DOM์ ์คํ์ผ์ ์บก์ํํฉ๋๋ค. ์ด๋ ํ๋ ์์ํฌ์ ์ ์ญ ์คํ์ผ์ด ๋ช ์์ ์ผ๋ก ํ์ฉ๋์ง ์๋ ํ ์๋ DOM์ ์นจํฌํ์ง ์์ ์ ์์์ ์๋ฏธํฉ๋๋ค.
- CSS ์ปค์คํ ํ๋กํผํฐ(๋ณ์)๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ์ ์ธ๋ถ ์คํ์ผ๋ง์ ํ์ฉํ์ธ์.
::part()
์::theme()
(๋ฑ์ฅ ์์ )์ ์ฌ์ฉํ์ฌ ์๋ DOM ๋ด์ ํน์ ์๋ฆฌ๋จผํธ๋ฅผ ์คํ์ผ๋ง์ ์ํด ๋ ธ์ถ์ํค์ธ์.
์ ๋ต: ์น ์ปดํฌ๋ํธ๋ฅผ CSS ์ปค์คํ ํ๋กํผํฐ๋ฅผ ํตํด ์คํ์ผ๋งํ ์ ์๋๋ก ์ค๊ณํ์ธ์. ๋ ๊น์ ์คํ์ผ๋ง์ด ํ์ํ ๊ฒฝ์ฐ, ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ฌธ์ํํ๊ณ
::part
์ ํ์๋ฅผ ์ ๊ณตํ์ธ์. ํ๋ ์์ํฌ ๋ํผ๋ ์ด๋ฌํ ์ปค์คํฐ๋ง์ด์ง ํฌ์ธํธ๋ก ๋ณํ๋๋ ์คํ์ผ ๊ด๋ จ props๋ฅผ ์ ๋ฌํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ํต์ฐฐ: ์น ์ปดํฌ๋ํธ์ API๋ฅผ ์ฒ ์ ํ ๋ฌธ์ํํ์ธ์. ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋กํผํฐ, ๊ทธ ์ ํ, ์ง์๋๋ ์ดํธ๋ฆฌ๋ทฐํธ, ๋์คํจ์น๋๋ ์ปค์คํ ์ด๋ฒคํธ๋ฅผ ๋ช ํํ ๋ช ์ํ์ธ์. ์ด ๋ฌธ์๋ ๋ค์ํ ํ๋ ์์ํฌ์์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค.
5. ์๋ช ์ฃผ๊ธฐ ๋ฐ ๋ ๋๋ง ๊ด๋ฆฌ
์น ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ํธ์คํธ ํ๋ ์์ํฌ์ ๋๊ธฐํํ๋ ๊ฒ์ ์ฑ๋ฅ๊ณผ ์ ํ์ฑ์ ์ํด ์ค์ํฉ๋๋ค.
- ์น ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ํ๋ ์์ํฌ: ํ๋ ์์ํฌ๊ฐ ์น ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋, ์ด๋ ์ข ์ข ์ด๊ธฐ ๋ง์ดํธ ์ ํ ๋ฒ ๋ฐ์ํฉ๋๋ค. ์น ์ปดํฌ๋ํธ์ props์ ์ํฅ์ ๋ฏธ์น๋ ํ๋ ์์ํฌ ์ํ ๋ณ๊ฒฝ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ํ๋์ด์ผ ํฉ๋๋ค.
- ์น ์ปดํฌ๋ํธ ์๋ช
์ฃผ๊ธฐ ์ฝ๋ฐฑ: ์น ์ปดํฌ๋ํธ์
connectedCallback
์ ์๋ฆฌ๋จผํธ๊ฐ DOM์ ์ถ๊ฐ๋ ๋,disconnectedCallback
์ ์ ๊ฑฐ๋ ๋,attributeChangedCallback
์ ๊ด์ฐฐ๋ ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์คํ๋ฉ๋๋ค. - ํ๋ ์์ํฌ ๋ํผ ๋๊ธฐํ: ํ๋ ์์ํฌ ๋ํผ๋ ์ด์์ ์ผ๋ก ์์ ์ props๊ฐ ๋ณ๊ฒฝ๋ ๋ ์น ์ปดํฌ๋ํธ์ ํ๋กํผํฐ๋ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํด์ผ ํฉ๋๋ค. ๋ฐ๋๋ก, ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ํตํด ์น ์ปดํฌ๋ํธ ๋ด์ ๋ณ๊ฒฝ์ ๋ฐ์ํ ์ ์์ด์ผ ํฉ๋๋ค.
๊ธ๋ก๋ฒ ์์: ๊ธ๋ก๋ฒ ์จ๋ผ์ธ ํ์ต ํ๋ซํผ์ <course-progress-bar>
์น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๊ฐ์๋ฅผ ์๋ฃํ๋ฉด ํ๋ซํผ์ ๋ฐฑ์๋๋ ์ฌ์ฉ์์ ์งํ ์ํฉ์ ์
๋ฐ์ดํธํฉ๋๋ค. ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
(์ง์ญ๋ง๋ค ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ๊ตฌ์ถ๋ ์ ์์)์ ์ด ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์ํด์ผ ํฉ๋๋ค. ์น ์ปดํฌ๋ํธ์ ๋ํผ๋ ์๋ก์ด ์งํ๋ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ปดํฌ๋ํธ์ ํ๋กํผํฐ๋ฅผ ์
๋ฐ์ดํธํ๊ณ , ์ด๋ก ์ธํด ์๋ DOM ๋ด์ ์งํ๋ฅ ํ์์ค์ด ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค.
6. ์ํธ ์ด์ฉ์ฑ ํ ์คํธ
๊ฒฌ๊ณ ํ ํ ์คํธ๋ ์น ์ปดํฌ๋ํธ๊ฐ ๋ค์ํ ํ๊ฒฝ์์ ์์๋๋ก ๋์ํ๋์ง ํ์ธํ๋ ๋ฐ ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
- ์น ์ปดํฌ๋ํธ ์ ๋ ํ ์คํธ: Jest๋ Mocha์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ์ฌ ๋ด๋ถ ๋ก์ง, ๋ ๋๋ง, ์ด๋ฒคํธ ๋์คํจ์น๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํฉ๋๋ค.
- ํ๋ ์์ํฌ ๋ด ํตํฉ ํ ์คํธ: ์น ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ๋ ๊ฐ ํ๋ ์์ํฌ์ ๋ํ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ํด๋น ํ๋ ์์ํฌ์์ ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์ ธ์ ๋ ๋๋งํ๊ณ , ์น ์ปดํฌ๋ํธ๋ฅผ ๋ง์ดํธํ์ฌ ๊ทธ ๋์, prop ์ ํ, ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ๊ฒ์ฆํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ๋ฐ ํฌ๋ก์ค ๋๋ฐ์ด์ค ํ ์คํธ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๊ณ ๋ คํ ๋, ๋ค์ํ ๋ธ๋ผ์ฐ์ (ํฌ๋กฌ, ํ์ด์ดํญ์ค, ์ฌํ๋ฆฌ, ์ฃ์ง)์ ๋๋ฐ์ด์ค(๋ฐ์คํฌํฑ, ๋ชจ๋ฐ์ผ, ํ๋ธ๋ฆฟ)์์์ ํ ์คํธ๋ ํ์์ ์ ๋๋ค.
- ์๋ํฌ์๋(E2E) ํ ์คํธ: Cypress๋ Playwright์ ๊ฐ์ ๋๊ตฌ๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑธ์ณ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ, ์น ์ปดํฌ๋ํธ๊ฐ ํตํฉ๋ ํ๋ ์์ํฌ ์ปจํ ์คํธ ๋ด์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ค๋ ํ์ ์ ์ค ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ํต์ฐฐ: ํ ์คํธ ํ์ดํ๋ผ์ธ์ ์๋ํํ์ธ์. ์ด๋ฌํ ํ ์คํธ๋ฅผ CI/CD ํ๋ก์ธ์ค์ ํตํฉํ์ฌ ํ๊ท๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ์ธ์. ๋ค์ํ ํ๋ ์์ํฌ ์ค์ ์ ์๋ฎฌ๋ ์ด์ ํ๋ ์ ์ฉ ํ ์คํธ ํ๊ฒฝ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
7. ๊ธ๋ก๋ฒ ๊ฐ๋ฐํ์ ์ํ ๊ณ ๋ ค์ฌํญ
๋ค์ํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์ ๋ฐ ๊ฐ๋ฐํ์ ์ํด ์น ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ๊ณ ํตํฉํ ๋ ๋ช ๊ฐ์ง ์์๊ฐ ์ค์ํด์ง๋๋ค:
- ๋ฌธ์ํ ํ์ค: ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ๋ณดํธ์ ์ผ๋ก ์ดํดํ ์ ์๋ ๋ฌธ์๋ฅผ ์ ์งํ์ธ์. ๋ฌธํ์ ์ผ๋ก ์ค๋ฆฝ์ ์ธ ๋ค์ด์ด๊ทธ๋จ๊ณผ ์์ ๋ฅผ ์ฌ์ฉํ์ธ์. API, ์์ ๋์, ํตํฉ ๋จ๊ณ๋ฅผ ๋ฌธ์ํํ๋ ๊ฒ์ ํ์์ ์ ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ์น ์ปดํฌ๋ํธ๋ ๊ฒฝ๋์ด์ด์ผ ํฉ๋๋ค. ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ต์ํํ๊ณ ํจ์จ์ ์ผ๋ก ๋ ๋๋ง๋๋๋ก ํ์ธ์. ํนํ ์ ์ธ๊ณ์ ์ผ๋ก ๋ค์ํ ์ธํฐ๋ท ์๋๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๋ฅผ ์ํด ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๊ธฐ ์ํ ์ปดํฌ๋ํธ ์ง์ฐ ๋ก๋ฉ์ ๊ณ ๋ คํ์ธ์.
- ์ ๊ทผ์ฑ(A11y): ๋ฅ๋ ฅ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์น ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ธ์. ์๋ DOM ๋ด์์ ARIA ๊ฐ์ด๋๋ผ์ธ๊ณผ ์๋งจํฑ HTML ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ธ์.
- ๊ตญ์ ํ(i18n) ๋ฐ ํ์งํ(l10n): ์ปดํฌ๋ํธ๊ฐ ํ ์คํธ๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ, ์ฝ๊ฒ ๊ตญ์ ํํ ์ ์๋๋ก ์ค๊ณํ์ธ์. ํ์ค i18n ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ฝํ ์ธ ๊ฐ ๋ฒ์ญ์ ์ํด ์ถ์ถ ๊ฐ๋ฅํ๋๋ก ํ์ธ์.
- ๋๊ตฌ ๋ฐ ๋น๋ ํ๋ก์ธ์ค: ๊ฐ๋ฅํ ํ ๋น๋ ๋๊ตฌ์ ํ๋ก์ธ์ค๋ฅผ ํ์คํํ์ธ์. ์น ์ปดํฌ๋ํธ๊ฐ ๋ค์ํ ํ๋ ์์ํฌ ๋น๋ ํ์ดํ๋ผ์ธ(์: Webpack, Vite, Rollup)์ ์ํด ์ฝ๊ฒ ๋ฒ๋ค๋ง๋๊ณ ์๋น๋ ์ ์๋๋ก ๋ณด์ฅํ์ธ์.
๊ธ๋ก๋ฒ ์์: ๊ตญ์ ๋ฏธ๋์ด ํ์ฌ๋ <video-player>
์น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ์ ์ํด ๋ค์ํ ์๋ง ํ์, ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ํธ ์์ฉ(ARIA ์ฌ์ฉ), ๊ทธ๋ฆฌ๊ณ ์ ์ฌ์ ์ผ๋ก ํ์งํ๋ ์ปจํธ๋กค์ ์ง์ํด์ผ ํฉ๋๋ค. ๋ฌธ์๋ ๋ฏธ๊ตญ ํ์ด ์ฌ์ฉํ๋ ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์
, ์ ๋ฝ ํ์ด ์ฌ์ฉํ๋ ์ต๊ทค๋ฌ ์ ํ๋ฆฌ์ผ์ด์
, ์์์ ํ์ด ์ฌ์ฉํ๋ ๋ทฐ ์ ํ๋ฆฌ์ผ์ด์
์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ๋ช
ํํ ์ค๋ช
ํด์ผ ํ๋ฉฐ, ์ธ์ด ์ฝ๋์ ์๋ง ํธ๋ URL์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๊ด์ ์ผ๋ก ์ค๋ช
ํด์ผ ํฉ๋๋ค.
์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ์ ๋ฏธ๋
์น ์ปดํฌ๋ํธ ํ์ค์ ๋ค์๊ณผ ๊ฐ์ ์์ญ์์ ์ง์์ ์ธ ์์ ์ ํตํด ๊ณ์ ์งํํ๊ณ ์์ต๋๋ค:
- ์ ์ธ์ ์๋ DOM: ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์์ ์๋ DOM์ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
- ํ
๋ง ์คํ์ผ๋ง (
::theme()
): ์ปดํฌ๋ํธ์ ๋ํด ๋ ์ ์ด๋ ํ ๋ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ์ ์๋ API์ ๋๋ค. - ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ: ๋ ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๊ฒ ํ๋ ํฅ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
์ด๋ฌํ ํ์ค์ด ์ฑ์ํด์ง์ ๋ฐ๋ผ ํ๋ ์์ํฌ ํตํฉ์ ์ด๋ ค์์ ์ค์ด๋ค ๊ฒ์ด๋ฉฐ, ์ง์ ์ผ๋ก ๋ณดํธ์ ์ธ UI ์ปดํฌ๋ํธ์ ๊ธธ์ ์ด์ด์ค ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ์ ๋จ์ํ ๊ธฐ์ ์ ์ธ ๊ณผ์ ๊ฐ ์๋๋ผ, ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ๋ฏธ๋์๋ ๋๋นํ ์ ์๋ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ ๋ต์ ํ์ ์์์ ๋๋ค. ์น ์ปดํฌ๋ํธ์ ํต์ฌ ์์น์ ์ดํดํ๊ณ , ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ๋ถํฐ ํ๋ ์์ํฌ๋ณ ๋ํผ, ๊ทธ๋ฆฌ๊ณ Lit ๋ฐ Stencil๊ณผ ๊ฐ์ ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ์ ์ด๋ฅด๊ธฐ๊น์ง ์ฌ๋ ค ๊น์ ํตํฉ ์ ๋ต์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ค์ํ ๊ธฐ์ ์คํ์ ๊ฑธ์ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ๋ฐํํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ์ด๋ ํ์ด ์ ํธํ๋ ํ๋ ์์ํฌ์ ๊ด๊ณ์์ด ์ฝ๋๋ฅผ ๊ณต์ ํ๊ณ , ์ผ๊ด์ฑ์ ์ ์งํ๋ฉฐ, ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ํํ ์ ์๋๋ก ํ์ ์ค์ด์ฃผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์น ์ปดํฌ๋ํธ ์ํธ ์ด์ฉ์ฑ์ ํฌ์ํ๋ ๊ฒ์ ์ ์ธ๊ณ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋ ์์ง๋ ฅ ์๊ณ ํจ์จ์ ์ธ ๋ฏธ๋์ ๋ํ ํฌ์์ ๋๋ค. ์ด๋ฌํ ์ ๋ต์ ์ฑํํ๊ณ , ๋ช ํํ ๋ฌธ์ํ๋ฅผ ์ฐ์ ์ํ๋ฉฐ, ์น ์ปดํฌ๋ํธ๊ฐ ์ง์ ์ผ๋ก ๋ณดํธ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ์ฒ ์ ํ ํ ์คํธํ์ธ์.