CHAPTER 10. Styling components and encapsulation

Native strategy

์›น ๊ฐœ๋ฐœ์ž๋Š” ์ข…์ข… CSS ํด๋ž˜์Šค๋ฅผ ์š”์†Œ์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  CSS์˜ ๋ณธ์งˆ์€ ๊ทธ๊ฒƒ์ด Cascade ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๋ชฉ๋ก์—์„œ ์„ ํƒํ•œ ์š”์†Œ์— ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ์ผ๋ฐ˜์ ์œผ๋กœ CSS์— ๋งค์šฐ ์ข์€ CSS ์„ ํƒ๊ธฐ (์˜ˆ : li.selected)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋˜๋Š” BEM๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ข์€ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜์—ฌ๋ผ. ์„ ํƒํ•œ ์š”์†Œ๋ฅผ ์•ฑ์˜ ํŠน์ • ๋ถ€๋ถ„์— ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์ด๊ฒƒ์€ Angular 2๊ฐ€ ํŽธ๋ฆฌํ•œ ์šฐ์šฉํ•œ ๊ฒƒ์ด๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ •์˜ํ•˜๋Š” ์Šคํƒ€์ผ (styles ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ styleUrls๋ฅผ ๊ฐ€์ง€๋Š” ์ปดํผ๋„ŒํŠธ์˜ ์ „์šฉ CSS ํŒŒ์ผ)์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ ์šฉ๋œ๋‹ค. ์ด ์Šคํƒ€์ผ ์บก์Šํ™”๋ผ๊ณ  ํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ์ด๊ฒƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์–ด๋–ค ์Šคํƒ€์ผ์„ ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ์†์„ฑ ์บก์Šํ™”์— ๋Œ€ํ•ด ์„ ํƒํ•œ ์ „๋žต์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์ด ์†์„ฑ์€ ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. โ€ข ViewEncapsulation.Emulated๋Š” ๊ธฐ๋ณธ ์„ค์ •์ด๋‹ค. โ€ข ViewEncapsulation.Native๋Š” ๊ทธ๋ฆผ์ž ์บก์Š์— ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ ํ•œ๋‹ค. โ€ข ViewEncapsulation.None์€ ์บก์Šํ™”๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ ํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ๊ฐ€์น˜๋Š” ๋ฌผ๋ก  ๋‹ค๋ฅธ ํ–‰๋™์„ ์œ ๋„ํ•˜๋ฏ€๋กœ ์‚ดํŽด ๋ณด์ž. ๋‹น์‹ ์ด ์ž˜ ์•Œ๊ณ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ, ์ฆ‰ PonyComponent์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ •๋ง ๊ฐ„๋‹จํ•œ ๋ฒ„์ „์—์„œ div์— ์กฐ๋ž‘๋ง์˜ ์ด๋ฆ„์„ ํ‘œ์‹œ ํ• ๋ฟ ์ด๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” div์— CSS ํด๋ž˜์Šค red๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

