๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ชจ๋์, ์ ์ง๋ณด์ ์ฉ์ด, ์ถฉ๋ ์๋ ์คํ์ผ์ ๋ง๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ธ CSS @scope๋ฅผ ์์๋ณด์ธ์. ์คํ์ผ ๊ฒฝ๊ณ๋ฅผ ์ ์ํ๊ณ ์ฝ๋ ๊ตฌ์ฑ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค.
CSS @scope: ๋ชจ๋์ ์น ๊ฐ๋ฐ์ ์ํ ์คํ์ผ ์บก์ํ ๋ง์คํฐํ๊ธฐ
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์, ํนํ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง์๋ก ๊นจ๋ํ๊ณ ์ฒด๊ณ์ ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด๊ฒ์ด ํนํ ์ด๋ ค์์ง๋ ๋ถ์ผ ์ค ํ๋๊ฐ CSS ์คํ์ผ ๊ด๋ฆฌ์ ๋๋ค. ์ ์ญ ์คํ์ผ์ํธ๋ ์ฝ๊ฒ ๋ช ์์ฑ ์ถฉ๋๊ณผ ์๋์น ์์ ์คํ์ผ ๋ฎ์ด์ฐ๊ธฐ๋ก ์ด์ด์ ธ ๋๋ฒ๊น ๊ณผ ์ ์ง๋ณด์๋ฅผ ์ ๋ชฝ์ผ๋ก ๋ง๋ญ๋๋ค. ๋ฐ๋ก ์ด๋ CSS @scope๊ฐ ๋ฑ์ฅํฉ๋๋ค. ์ด ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์คํ์ผ ์บก์ํ๋ฅผ ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ CSS ๊ท์น์ ๋ํ ์ ํํ ๊ฒฝ๊ณ๋ฅผ ์ ์ํ๊ณ ์ฝ๋ ๊ตฌ์ฑ์ ํฅ์์ํฌ ์ ์๋๋ก ํฉ๋๋ค.
๋ฌธ์ ์ดํดํ๊ธฐ: ์ ์ญ CSS์ ๊ณผ์
CSS @scope์ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ๋ค์ด๊ฐ๊ธฐ ์ ์, ์ ํต์ ์ธ ์ ์ญ CSS์ ๊ด๋ จ๋ ๋ฌธ์ ๋ค์ ์ ์ ๋์ง์ด ๋ณด๊ฒ ์ต๋๋ค:
- ๋ช ์์ฑ ์ถฉ๋: ์ฌ๋ฌ ๊ท์น์ด ๋์ผํ ์์๋ฅผ ๋์์ผ๋ก ํ ๋, ๋ธ๋ผ์ฐ์ ๋ ๊ฐ์ฅ ๋์ ๋ช ์์ฑ์ ๊ฐ์ง ๊ท์น์ ์ ์ฉํ์ฌ ์ข ์ข ์์์น ๋ชปํ ์คํ์ผ๋ง์ ์ด๋ํฉ๋๋ค.
- ์คํ์ผ ๋ฎ์ด์ฐ๊ธฐ: ์คํ์ผ์ํธ ๋ท๋ถ๋ถ์ ์ ์๋ ์คํ์ผ์ด ์๋์น ์๊ฒ ์๋ถ๋ถ์ ์ ์๋ ์คํ์ผ์ ๋ฎ์ด์ธ ์ ์์ด ์์์ ์ต์ข ๋ชจ์์ ์์ธกํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
- ์ฝ๋ ๋น๋ํ: ์ฌ์ฉ๋์ง ์๊ฑฐ๋ ์ค๋ณต๋๋ ์คํ์ผ์ด ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ถ์ ๋์ด CSS ํ์ผ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
- ์ ์ง๋ณด์์ฑ ๋ฌธ์ : ์ฝ๋๋ฒ ์ด์ค๊ฐ ์ปค์ง์๋ก ํน์ ์คํ์ผ์ ์ถ์ฒ๋ฅผ ์ถ์ ํ๊ธฐ๊ฐ ์ ์ ๋ ์ด๋ ค์์ ธ ์ ์ง๋ณด์์ ๋๋ฒ๊น ์ด ์ง๋ฃจํ ๊ณผ์ ์ด ๋ฉ๋๋ค.
- ์ปดํฌ๋ํธ ๊ฒฉ๋ฆฌ: ์ ์ ํ ๊ฒฉ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด ์๋์น ์์ ์คํ์ผ ์ถฉ๋ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ค์ ๊ฐ๋ฐ์ ํ์ด ๊ฐ๋ฐํ๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋์ฑ ์ฌํ๋๋ฉฐ, ์ผ๊ด๋๊ณ ์์ธก ๊ฐ๋ฅํ ์คํ์ผ๋ง ํ๊ฒฝ์ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. React, Angular, Vue.js์ ๊ฐ์ ํ๋ ์์ํฌ๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ก ์ด๋ฌํ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ, CSS @scope๋ ์คํ์ผ ์บก์ํ๋ฅผ ์ํ ๋ค์ดํฐ๋ธ CSS ์๋ฃจ์ ์ ์ ๊ณตํจ์ผ๋ก์จ ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ๋ณด์ํฉ๋๋ค.
CSS @scope ์๊ฐ: ์คํ์ผ ๊ฒฝ๊ณ ์ ์ํ๊ธฐ
CSS @scope๋ CSS ๊ท์น์ ๋ฒ์๋ฅผ ๋ฌธ์์ ํน์ ๋ถ๋ถ์ผ๋ก ์ ํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ @scope
๋ธ๋ก ๋ด์ ์ ์๋ ์คํ์ผ์ด ํด๋น ๋ฒ์ ๋ด์ ์์์๋ง ์ ์ฉ๋์ด, ์ค์๋ก ๋ฒ์ ๋ฐ์ ์์์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํ๋ค๋ ์๋ฏธ์
๋๋ค. ์ด๋ ๋ฒ์์ ์์์ ์ ์ ์ํ๋ ์ค์ฝํ ๋ฃจํธ(scoping root)์, ์ ํ์ ์ผ๋ก ์คํ์ผ์ด ์ ์ฉ๋์ง ์์ ๊ฒฝ๊ณ๋ฅผ ์ ์ํ๋ ์ค์ฝํ ๋ฆฌ๋ฏธํธ(scoping limit)๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค.
CSS @scope์ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
@scope (<scope-root>) to (<scope-limit>) {
/* CSS rules */
}
@scope (<scope-root>) {
/* CSS rules */
}
์ฃผ์ ๊ตฌ์ฑ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
@scope
: ์ค์ฝํ๋ฅผ ์ ์ํ๋ CSS at-rule์ ๋๋ค.<scope-root>
: ์ค์ฝํ์ ์์์ ์ ์ ์ํ๋ ์์ ๋๋ ์์๋ค์ ์ง์ ํ๋ CSS ์ ํ์์ ๋๋ค.@scope
๋ธ๋ก ๋ด์ ์คํ์ผ์ ์ด ์์์ ๊ทธ ์์๋ค์๊ฒ ์ ์ฉ๋ฉ๋๋ค.to <scope-limit>
(์ ํ ์ฌํญ): ์ค์ฝํ์ ๊ฒฝ๊ณ๋ฅผ ์ ์ํ๋ ์์ ๋๋ ์์๋ค์ ์ง์ ํ๋ CSS ์ ํ์์ ๋๋ค.@scope
๋ธ๋ก ๋ด์ ์คํ์ผ์ ์ด ๊ฒฝ๊ณ ๋ฐ์ ์์์๋ ์ ์ฉ๋์ง ์์ต๋๋ค. ์๋ต๋๋ฉด ์ค์ฝํ๋ ์ค์ฝํ ๋ฃจํธ์ ๋ชจ๋ ์์์ผ๋ก ํ์ฅ๋ฉ๋๋ค./* CSS ๊ท์น */
: ์ค์ฝํ ๋ด์์ ์ ์ฉ๋๋ CSS ๊ท์น์ ๋๋ค.
์ค์ฉ์ ์ธ ์์ : CSS @scope ๊ตฌํํ๊ธฐ
CSS @scope์ ๊ฐ๋ ฅํจ์ ์ค๋ช ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ํน์ ์ปดํฌ๋ํธ ์คํ์ผ๋ง
ํ์ด์ง์ ๋ค๋ฅธ ์์์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์คํ์ผ์ ์ง์ ํ๊ณ ์ถ์ <card>
์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. CSS @scope๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์บก์ํํ ์ ์์ต๋๋ค:
<div class="container">
<card>
<h2>Product Title</h2>
<p>Product description goes here.</p>
<button>Add to Cart</button>
</card>
</div>
<div class="other-content">
<h2>Another Section</h2>
<p>Some other content here.</p>
</div>
@scope (card) {
h2 {
font-size: 1.5em;
color: #333;
}
p {
font-size: 1em;
color: #666;
}
button {
background-color: #4CAF50;
color: white;
padding: 10px 20px;
border: none;
cursor: pointer;
}
}
/* Styles outside the scope */
.container {
margin: 20px;
}
.other-content {
margin-top: 30px;
}
์ด ์์ ์์ @scope (card)
๊ท์น์ ๋ธ๋ก ๋ด์ ์ ์๋ ์คํ์ผ์ด <card>
์์์ ๊ทธ ์์๋ค์๊ฒ๋ง ์ ์ฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. h2
, p
, button
์คํ์ผ์ ๋์ผํ ํ๊ทธ ์ด๋ฆ์ด๋ ํด๋์ค ์ด๋ฆ์ ๊ฐ์ง ๋ค๋ฅธ ํ์ด์ง ์์์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์์ 2: `to` ํค์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ๊ณ ์ค์
์ด์ ์นํ์ด์ง์ ํน์ ์น์
์ ์คํ์ผ์ ์ ์ฉํ๋, ์ค์ฒฉ๋ ์ปดํฌ๋ํธ๋ก ์คํ์ผ์ด ์์ด ๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. to
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ฝํ์ ๊ฒฝ๊ณ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
<div class="main-content">
<h2>Main Content Title</h2>
<p>Some content here.</p>
<div class="nested-component">
<h3>Nested Component Title</h3>
<p>Content of the nested component.</p>
</div>
</div>
@scope (.main-content) to (.nested-component) {
h2 {
color: blue;
}
p {
font-size: 1.2em;
}
}
/* Styles outside the scope */
.nested-component {
border: 1px solid gray;
padding: 10px;
margin-top: 10px;
}
์ด ๊ฒฝ์ฐ, @scope (.main-content) to (.nested-component)
๊ท์น์ ์ค์ฝํ๋ฅผ .main-content
์์๋ก ์ ํํ์ง๋ง, ์คํ์ผ์ด .nested-component
์์์ ๊ทธ ์์๋ค์๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ๋ฐ๋ผ์ .main-content
๋ด์ ์์ง๋ง .nested-component
์ธ๋ถ์ ์๋ h2
์ p
์์๋ง์ด @scope
๋ธ๋ก์ ์ ์๋ ๊ท์น์ ๋ฐ๋ผ ์คํ์ผ์ด ์ง์ ๋ฉ๋๋ค.
์์ 3: ๋ถ๋ชจ-์์ ๊ด๊ณ ๊ธฐ๋ฐ ์คํ์ผ๋ง
CSS @scope๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์๋ฅผ ํ๊ฒํ ํ ์๋ ์์ต๋๋ค. ํน์ `nav` ์์ ๋ด์ ๋ชจ๋ `a` ํ๊ทธ์๋ง ์คํ์ผ์ ์ ์ฉํ๊ณ ์ถ๋ค๊ณ ์์ํด ๋ณด์ธ์.
<nav id="main-nav">
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#services">Services</a></li>
</ul>
</nav>
<footer>
<p><a href="#privacy">Privacy Policy</a></p>
</footer>
@scope (#main-nav) {
a {
color: white;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
}
์ฌ๊ธฐ์ `#main-nav` ์์ ๋ด์ ๋งํฌ๋ ํฐ์์ผ๋ก ์คํ์ผ์ด ์ง์ ๋๊ณ ๋ฐ์ค์ด ์์ผ๋ฉฐ, ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ๋ฐ์ค์ด ์๊น๋๋ค. `footer`์ ์๋ ๋งํฌ๋ ์ด๋ฌํ ์คํ์ผ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
CSS @scope ์ฌ์ฉ์ ์ด์
CSS @scope๋ ์น ๊ฐ๋ฐ์์๊ฒ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋งค๋ ฅ์ ์ธ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํฅ์๋ ์คํ์ผ ์บก์ํ: CSS ๊ท์น์ ๋ช ํํ ๊ฒฝ๊ณ๋ฅผ ์ ์ํจ์ผ๋ก์จ ๋ช ์์ฑ ์ถฉ๋๊ณผ ์๋์น ์์ ์คํ์ผ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ๋ฐฉ์งํ์ฌ ๋ ์์ธก ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์คํ์ผ๋ง ํ๊ฒฝ์ ๋ง๋ค ์ ์์ต๋๋ค.
- ํฅ์๋ ์ฝ๋ ๊ตฌ์ฑ: CSS @scope๋ CSS ๊ฐ๋ฐ์ ๋ํ ๋ชจ๋์ ์ ๊ทผ์ ์ฅ๋ คํ์ฌ ์คํ์ผ์ ๊ตฌ์ฑํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ๊ฐ์๋ CSS ํํ๋ฆฐํธ: ์คํ์ผ์ ๋ฒ์๋ฅผ ์ ํํจ์ผ๋ก์จ ๋ถํ์ํ ์ค๋ณต์ ํผํ๊ณ ์ ์ฒด CSS ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๊ฐ์ํ๋ ๋๋ฒ๊น : ์คํ์ผ์ด ์ ์ ํ๊ฒ ์บก์ํ๋๋ฉด ํน์ ์คํ์ผ์ ์ถ์ฒ๋ฅผ ์ถ์ ํ๊ณ ์คํ์ผ๋ง ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๊ธฐ๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค.
- ๋ ๋์ ํ์ : CSS @scope๋ ๋์ผํ ํ๋ก์ ํธ์์ ์์ ํ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์ ๊ฐ์ ์คํ์ผ ์ถฉ๋ ์ํ์ ์ค์ฌ ๋ณด๋ค ํ๋ ฅ์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์ ์กฐ์ฑํฉ๋๋ค.
- ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์์ ์กฐํ: React, Angular, Vue.js์ ๊ฐ์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ํ๋ ์์ํฌ์ ์ํํ๊ฒ ํตํฉ๋์ด ์ง์ ํ ์ปดํฌ๋ํธ ์์ค์ ์คํ์ผ๋ง์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฐ ํด๋ฆฌํ
๋น๊ต์ ์๋ก์ด ๊ธฐ๋ฅ์ธ CSS @scope์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ์์ง ๋ฐ์ ์ค์ ๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ ์ Can I use์ ๊ฐ์ ์น์ฌ์ดํธ์์ ํ์ฌ ์ง์ ์ํ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์ดํฐ๋ธ ๋ธ๋ผ์ฐ์ ์ง์์ด ์ ํ์ ์ผ ์ ์์ง๋ง, ํด๋ฆฌํ๊ณผ ํ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํด๊ฒฐ์ฑ ์ค ํ๋๋ `postcss-scope`์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ๊ณผ ํจ๊ป PostCSS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ `@scope`๊ฐ ํฌํจ๋ CSS๋ฅผ ์ด์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ํ์์ผ๋ก ๋ณํํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ํด๋์ค ์ด๋ฆ ์ ๋์ฌ๋ ๋ค๋ฅธ ์ค์ฝํ ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค.
CSS @scope vs. CSS ๋ชจ๋ ๋ฐ Shadow DOM
CSS @scope๋ฅผ CSS ๋ชจ๋ ๋ฐ Shadow DOM๊ณผ ๊ฐ์ ์คํ์ผ ์บก์ํ์ ์ฌ์ฉ๋๋ ๋ค๋ฅธ ๊ธฐ์ ๊ณผ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- CSS ๋ชจ๋: CSS ๋ชจ๋์ ๊ฐ CSS ๊ท์น์ ๋ํด ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ ์๋์ผ๋ก ์์ฑํ์ฌ ์คํ์ผ์ ํน์ ์ปดํฌ๋ํธ๋ก ํจ๊ณผ์ ์ผ๋ก ์ค์ฝํํ๋ ์ธ๊ธฐ ์๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ CSS๋ฅผ ๋ณํํ๊ธฐ ์ํด ๋น๋ ๋๊ตฌ์ ์ ์ฒ๋ฆฌ๊ธฐ์ ์์กดํฉ๋๋ค.
- Shadow DOM: Shadow DOM์ ์์ฒด์ ์ธ ๋ณ๋์ DOM ํธ๋ฆฌ์ ์คํ์ผ ์ค์ฝํ๋ฅผ ๊ฐ์ง ์ง์ ์ผ๋ก ์บก์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. Shadow DOM ํธ๋ฆฌ ๋ด์ ์ ์๋ ์คํ์ผ์ ์ธ๋ถ ์์์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉฐ ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ด๋ ์คํ์ผ ์บก์ํ์ ๋ํ ๋ ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง ๋ ๋ณต์กํ ๊ตฌํ์ด ํ์ํฉ๋๋ค.
- CSS @scope: ๋น๋ ๋๊ตฌ๋ DOM ์กฐ์ ๊ธฐ์ ์ ์์กดํ์ง ์๊ณ ์คํ์ผ ์บก์ํ๋ฅผ ์ํ ๋ค์ดํฐ๋ธ ๋ธ๋ผ์ฐ์ ์ง์์ ์ ๊ณตํฉ๋๋ค. CSS @scope๋ ๋ํ ์ ํํ ์ปดํฌ๋ํธ์ ์ฌ์ดํธ์ ํ์ ์น์ ์ ๊ฒฉ๋ฆฌํ๋ฉด์ ๊ธฐ์กด ์ ์ญ ์คํ์ผ๋ง๊ณผ ์ง์ ์๋ํ๋ฏ๋ก, ๋ณด๋ค ๋ชจ๋ํ๋ ์คํ์ผ๋ง ์์คํ ์ ์ ์ง์ ์ผ๋ก ์ฑํํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
CSS @scope๋ Shadow DOM์ ๋นํด ๋ ๊ฐ๋จํ๊ณ ๊ฐ๋ฒผ์ด ์คํ์ผ ์บก์ํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ฉด์๋ ์ ์ฌํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. CSS ๋ชจ๋์ CSS @scope์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ฝ๋ ๊ตฌ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ฑ ํฅ์์ํฌ ์ ์์ผ๋ฏ๋ก ๋ณด์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
CSS @scope ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
CSS @scope๋ฅผ ์ต๋ํ ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ์ค์ฝํ ๋ฃจํธ์ ํน์ ์ ํ์ ์ฌ์ฉ: ์คํ์ผ์ ์ ์ฉํ๋ ค๋ ์์๋ฅผ ์ ํํ๊ฒ ์๋ณํ๋ ์ ํ์๋ฅผ ์ ํํ์ญ์์ค.
body
๋html
๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ ํ์๋ ์คํ์ผ ์บก์ํ์ ๋ชฉ์ ์ ๋ฌด๋ ฅํ์ํฌ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ํผํ์ญ์์ค. ID๋ ํน์ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข ์ข ๋ ์ข์ต๋๋ค. - ๋ช
ํํ ๊ฒฝ๊ณ ์ ์: ํ์ํ ๋๋ง๋ค
to
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ฝํ์ ๊ฒฝ๊ณ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ํ์ญ์์ค. ์ด๋ ์คํ์ผ์ด ์๋ํ์ง ์์ ํ์ด์ง ์์ญ์ผ๋ก ์์ด ๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. - ์ผ๊ด๋ ๋ค์ด๋ฐ ์ปจ๋ฒค์
์ฑํ: ์ฝ๋ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ์ค์ฝํ ๋ฃจํธ์ CSS ํด๋์ค์ ๋ํ ์ผ๊ด๋ ๋ค์ด๋ฐ ์ปจ๋ฒค์
์ ์๋ฆฝํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ํน์ ์ปดํฌ๋ํธ์ ์ค์ฝํ๋ ์คํ์ผ์ ์๋ณํ๊ธฐ ์ํด ์ ๋์ฌ(์:
.card--title
)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ์ค์ฝํ๋ ์๊ณ ์ง์ค์ ์ผ๋ก ์ ์ง: ํ์ด์ง์ ๋์ ๋ถ๋ถ์ ํฌํจํ๋ ์ง๋์น๊ฒ ๋์ ์ค์ฝํ๋ฅผ ๋ง๋ค์ง ๋ง์ญ์์ค. ๋์ , ํน์ ์ปดํฌ๋ํธ๋ UI ์์๋ฅผ ๋์์ผ๋ก ํ๋ ๋ ์๊ณ ์ง์ค๋ ์ค์ฝํ๋ฅผ ๋ชฉํ๋ก ํ์ญ์์ค.
- ๋ค๋ฅธ ๊ธฐ์ ๊ณผ ํจ๊ป CSS @scope ์ฌ์ฉ: ํฌ๊ด์ ์ด๊ณ ์ ๊ตฌ์ฑ๋ ์คํ์ผ๋ง ์์คํ ์ ๋ง๋ค๊ธฐ ์ํด CSS @scope๋ฅผ BEM(Block, Element, Modifier)์ด๋ CSS ๋ชจ๋๊ณผ ๊ฐ์ ๋ค๋ฅธ CSS ๋ฐฉ๋ฒ๋ก ๊ณผ ๊ฒฐํฉํ๋ ๊ฒ์ ๋๋ ค์ํ์ง ๋ง์ญ์์ค.
- ์ฒ ์ ํ ํ ์คํธ: ์คํ์ผ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๊ณ ์๋ํ์ง ์์ ๋ถ์์ฉ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด ํญ์ CSS @scope ๊ตฌํ์ ์ฒ ์ ํ๊ฒ ํ ์คํธํ์ญ์์ค.
์ ์ญ์ ๊ณ ๋ ค์ฌํญ: ์ ๊ทผ์ฑ ๋ฐ ๊ตญ์ ํ
CSS @scope๋ฅผ ๊ตฌํํ ๋, ๋ฅ๋ ฅ์ด๋ ์์น์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ๋์ด ์น์ฌ์ดํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ ๊ทผํ ์ ์๋๋ก ์ ๊ทผ์ฑ๊ณผ ๊ตญ์ ํ(i18n)๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ ๊ทผ์ฑ: ์ค์ฝํ๋ ์คํ์ผ์ด ์ปดํฌ๋ํธ์ ์ ๊ทผ์ฑ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ํฌ์ปค์ค ํ์๊ธฐ๋ฅผ ์จ๊ธฐ๊ฑฐ๋ ๋๋น๊ฐ ์ถฉ๋ถํ์ง ์์ ์์์ ์ฌ์ฉํ๋ ๊ฒ์ ํผํ์ญ์์ค. ARIA ์์ฑ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ์ ๊ตฌ์กฐ์ ๋์์ ๋ํ ์๋ฏธ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ญ์์ค.
- ๊ตญ์ ํ: ์ค์ฝํ๋ ์คํ์ผ์ด ๋ค๋ฅธ ์ธ์ด ๋ฐ ๋ฌธํ์ ๋งฅ๋ฝ์ ์ด๋ป๊ฒ ์ ์ํ ์ง ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๋ ์ด์์์ด ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฐ๋ ์ธ์ด์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ํ๋๋ก ๋ฌผ๋ฆฌ์ ์์ฑ(์:
margin-left
) ๋์ ๋ ผ๋ฆฌ์ ์์ฑ(์:margin-inline-start
)์ ์ฌ์ฉํ์ญ์์ค. ํ ์คํธ ๋ฐฉํฅ์ฑ๊ณผ ๊ธ๊ผด ์ ํ์ ์ ์ํ์ญ์์ค.
๊ฒฐ๋ก : @scope๋ก ๋ชจ๋์ CSS ์์ฉํ๊ธฐ
CSS @scope๋ ์น ๊ฐ๋ฐ์์ ํดํท์ ๊ท์คํ ์ถ๊ฐ ๊ธฐ๋ฅ์ผ๋ก, ์คํ์ผ ์บก์ํ์ ๋ชจ๋์ฑ์ ์ํ ๋ค์ดํฐ๋ธ CSS ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. CSS ๊ท์น์ ๋ช ํํ ๊ฒฝ๊ณ๋ฅผ ์ ์ํจ์ผ๋ก์จ ๋ช ์์ฑ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ฝ๋ ๊ตฌ์ฑ์ ํฅ์์ํค๋ฉฐ ๋๋ฒ๊น ์ ๋จ์ํํ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ ์์ง ๋ฐ์ ์ค์ด์ง๋ง, ํด๋ฆฌํ๊ณผ ํ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค. CSS @scope๋ฅผ ์ฑํํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ํ๋ ฅ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
CSS @scope์ ํจ๊ปํ๋ ์ฌ์ ์ ์์ํ๋ฉด์, ์คํํ๊ณ , ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์ํ๊ณ , ๋ ๋์ ์น ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ์ ๊ฒฝํ์ ๊ณต์ ํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ํจ๊ป ํ๋ ฅํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ ์ด ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๊ณ ๋ชจ๋๋ฅผ ์ํ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์น์ ๋ง๋ค ์ ์์ต๋๋ค.