import { Component, ViewEncapsulation } from '@angular/core';
@Component({
  selector: 'ns-pony',
  template: `<div class="red">{{name}}</div>`,
  styles: [`.red {color: red;}`],
  // that's the same as the default mode
  encapsulation: ViewEncapsulation.Emulated
})
export class PonyComponent {
  name: string = 'Rainbow Dash';
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ํด๋ž˜์Šค๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์— ์‚ฌ์šฉ๋œ๋‹ค.

.red {
  color: red;
}

๋ณด์‹œ๋‹ค์‹œํ”ผ ์กฐ๋ž‘๋ง์˜ ์ด๋ฆ„์„ ๋นจ๊ฐ„์ƒ‰ ๊ธ€๊ผด๋กœ ํ‘œ์‹œ๋œ๋‹ค. Native ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Angular 2์— ๋ธŒ๋ผ์šฐ์ €์˜ ๊ทธ๋ฆผ์ž DOM์„ ์‚ฌ์šฉํ•˜์—ฌ ์บก์Šํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ง€์‹œํ•œ๋‹ค. ๊ทธ๋ฆผ์ž DOM์€ ๋‹ค์†Œ ์ƒˆ๋กœ์šด ์›น ๊ตฌ์„ฑ ์š”์†Œ ์‚ฌ์–‘์˜ ์ผ๋ถ€์ด๋‹ค. ์ด ์ŠคํŽ™์€ ์™„๋ฒฝํ•˜๊ฒŒ ์บก์Šํ™” ๋œ ํŠน์ˆ˜ DOM์— ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์ด ์ „๋žต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ ๋œ DOM์„ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒ€์‚ฌ๊ธฐ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

<ns-pony>
  #shadow-root (open)
   <style>.red {color: red}</style>
   <div class="red">Rainbow Dash</div>
</ns-pony>

inspector์— Chrome์ด ํ‘œ์‹œ ํ•  # shadow-root (์—ด๋ ค ์žˆ์Œ)๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” Google์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ทธ๋ฆผ์ž DOM ์š”์†Œ์— ํฌํ•จ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ ์Šคํƒ€์ผ์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ฝ˜ํ…์ธ  ์ƒ๋‹จ์— ์ถ”๊ฐ€ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ ์ „๋žต์€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์ด ์ž์‹ ์ปดํผ๋„ŒํŠธ์— '์œ ์ถœ'๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๋‹ค. PonyComponent์— ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ์Šคํƒ€์ผ์˜ ๋…ํŠนํ•œ ๋ถ‰์€ CSS ํด๋ž˜์Šค๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ˜ธ๊ฐ„์— ์ƒํ˜ธ ์ž‘์šฉ์ด ์—†๋Š” ๊ฒƒ์ด ํ™•์‹คํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ฆผ์ž DOM์€ ๋‹ค์†Œ ์ƒˆ๋กœ์šด ์‚ฌ์–‘์ด๋ฏ€๋กœ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ฉ‹์ง„ ์›น ์‚ฌ์ดํŠธ caniuse.com์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

Emulated strategy

์ „์ˆ  ํ•œ ๋ฐ”์™€ ๊ฐ™์ด, ์ด๊ฒƒ์€ ๊ธฐ๋ณธ ์ „๋žต์ด๋‹ค. ๊ธฐ๋ณธ ์ „๋žต์„ ์—๋ฎฌ๋ ˆ์ดํŠธ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ทธ๋ฆผ์ž DOM์„ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋ฉฐ, ๊ฐ™์€ ๋™์ž‘์„ ํ•œ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด Angular 2๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ์ •์˜ ๋œ CSS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€์˜ ์š”์†Œ ๋‚ด์— ์ธ๋ผ์ธ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. (๊ธฐ๋ณธ ์ „๋žต์—์„œ ๋ณธ๋Œ€๋กœ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์— ํฌํ•จ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค ). ํ•˜์ง€๋งŒ ์ธ๋ผ์ธํ•˜๊ธฐ ์ „์— CSS ์…€๋ ‰ํ„ฐ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ๊ณ ์œ  ํ•œ ์†์„ฑ ์‹๋ณ„์ž๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋…ํŠนํ•œ ์†์„ฑ์€ ์ปดํฌ๋„ŒํŠธ ํ…œํ”Œ๋ฆฟ์˜ ๋ชจ๋“  ์š”์†Œ์— ์ถ”๊ฐ€๋˜์—ฌ์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์Šคํƒ€์ผ์€ ์šฐ๋ฆฌ์˜ ๊ตฌ์„ฑ ์š”์†Œ์—๋งŒ ์ ์šฉ๋œ๋‹ค.

<html>
  <head>
   <style>.red[_ngcontent-dvb-3] {color: red}</style>
  </head>
  <body>
   ...
   <ns-pony _ngcontent-dvb-2="" _nghost-dvb-3="">
   <div _ngcontent-dvb-3="" class="red">Rainbow Dash</div>
   </ns-pony>
  </body>
</html>

๋นจ๊ฐ„์ƒ‰ ํด๋ž˜์Šค ์„ ํƒ์ž๋Š” .red [_ngcontent-dvb-3] ์žฌ์‚ฌ์šฉ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค red์™€ ํŠน์„ฑ _ngcontent-dvb-3์„ ๋ชจ๋‘ ๊ฐ€์ง„ ์š”์†Œ์—๋งŒ ์ ์šฉ๋œ๋‹ค. ์ด ํŠน์„ฑ์€ ์šฐ๋ฆฌ์˜ div์— ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค. ns-pony ์š”์†Œ๋Š” ๋ถ€๋ชจ์— ๋Œ€ํ•ด ์ƒ์„ฑ ๋œ ๊ณ ์œ  ์‹๋ณ„์ž ์ธ _ngcontent-dvb-2์™€ ๊ทธ ๋ถ€๋ชจ์— ๋Œ€ํ•ด ์ƒ์„ฑ ๋œ _nghost-dvb-3 ์ด๊ฒƒ์€ ํ˜ธ์ŠคํŠธ ์š”์†Œ ์ž์ฒด์˜ ๊ณ ์œ  ์‹๋ณ„์ž ์ด๋‹ค. ๋ฐ”๋กœ ์‚ดํŽด ๊ฐ™์ด ํ˜ธ์ŠคํŠธ ์š”์†Œ์— ์ ์šฉ๋˜๋Š” ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

None strategy

์ด ์ „๋žต์€ ์บก์Šํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์ง€๋งŒ ์Šคํƒ€์ผ์€ ์ ์šฉ ๋œ๋‹ค. (์—๋ฎฌ๋ ˆ์ดํŠธ ์ „๋žต ๋“ฑ) ํŽ˜์ด์ง€ ์ƒ๋‹จ์— ์ธ๋ผ์ธ๋˜๋งŒ ๋‹ค์‹œ ์ž‘์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์•„์ด๋“ค์€ "์ •์ƒ์ ์ธ" ์Šคํƒ€์ผ์ฒ˜๋Ÿผ ํ–‰๋™ํ•œ๋‹ค.

Styling the host

ํŠน๋ณ„ํ•œ CSS ์…€๋ ‰ํ„ฐ๊ฐ€ ํ˜ธ์ŠคํŠธ ์š”์†Œ ๋งŒ ์Šคํƒ€์ผ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๊ฒƒ์€ host๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ์›น ์ปดํฌ๋„ŒํŠธ ๋ช…์„ธ์—์„œ ์ฐฉ์•ˆํ•œ ๊ฒƒ์ด๋‹ค.

:host {
  display: block;
}

๊ทธ๊ฒƒ์€ Native ์ „๋žต์— ์œ„ํ•ด ๊ทธ๋Œ€๋กœ ๋ณด๊ด€๋˜์–ด Emulated๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ [_nghost-xxx์— ๋‹ค์‹œ ์ž‘์„ฑ๋œ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ์—๋ฎฌ๋ ˆ์ดํŠธ ๋œ ์ „๋žต์ด ์šฐ๋ฆฌ์—๊ฒŒ ์ด ์‚ฌ์—…์„ ๋‹ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™„๋ฒฝํ•˜๊ฒŒ ์บก์Šํ™” ๋œ ์Šคํƒ€์ผ์„ ๊ฐ€์ง„ ๋ฐ ๋งŽ์ด ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ํŠน์ • ๋ธŒ๋ผ์šฐ์ €๋งŒ์„ ๋Œ€์ƒ์œผ๋กœํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ธฐ๋ณธ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์Šคํƒ€์ผ์„ ์บก์Šํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด None์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ „๋žต์„ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ „๋žต์€ ๊ตฌ์„ฑ ์š”์†Œ๋งˆ๋‹ค ์กฐ์ •ํ•  ์ˆ˜๋„ ๋ฃจํŠธ ๋ชจ๋“ˆ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์— ๋Œ€ํ•ด ์ „์ฒด์ ์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Reference URL

Last updated