ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € pnpm, ์ƒˆ๋กœ์šด ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ฐฉ์‹(vs npm/yarn)

๊ธฐ์กด์˜ ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹๊ณผ pnpm์˜ ์˜์กด์„ฑ ํŠธ๋ฆฌ ์œ ์ง€ ๋ฐฉ์‹

pnpm์€ Performant NPM, ์ฆ‰ ๋†’์€ ์„ฑ๋Šฅ์„ ๋‚ด๋Š” npm์ด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

npm์€ ๊ณต์‹์ ์œผ๋กœ ‘์ค„์—ฌ์“ด ์•ฝ์ž๊ฐ€ ์•„๋‹ˆ๋‹ค(npm is not an acronym)’๋ผ๊ณ  ํ•˜์ง€๋งŒ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ Node Package Manager๋ผ๊ณ  ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์„ค๋ช…์ด ๋œ๋‹ค…

ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ์—์„œ๋„ npm โ†’ yarn โ†’ yarn berry๋ฅผ ๊ฑฐ์ณ ํ˜„์žฌ๋Š” pnpm์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŠน์„ฑ์ƒ ๋‚ฎ์€ ๋…ธ๋“œ ๋ฒ„์ „ ์œ ์ง€๊ฐ€ ํ•„์š”ํ•œ ๊ณณ๋งŒ npm์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์™€ ๋น„๊ตํ•ด pnpm์˜ ํŠน์ง•์„ ๋จผ์ € ์‚ดํŽด๋ณด์ž.

ํŠน์ง•pnpmnpm / yarn
์†๋„๋น ๋ฆ„(๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ)๋‹ค์†Œ ๋А๋ฆผ
ํšจ์œจ์„ฑ์ข‹์Œ(๊ธ€๋กœ๋ฒŒ ์บ์‹ฑ, ๋งํฌ ์‚ฌ์šฉ)๋‚ฎ์Œ(์ค‘๋ณต ์ €์žฅ ๊ฐ€๋Šฅ์„ฑ)
ํ˜ธํ™˜์„ฑnpm ํ˜ธํ™˜Node.js ๊ธฐ๋ณธ
์˜์กด์„ฑ ๊ด€๋ฆฌ์—„๊ฒฉํ•จ(์ถฉ๋Œ ๋ฐฉ์ง€ ์žฅ์ )๋А์Šจํ•จ
๋ชจ๋…ธ๋ ˆํฌ ์ง€์›์›Œํฌ์ŠคํŽ˜์ด์Šค ์ง€์›yarn ์ผ๋ถ€ ์ง€์›
pnpm๊ณผ npm/yarn์˜ ์ฐจ์ด

pnpm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ฐฉ์‹์€ ๊ธฐ์กด์˜ ํ˜ธ์ด์ŠคํŒ…(hoisting) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์™€ ์ฐจ๋ณ„ํ™”๋œ๋‹ค. ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹๊ณผ pnpm ๊ณ ์œ ์˜ ์˜์กด์„ฑ ํŠธ๋ฆฌ ์œ ์ง€ ๋ฐฉ์‹์„ ๋น„๊ตํ•ด๋ณด์ž.

ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹

์ „ํ†ต์ ์ธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(npm, yarn)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์˜์กด์„ฑ์„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ node_modules ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
๋ชจ๋“  ์˜์กด์„ฑ์„ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ์„ค์น˜ํ•˜์—ฌ, ํ•˜์œ„ ํŒจํ‚ค์ง€์—์„œ ํ•ด๋‹น ์˜์กด์„ฑ์„ ๋งˆ์น˜ ๋ฃจํŠธ์— ์„ค์น˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค.

ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹์˜ ์žฅ์ 

1. ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ : ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ์— ์„ค์น˜๋˜๋ฏ€๋กœ, ์˜์กด์„ฑ์„ ์ฐพ๋Š” ๋ฐ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

2. ์ค‘๋ณต ์ œ๊ฑฐ : ์ค‘๋ณต๋œ ์˜์กด์„ฑ์„ ์ƒ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ ๋‹ค.

ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹์˜ ๋‹จ์ 

1. ์˜์กด์„ฑ ์ถฉ๋Œ : ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๊ฐ€ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์˜์กด์„ฑ์„ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์œผ๋กœ ์š”๊ตฌํ•  ๋•Œ, ํ•˜๋‚˜์˜ ๋ฒ„์ „๋งŒ ์„ค์น˜๋˜๋ฏ€๋กœ ์ถฉ๋Œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌํ•œ๋‹ค.

2. ์˜์กด์„ฑ ์ˆจ๊น€ ๋ฌธ์ œ : ํ•˜์œ„ ํŒจํ‚ค์ง€๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ๋ฃจํŠธ์— ์žˆ๋Š” ์˜์กด์„ฑ์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜์–ด, ์˜์กด์„ฑ์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์œ„ํ—˜์ด ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

pnpm ๊ณ ์œ ์˜ ์˜์กด์„ฑ ํŠธ๋ฆฌ ์œ ์ง€ ๋ฐฉ์‹

pnpm์€ ์˜์กด์„ฑ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๊ฐ ํŒจํ‚ค์ง€์˜ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ๋˜ํ•œ โ€œflatโ€ ๊ตฌ์กฐ ๋Œ€์‹  ํ•˜๋“œ ๋งํฌ์™€ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์˜์กด์„ฑ์ด ์„ค์น˜๋œ ์œ„์น˜๋ฅผ ์ฐธ์กฐ๋งŒ ํ•œ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹

.pnpm ๋””๋ ‰ํ† ๋ฆฌ

๋ชจ๋“  ์˜์กด์„ฑ์€ ๋ฃจํŠธ์˜ node_modules ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€ .pnpm ๋””๋ ‰ํ† ๋ฆฌ์— ์„ค์น˜๋œ๋‹ค. ์ค‘๋ณต๋œ ์˜์กด์„ฑ์€ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•˜๊ณ , ํ•„์š”ํ•œ ์œ„์น˜์—์„œ ํ•ด๋‹น ํŒŒ์ผ์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๋…๋ฆฝ์  ์˜์กด์„ฑ ํŠธ๋ฆฌ

๊ฐ ํŒจํ‚ค์ง€๋Š” ์ž์‹ ๋งŒ์˜ node_modules๋ฅผ ๊ฐ€์ง€๊ณ , ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ .pnpm์—์„œ ์ฐธ์กฐํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋‹ค.

project/
โ”œโ”€โ”€ node_modules/
โ”‚ ย  โ”œโ”€โ”€ package-a/
โ”‚ ย  โ”‚ ย  โ””โ”€โ”€ node_modules/
โ”‚ ย  โ”‚ ย  ย  ย  โ””โ”€โ”€ dependency-a@1.0.0 -> .pnpm/dependency-a@1.0.0
โ”‚ ย  โ”œโ”€โ”€ package-b/
โ”‚ ย  โ”‚ ย  โ””โ”€โ”€ node_modules/
โ”‚ ย  โ”‚ ย  ย  ย  โ””โ”€โ”€ dependency-a@2.0.0 -> .pnpm/dependency-a@2.0.0

๋”ฐ๋ผ์„œ package-a์™€ package-b๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ dependency-a๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

pnpm ๋ฐฉ์‹์˜ ์žฅ์ 

1. ์˜์กด์„ฑ ์ถฉ๋Œ ๋ฐฉ์ง€ : ๊ฐ ํŒจํ‚ค์ง€๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ์˜์กด์„ฑ์„ ๋ฌธ์ œ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ๋น ๋ฅธ ์„ค์น˜ : ๋™์ผํ•œ ์˜์กด์„ฑ์„ ์ค‘๋ณต ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๊ณ , ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ†ตํ•ด ์ฐธ์กฐํ•˜๋ฏ€๋กœ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

3. ๋””์Šคํฌ ๊ณต๊ฐ„ ์ ˆ์•ฝ : .pnpm ๋””๋ ‰ํ† ๋ฆฌ์— ๋ชจ๋“  ์˜์กด์„ฑ์„ ๊ณต์œ  ์ €์žฅํ•˜๋ฏ€๋กœ ์ค‘๋ณต ์„ค์น˜๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

4. ๋ช…์‹œ์  ์˜์กด์„ฑ ์‚ฌ์šฉ : ํŒจํ‚ค์ง€๋Š” ๋ฐ˜๋“œ์‹œ ์ž์‹ ์ด ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•œ ์˜์กด์„ฑ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฃจํŠธ์— ์„ค์น˜๋œ ์˜์กด์„ฑ์— ์•”๋ฌต์ ์œผ๋กœ ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

pnpm ๋ฐฉ์‹์˜ ๋‹จ์ 

1. ๋ณต์žกํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ : ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹๋ณด๋‹ค ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

2. ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ : ์ผ๋ถ€ ์˜ค๋ž˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ node_modules ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ •ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.


pnpm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ฐฉ์‹์€ ์˜์กด์„ฑ ์ถฉ๋Œ ๋ฐฉ์ง€, ๋””์Šคํฌ ๊ณต๊ฐ„ ์ ˆ์•ฝ, ๋ช…์‹œ์  ์˜์กด์„ฑ ๊ด€๋ฆฌ์— ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ ํŒจํ‚ค์ง€์˜ ๋…๋ฆฝ์  ์˜์กด์„ฑ์„ ๊ด€๋ฆฌ์— ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.

์ฐธ๊ณ 
https://docs.npmjs.com
https://pnpm.io

๋ Œ๋”๋ง ์—”์ง„๊ณผ ํŠน์ง• ๋ถ„์„ํ•˜๊ธฐ(webkit, blink, gecko)

๋…๋ฆฝ ๋ฐœ์ „ํ•˜๋Š” ์›น ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์—”์ง„

์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๋Œ€ํ‘œ์ ์ธ ๋ Œ๋”๋ง ์—”์ง„์€ Webkit, Blink, Gecko ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ ๋ฐœ์ „์‚ฌ์™€ ์ ์œ ์œจ, ํŠน์ง•์„ ์‚ดํŽด๋ณด์ž.

1. ์—”์ง„์˜ ์ ์œ ์œจ

๊ฐ ์—”์ง„์˜ ์ ์œ ์œจ์€ ํ•ด๋‹น ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ ์œ ์œจ ์ถ”์ •์น˜๋กœ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์—”์ง„BlinkWebkitGecko
์ ์œ ์œจ75%20%3%
๋ธŒ๋ผ์šฐ์ €Google Chrome(65%)
Microsoft Edge(5%)
Opera(2.5%)
Samsung Internet(2.5%)
Brabe
Vivaldi
Safari(19%)
iOS์šฉ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €
Mozilla Firefox
Statcounter Global Stats – Browser Market Share ์ฐธ๊ณ 

‘iOS์šฉ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €’๋Š” ์• ํ”Œ OS์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํฌ๋กฌ, ์—ฃ์ง€ ๋“ฑ์€ Webkit, ์ด์™ธ์˜ ์œˆ๋„์šฐ, ์•ˆ๋“œ๋กœ์ด๋“œ ๋“ฑ์˜ OS์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํฌ๋กฌ, ์—ฃ์ง€๋Š” Blink๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์• ํ”Œ ๊ธฐ๊ธฐ์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ชจ๋‘ Webkit์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋Š” ์ „์ฒด์—์„œ ๋Œ€๋žต 20%๊ฐ€ ๋œ๋‹ค.

์ด ๊ฐ™์€ ํŠน์„ฑ์„ ๋ดค์„ ๋•Œ ๋งฅ OS์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ํฌ๋กฌ์˜ ํ˜ธํ™˜์„ฑ OK ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ OS๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ์˜ ํ•„์š”์„ฑ์ด ์ œ๊ธฐ๋œ๋‹ค.

2. ๋ฐœ์ „์‚ฌ

Webkit

Webkit์€ ์• ํ”Œ์—์„œ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ KHTML(1998๋…„๋ถ€ํ„ฐ ์‚ฌ์šฉ๋œ HTML ๋ Œ๋”๋ง ์—”์ง„)๊ณผ KJS(JavaScript ์—”์ง„)์„ ๊ธฐ๋ฐ˜์œผ๋กœ 2002๋…„๋ถ€ํ„ฐ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, HTML, CSS, JavaScript ๋“ฑ์„ ํ•ด์„ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•œ๋‹ค.

2003๋…„ Safari ๋ธŒ๋ผ์šฐ์ € ์ถœ์‹œ์™€ ํ•จ๊ป˜ Webkit์„ ๊ณต์‹์ ์œผ๋กœ ๋ฐœํ‘œํ–ˆ์œผ๋ฉฐ, 2005๋…„ ์˜คํ”ˆ์†Œ์Šคํ™”ํ•˜์—ฌ ํ˜„์žฌ๊นŒ์ง€ ์• ํ”Œ ์ƒํƒœ๊ณ„ ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

Webkit์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

WebCore – HTML, CSS, SVG, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ๋ Œ๋”๋ง๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋ Œ๋”๋ง ์—”์ง„

JavaScriptCore(Nitro ์—”์ง„) – JavaScript ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์—”์ง„์œผ๋กœ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋œ Nitro ์—”์ง„์ด ์ฃผ๋กœ ์‚ฌ์šฉ๋จ. Webkit์„ ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ„๋„์˜ JavaScript ์—”์ง„์ด ํ•„์š”์—†์Œ

Web Inspector – ๋‚ด์žฅ ๋””๋ฒ„๊น… ๋„๊ตฌ๋กœ DOM, css, ๋„คํŠธ์›Œํฌ ใ…‡ใ…Ž์ฒญ ๋“ฑ์˜ ๋ถ„์„๊ณผ ๋””๋ฒ„๊น…์ด ๊ฐ€๋Šฅ

ํ”Œ๋žซํผ ํŠน์ • ์ฝ”์–ด – ์šด์˜ ์ฒด์ œ์™€ ์—”์ง„์„ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ํ”Œ๋žซํผ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์ถ”์ƒํ™”, ํŠน์ • ํ”Œ๋žซํผ์—์„œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋“ฑ์„ ๋‹ด๋‹น

Webkit์˜ ํŠน์ง•์œผ๋กœ๋Š” ์›น ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ตœ์‹  ์›น ํ‘œ์ค€์„ ์ง€์›ํ•˜๋ฉฐ ์ง€์†์ ์ธ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ๊ณผ ์—๋„ˆ์ง€ ํšจ์œจ์„ฑ์ด ๊ฐ•ํ™”๋˜์—ˆ๋‹ค. ํŠนํžˆ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ ์ตœ์†Œํ™”์— ์ค‘์ ์„ ๋‘”๋‹ค.

์ดˆ๊ธฐ๋ถ€ํ„ฐ ๊ฒฝ๋Ÿ‰ํ™”๋œ ๊ตฌ์กฐ์™€ ๋น ๋ฅธ ๋ Œ๋”๋ง ์†๋„๊ฐ€ ์žฅ์ ์ด๋ฉฐ ๋†’์€ ์—๋„ˆ์ง€ ํšจ์œจ์„ฑ๊ณผ ํ•จ๊ป˜ ์• ํ”Œ ์ƒํƒœ๊ณ„์— ์ตœ์ ํ™”๋œ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ๋ณด์—ฌ์ค€๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์• ํ”Œ ์ค‘์‹ฌ ๊ฐœ๋ฐœ๊ณผ ๊ฐ•ํ•œ ํ†ต์ œ๋กœ ์ธํ•ด ์• ํ”Œ ์ƒํƒœ๊ณ„ ์™ธ์—์„œ๋Š” ๊ธฐ์ˆ  ์ฑ„ํƒ์ด ๋”๋””๋ฉฐ ํƒ€ํ”Œ๋žซํผ์˜ ๊ธฐ์—ฌ๊ฐ€ ์ œํ•œ์ ์ด๊ณ  ์ ์œ ์œจ์ด ๋‚ฎ๋‹ค.

Blink

2013๋…„ ๊ตฌ๊ธ€์ด Webkit์„ forkํ•˜์—ฌ ๋งŒ๋“  ๋ Œ๋”๋ง ์—”์ง„์ด๋‹ค. Chrome ๋ธŒ๋ผ์šฐ์ €๋„ ์ดˆ๊ธฐ์—๋Š” Webkit์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์•„ํ‚คํ…์ณ์™€ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด ๋งž์ง€ ์•Š์•„ Blink๋ฅผ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ดˆ๊ธฐ ๋ฒ„์ „์€ ์ƒ๋‹นํžˆ ๋งŽ์€ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ–ˆ์ง€๋งŒ ๋…์ž์ ์ธ ๊ฐœ๋ฐœ ๋…ธ์„ ์„ ๊ฑท๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค ์•„ํ‚คํ…์ณ์— ์ง‘์ค‘ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์šด์˜ ์ฒด์ œ์™€ ๋””๋ฐ”์ด์Šค์—์„œ ์›ํ™œํžˆ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.

Chromium(๊ตฌ๊ธ€ ์ฃผ๋„ ์˜คํ”ˆ์†Œ์Šค ์›น ๋ธŒ๋ผ์šฐ์ € ํ”„๋กœ์ ํŠธ)์€ Blink ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Chromium์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ชจ๋‘ Blink ๋ Œ๋”๋ง ์—”์ง„์„ ์‚ฌ์šฉํ•œ๋‹ค.

Blink์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

DOM core – HTML ํŒŒ์‹ฑ๊ณผ DOM ํŠธ๋ฆฌ ์ƒ์„ฑ ๋ฐ ์กฐ์ž‘ ์ง€์›

Layout&Render Engine – ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ ๋ฐ ๋ Œ๋” ํŠธ๋ฆฌ ์ƒ์„ฑ

CSS Parser&Style Engine – CSS ํŒŒ์‹ฑ ๋ฐ ์Šคํƒ€์ผ ๊ณ„์‚ฐ

DevTools – ๊ฐœ๋ฐœ์ž์šฉ ๋””๋ฒ„๊น… ๋ฐ ์„ฑ๋Šฅ ๋ถ„์„ ๋„๊ตฌ

์ฐธ๊ณ ๋กœ Blink๋Š” ๋‚ด๋ถ€์— JavaScript ์—”์ง„์„ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€ ์—”์ง„์ธ V8 ์—”์ง„์„ ์‚ฌ์šฉํ•œ๋‹ค.

ํŠน์ง•์œผ๋กœ๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค ๋ชจ๋ธ๊ณผ ํ†ตํ•ฉ๋˜์–ด ๊ฐ ํƒญ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ ๋ณด์•ˆ์ด ๊ฐ•ํ™”๋œ๋‹ค. ๋ Œ๋”๋ง ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด GPU๋ฅผ ์ ๊ทน ์‚ฌ์šฉํ•˜๊ณ  ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค ๊ตฌ์กฐ๋กœ ๋น ๋ฅธ ์„ฑ๋Šฅ๊ณผ ๊ด‘๋ฒ”์œ„ํ•œ ์ƒํƒœ๊ณ„๊ฐ€ ์žฅ์ ์ด๋‹ค.

์‹œ์žฅ ์ ์œ ์œจ์ด ์ง‘์ค‘ํ™”๋˜๋ฉด์„œ ๊ฒฝ์Ÿ์ด ์ค„๊ณ  ์›น ๊ธฐ์ˆ  ๋ฐœ์ „์ด ํŠน์ • ๊ธฐ์—…์— ์˜์กด ๊ฒฝํ–ฅ์„ ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๋ฉ”๋ชจ๋ฆฌ, CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์•„ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ๊ฐ€ ํฌ๊ณ  ํ•ด๋‹น ์ƒํƒœ๊ณ„์— ์†ํ•œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋…๋ฆฝ์„ฑ์ด ๊ฐ์†Œํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

Gecko

1997๋…„ Netscape์—์„œ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜์˜€์œผ๋ฉฐ, 2004๋…„ Firefox์˜ ํ•ต์‹ฌ ์—”์ง„์œผ๋กœ ์ฑ„ํƒ๋˜์—ˆ๋‹ค. 2017๋…„ Quantum ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ง€์›, GPU ํ™œ์šฉ, ์›น ํ‘œ์ค€ ๊ฐ•ํ™” ๋“ฑ์„ ๊ฐ•ํ™”ํ–ˆ๋‹ค.

์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋กœ๋Š” HTML parser, CSS parser, Rendering Engine ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, Gecko์— ํ†ตํ•ฉ๋œ JavaScript ์—”์ง„์€ SpiderMonkey๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์ธ Developer Tools๋„ ์ œ๊ณตํ•œ๋‹ค.

ํŠน์ง•์œผ๋กœ๋Š” Servo ํ”„๋กœ์ ํŠธ ๊ธฐ์ˆ  ํ†ตํ•ฉ์„ ํ†ตํ•ด Stylo CSS ์—”์ง„์„ ๋„์ž…ํ•˜๊ณ  ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜๋ฉฐ GPU ๊ฐ€์† ํ™œ์šฉ์ด ๊ฐ•ํ™”๋˜์—ˆ๋‹ค. ๊ฐ•๋ ฅํ•œ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ํ™•์žฅ์„ฑ์ด ์žฅ์ ์ด์ง€๋งŒ ๋‚ฎ์€ ์‹œ์žฅ ์ ์œ ์œจ๊ณผ Blink๋ณด๋‹ค ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์€ ๊ฒƒ์ด ๋‹จ์ ์ด๋‹ค.


์ถœ์ฒ˜
Chromium Documentation
Google Developers Blog
Webkit Official
Mozilla Developer Network(MDN)

๋งฅ nvm 14 ๋ฒ„์ „ ์„ค์น˜ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ(nvm install 14)

apple silicon,nvm node ๋ฒ„์ „ 14 ์„ค์น˜ํ•˜๊ธฐ

๋น„๊ต์  ์˜ค๋ž˜๋œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋…ธ๋“œ ๋ฒ„์ „์„ ๋‚ฎ์ถฐ์„œ ์ž‘์—…ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ด ๋•Œ NVM์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๊ฒŒ ๋…ธ๋“œ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ํŠน์ • ๋ฒ„์ „(ํŠนํžˆ node 14)์€ ์„ค์น˜๊ฐ€ ๋˜์ง€ ์•Š๊ณ  ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋์—†์ด ์˜ฌ๋ผ๊ฐ€๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ด ๋•Œ๋Š” ์•„ํ‚คํ…์ณ(๋งฅ ์‹ค๋ฆฌ์ฝ˜, M1, M2, M3 ๋“ฑ)์ด ์›์ธ์ธ ์ƒํ™ฉ์ด ๋งŽ์œผ๋ฏ€๋กœ ๋กœ์ œํƒ€2(Rosetta2)๋ฅผ ์‚ฌ์šฉํ•ด ์•„ํ‚คํ…์ณ๋ฅผ x86_64๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

๋จผ์ € ๋กœ์ œํƒ€2๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

$ /usr/bin/pgrep oahd

ํ”„๋กœ์„ธ์Šค ID๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.

์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋จผ์ € ๋กœ์ œํƒ€2๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

๋กœ์ œํƒ€2 ์„ค์น˜ ๋ฐฉ๋ฒ• (์• ํ”Œ ์„œํฌํŠธ ํŽ˜์ด์ง€)

์ด์ œ ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋ณด์ž.

$ arch

arm64๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉด ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด x86_64๋กœ ์ „ํ™˜ํ•œ๋‹ค.

arch -x86_64 zsh

๋‹ค์‹œ arch ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋ณด๋ฉด ๋ณ€ํ™˜๋œ ์•„ํ‚คํ…์ณ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ nvm install 14๋ฅผ ๋ฌธ์ œ์—†์ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŽ˜์ด์ง€ ์ด๋™ ํ›„ ์ฟ ํ‚ค๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ(Next.js, setHeader, writeHead)

์„ค์ •ํ•œ ์ฟ ํ‚ค๊ฐ€ ํŽ˜์ด์ง€ ์ด๋™ ํ›„ ์‚ฌ๋ผ์งˆ ๋•Œ ์˜์‹ฌํ•ด ๋ณผ ์ƒํ™ฉ

getServerSideProps์—์„œ writeHead ๋˜๋Š” setHeader๋กœ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•˜๊ณ  redirect ์‹œ

๋“ฑ๋ก๋œ ์ฟ ํ‚ค๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค.

redirect๋œ ํŽ˜์ด์ง€์—์„œ ์ฟ ํ‚ค๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค๋ฉด ํ—ค๋” ์„ค์ •์˜ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•ด ๋ด์•ผ ํ•œ๋‹ค.

ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์˜์‹ฌํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ํŽ˜์ด์ง€ ์ด๋™ ํ›„ ์ฟ ํ‚ค๊ฐ€ ์‚ฌ๋ผ์กŒ์œผ๋ฏ€๋กœ ์ฟ ํ‚ค์˜ ์‚ฌ์šฉ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์„ค์ • ๋ฌธ์ œ์ด๋‹ค.

Path=/ ์„ค์ •์€ ์ฟ ํ‚ค๊ฐ€ ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ ์œ ํšจํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ์ด ์˜ต์…˜์„ ํ†ตํ•ด ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์˜ต์…˜์ด ๋ˆ„๋ฝ๋˜๋ฉด ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์ฟ ํ‚ค๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

setHeader์™€ writeHead๋ฅผ ์‚ฌ์šฉํ•ด path=/๋ฅผ ํฌํ•จํ•˜๋Š” ์ฟ ํ‚ค ์„ค์ • ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.
HttpOnly๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.

export async function getServerSideProps({ req, res }) {

  res.setHeader('Set-Cookie', 'myCookie=value; Path=/; HttpOnly; Max-Age=3600');

  return {
    redirect:{
      destination: '/new-page', // redirectํ•  ํŽ˜์ด์ง€
      permanent: false
    }
  }
}

writeHead์˜ ์‚ฌ์šฉ๋„ ํ™•์ธํ•ด๋ณด์ž.

export async function getServerSideProps({ req, res }) {
  const cookieVal = 'myCookie=value; Path=/; HttpOnly; Max-Age=3600';

  res.writeHead(302, {
    Location: 'new-page', // redirectํ•  ํŽ˜์ด์ง€
    'Set-Cookie': cookieVal,
    'Custom-Header': 'Custom', // ์ปค์Šคํ…€ ํ—ค๋”
  });
  
  res.end();

  return {
    props: {}
  };
}

writeHead์˜ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ, ๋‘ ๋ฒˆ์งธ๋Š” ํ—ค๋” ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•œ๋‹ค.

ํ—ค๋” ๊ฐ์ฒด ๋‚ด๋ถ€์˜ Location ํ•„๋“œ๋กœ redirect ํŽ˜์ด์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ , return ๋ฌธ์— redirect๋ฅผ ์ „๋‹ฌํ•˜๋ฉด์„œ ํŽ˜์ด์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Next.js์˜ ๊ธฐ๋ณธ ๊ถŒ์žฅ ๋ฐฉ์‹์€ return ๋ฌธ์—์„œ redirect๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด writeHead์™€ setHeader์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ?

  • writeHead๋Š” ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์„ค์ •(setHeader๋Š” ๋ถˆ๊ฐ€๋Šฅ)ํ•  ์ˆ˜ ์žˆ๋Š” ๋“ฑ์˜ ์„ธ์„ธํ•œ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • setHeader๋Š” ์‘๋‹ต์ด ์‹œ์ž‘(res.end())๋˜๊ธฐ ์ „ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ writeHead๋Š” ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ƒํƒœ ์ฝ”๋“œ์™€ ์—ฌ๋Ÿฌ ํ—ค๋”๋ฅผ ๋™์‹œ์— ์„ค์ •ํ•˜๋ ค๋ฉด writeHead, ๊ฐœ๋ณ„์ ์œผ๋กœ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ˆ˜์ •ํ•  ๋•Œ๋Š” setHeader๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ด์™€ ๊ฐ™์ด Path=/๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด๋™ํ•˜๋Š” ํŽ˜์ด์ง€์— ์ƒ๊ด€์—†์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฟ ํ‚ค๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


์ถ”๊ฐ€ ์ฐธ๊ณ  : Next.js ๊ณต์‹ ๋ฌธ์„œ(Setting Headers)

๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ข…๋ฅ˜ ์•Œ์•„๋ณด๊ธฐ(WEBP, PNG, SVG, JPG, TIFF….)

Webp, png, svg, gif, psd, eps, tiff

์ด๋ฏธ์ง€ ํŒŒ์ผ ์ข…๋ฅ˜๋Š” ํฌ๊ฒŒ ์›น์šฉ(WEBP, PNG, SVG, JPG, GIF)๊ณผ ์ธ์‡„์šฉ(PSD, EPS, TIFF)์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

1. ์›น์šฉ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ

– SVG
๋ฒกํ„ฐ(Vector) ๊ทธ๋ž˜ํ”ฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ. ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด๋„ ํ’ˆ์งˆ์ด ์ €ํ•˜๋˜์ง€ ์•Š์œผ๋ฉฐ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์ฝ”๋“œ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋กœ๊ณ , ์•„์ด์ฝ˜, ์ผ๋Ÿฌ์ŠคํŠธ ๋“ฑ์— ์ ํ•ฉํ•˜๋ฉฐ PNG๋ณด๋‹ค ๋” ์ž‘์€ ์šฉ๋Ÿ‰์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

– PNG
๋ฌด์†์‹ค ์••์ถ• ์ค‘ ์ž‘์€ ํŒŒ์ผ ์šฉ๋Ÿ‰์ด ์žฅ์ ์ธ ๋ž˜์Šคํ„ฐ(Raster) ํ˜•์‹์˜ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ. ๊ทธ๋ฆผ์ด๋‚˜ ๋กœ๊ณ  ๋“ฑ ๊ฐ„๋‹จํ•œ ์ด๋ฏธ์ง€์— ์ ํ•ฉํ•˜๋ฉฐ SVG์— ๋น„ํ•ด ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ, ํˆฌ๋ช… ๋ฐฐ๊ฒฝ, ํ•„ํ„ฐ ํšจ๊ณผ, ๋ณต์žกํ•œ ์ƒ‰์ƒ๊ณผ ์„ธ๋ถ€ ์‚ฌํ•ญ ํ‘œํ˜„ ๋“ฑ์— ๋” ์œ ์šฉํ•˜๋‹ค.
๋ฌด์†์‹ค ์••์ถ•์ด์ง€๋งŒ ํ•ด์ƒ๋„ ์ œํ•œ์œผ๋กœ ์ธํ•ด ํฌ๊ธฐ์— ๋”ฐ๋ผ ํ’ˆ์งˆ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

– WEBP
๊ตฌ๊ธ€์ด ๊ฐœ๋ฐœํ•œ ์ด๋ฏธ์ง€ ํ˜•์‹์œผ๋กœ ์†์‹ค๊ณผ ๋ฌด์†์‹ค ์••์ถ•์„ ๋ชจ๋‘ ์ง€์›ํ•œ๋‹ค. ์†์‹ค์€ JPG, ๋ฌด์†์‹ค์€ PNG์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ธ๋‹ค. ์•ŒํŒŒ ์ฑ„๋„์„ ์ง€์›ํ•˜์—ฌ ํˆฌ๋ช… ๋ฐฐ๊ฒฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฌ๋Ÿฌ ์žฅ์˜ ์‚ฌ์ง„์„ ์‚ฌ์šฉํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋™์ผ ํ’ˆ์งˆ ๋Œ€๋น„ JPG, PNG๋ณด๋‹ค ์•ฝ 30% ๊ฐ€๋Ÿ‰ ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋ฉฐ, ์›น ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค.

– JPG
JPEG๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ์‚ฌ์ง„์ด๋‚˜ ๊ทธ๋ผ๋ฐ์ด์…˜ ๋“ฑ ์—ฌ๋Ÿฌ ์ƒ‰์ƒ์„ ํฌํ•จํ•˜๋Š” ์ด๋ฏธ์ง€์— ์ ์ ˆํ•˜๋‹ค. ์†์‹ค ์••์ถ•์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์šฉ๋Ÿ‰์ด ์ž‘์ง€๋งŒ ๊ฐ™์€ ์ด๋ฏธ์ง€๋ฅผ ๊ณ„์† JPG๋กœ ๋ฎ์–ด์“ฐ๊ฒŒ ๋˜๋ฉด ๊ณ„์†๋˜๋Š” ์†์‹ค ์••์ถ•์œผ๋กœ ์ธํ•ด ํ™”์งˆ ์ €ํ•˜๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

– GIF
์ƒ‰์˜ ์ˆ˜๊ฐ€ 256์ƒ‰์œผ๋กœ ํŒŒ์ผ ์šฉ๋Ÿ‰์ด ์ž‘์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€์˜ ๋ฐฐ์—ด์„ ํ†ตํ•ด ์›€์ง์ด๋Š” ์˜์ƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ฌด์†์‹ค ์••์ถ• ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ƒ‰์ƒ ์ˆ˜์˜ ์ œํ•œ์œผ๋กœ ์ธํ•ด ์ผ๋ถ€ ์‚ฌํ•ญ์ด ์†์‹ค๋  ์ˆ˜ ์žˆ๋‹ค.

2. ์ธ์‡„์šฉ ๋ฐ์ดํ„ฐ

– TIFF
์ด๋ฏธ์ง€๋ฅผ ์••์ถ•ํ•˜์ง€ ์•Š๊ณ  ์ €์žฅํ•˜๋Š” ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ. ์ธ์‡„ ๋ฐ ๊ทธ๋ž˜ํ”ฝ ์ž‘์—…์—์„œ ์ธ๊ธฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ ์ €์žฅ์„ ๋ฐ˜๋ณตํ•ด๋„ ํ™”์งˆ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฌด์†์‹ค ๋ฐฉ์‹์ด๋ฏ€๋กœ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ํฌ๊ณ  ์••์ถ•, ์ตœ์ ํ™”๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์›น์šฉ์œผ๋กœ๋Š” ์ ์ ˆํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๋Œ€๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค.

– PSD
ํฌํ† ์ƒต ์ €์žฅ ํ˜•์‹์œผ๋กœ ๋ ˆ์ด์–ด ์ •๋ณด๋ฅผ ํฌํ•จํ•ด ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ ˆ์ด์–ด ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋ฉด ์šฉ๋Ÿ‰์ด ์ปค์ง€๋ฏ€๋กœ ์ €์žฅ ์‹œ ๋ ˆ์ด์–ด ๋ณ‘ํ•ฉ์„ ํ†ตํ•ด ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ํฌํ† ์ƒต ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ๋ณต์žกํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ณ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ JPG, PNG๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

– EPS
์–ด๋„๋น„ PortScript๋กœ ๋งŒ๋“  ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ. ์ €ํ•ด์ƒ๋„์™€ ๊ณ ํ•ด์ƒ๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ €ํ•ด์ƒ๋„๋กœ ์ž‘์—…ํ•˜๊ณ  ๊ณ ํ•ด์ƒ๋„๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ๋กœ ์ธ์‡„์— ์ ํ•ฉํ•˜๋‹ค.


MDN – SVG
Wikipedia – PNG
Wikipedia – WebP

spec.template: Invalid value ์—๋Ÿฌ


~~~ is invalid. spec.template: Invalid value

yaml์„ ์ž‘์„ฑํ•˜๊ณ  kubectl apply -f sample.yaml๊ณผ ๊ฐ™์ด ์ ์šฉํ•  ๋•Œ spec.template์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค.

์ด ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค๋ฉด ํ•ด๋‹น yaml๋กœ ํŒŒ๋“œ๋ฅผ ์ฒ˜์Œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ,์ˆ˜์ • ์‚ฌํ•ญ์ด ์กฐ๊ฑด์— ์œ„๋ฐฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

spec.Completions
spec.Selector
spec.Template
ย 

์ด ํ•ญ๋ชฉ๋“ค์€ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•˜๋„๋ก ์ง€์ •๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ spec.template๋ฅผ ์ˆ˜์ •ํ•˜๋Š” applyํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์ด๋‹ค.

์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•˜๋ฏ€๋กœ ์‹ ๊ทœ ์ƒ์„ฑ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๋‹น yaml์„ kubectl delete -f sample.yaml๋กœ ์ œ๊ฑฐํ•œ ๋’ค ๋‹ค์‹œ apply๋ฅผ ์ ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


์ฐธ๊ณ  : https://github.com/kubernetes/kubernetes/issues/89657

bash์—์„œ vim ์„ค์น˜(feat.ํ•œ๊ธ€ ์„ค์ •)

bash: vim: command not found

๊ฒฝ๋Ÿ‰ํ™”๋ฅผ ์ถ”๊ตฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์—๋Š” ๊ธฐ๋ณธ ์—๋””ํ„ฐ๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•„์š” ์‹œ ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ bash์—์„œ vim ์—๋””ํ„ฐ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ•œ๊ธ€ ์„ค์ •(UTF-8, CP949)๊นŒ์ง€ ์•Œ์•„๋ณด์ž.

1. vim ์—๋””ํ„ฐ ์„ค์น˜

$ apt-get update

Hit:1 http://deb.debian.org/debian bookworm InRelease
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Hit:3 http://deb.debian.org/debian-security bookworm-security InRelease
$ apt install vim

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libsodium23 vim-common vim-runtime xxd
Suggested packages:
  ctags vim-doc vim-scripts
The following NEW packages will be installed:
  libsodium23 vim vim-common vim-runtime xxd
0 upgraded, 5 newly installed, 0 to remove and 40 not upgraded.
Need to get 8962 kB of archives.
After this operation, 41.8 MB of additional disk space will be used.
Do you want to continue? [Y/n] 

bash์—์„œ ๋‘ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  y๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ๋์ด๋‹ค(๊ถŒํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด sudo๋ฅผ ์•ž์— ๋ถ™์ธ๋‹ค).

๊ทธ๋Ÿฐ๋ฐ ํ•œ๊ธ€์ด๋‚˜ ์ผ๋ณธ์–ด ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ธ์ฝ”๋”ฉ์ด ํ•„์š”ํ•˜๋‹ค.

UTF-8์„ ์„ค์ •ํ•ด๋ณด์ž.

vim ์ธ์ฝ”๋”ฉ ์„ค์ •(UTF-8)

์„ค์น˜ํ•œ vim์„ ์‚ฌ์šฉํ•ด /etc/vim/vimrc์„ ์—ด๊ณ  ํ•˜๋‹จ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

" Source a global configuration file if available
if filereaedable("/etc/vim/vimrc.local")
  source /etc/vim/vimrc.local
endif

//์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„
set encoding=utf-8
set fileencodings=utf-8,cp949

utf-8์€ mac, cp949๋Š” windows์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด๋‹ค.

์ €์žฅํ•˜๋ฉด vim์—์„œ ํ•œ๊ธ€ ๋“ฑ์ด ์‚ฌ๋žŒ ์–ธ์–ด๋กœ ํ‘œ์‹œ๋œ๋‹ค.

์•Œ๊ธฐ ์‰ฌ์šด BEM ์•Œ์•„๋ณด๊ธฐ(CSS)

block__element_modifier๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์˜ ๋ฐฉ๋ฒ•๋ก  (+mix)

๊ณต์‹ ๋ฌธ์„œ(https://en.bem.info)์—์„œ๋Š” BEM์„ ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค.

BEM(Block, Element, Modifier)๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‹ค. ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๋…๋ฆฝ๋œ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ UI๋„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

BEM์€ ๋ชจ๋“ˆ์„ Block, Element, Modifier ๋‹จ์œ„๋กœ ๋ถ„ํ•ดํ•˜๋ฉฐ, ๊ฐ ์•ž ๊ธ€์ž๋ฅผ ๋”ฐ์„œ BEM์œผ๋กœ ๋ถ€๋ฅธ๋‹ค. BEM์€ ๋Ÿฌ์‹œ์•„ Yandex์‚ฌ์—์„œ ๊ฐœ๋ฐœํ•œ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ์‹ค์ œ๋กœ ์ด ๋ฐฉ๋ฒ•์— ๊ธฐ๋ฐ˜ํ•œ CSS ์„ค๊ณ„ ๊ธฐ๋ฒ•์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€๋งŒ BEM์€ CSS์—๋งŒ ๊ตญํ•œ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด BEM์˜ ๊ณตํ†ต ๊ทœ์น™๊ณผ ๋ชจ๋“ˆ์˜ ๊ฐœ๋ณ„ ๊ทœ์น™์„ ์•Œ์•„๋ณด์ž.

CSS style์„ ์œ„ํ•œ BEM ๊ณตํ†ต ๊ทœ์น™

– ID ์…€๋ ‰ํ„ฐ์™€ ํƒœ๊ทธ ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
– ๋„ค์ŠคํŒ…๋œ ์…€๋ ‰ํ„ฐ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.
– CSS ํด๋ž˜์Šค ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ณ  ์…€๋ ‰ํ„ฐ์˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•œ๋‹ค.
– Blocks, Elements, Modifiers๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
– Blocks๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

BEM์˜ ๋„ค์ด๋ฐ ๊ทœ์น™

๋ชจ๋‘ ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋‘ ๋‹จ์–ด๋Š” ํ•˜์ดํ”ˆ(-)์œผ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.

Blockblock, block-two
Elementblock ์ด๋ฆ„์„ ์ƒ์†๋ฐ›์•„ ์–ธ๋”์Šค์ฝ”์–ด ๋‘ ๊ฐœ(__)๋กœ ์—ฐ๊ฒฐblock__element, block-two__element-two
ModifierBlock/Element ์ด๋ฆ„ ์ƒ์†๋ฐ›์•„ ์–ธ๋”์Šค์ฝ”์–ด ํ•˜๋‚˜(_)๋กœ ์—ฐ๊ฒฐ. ํ‚ค-๊ฐ’ ์Œ์€ ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค(_)๋ฅผ ์‚ฌ์šฉ.
block_modifier, block__element_modifier, element_key_value
Modifier
(MindBEMding)
Block/Element ์ด๋ฆ„ ์ƒ์†๋ฐ›์•„ ํ•˜์ดํ”ˆ ๋‘๊ฐœ(–)๋กœ ์—ฐ๊ฒฐ. ํ‚ค-๊ฐ’์—์„œ ํ‚ค๋Š” ์ƒ๋žต๊ฐ€๋Šฅ.block–modifier, element–value

๋ชจ๋“ˆ์˜ ๊ฐœ๋ณ„ ๊ทœ์น™

๋…ผ๋ฆฌ์ , ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋…๋ฆฝ๋˜์–ด ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ๋กœ ์ •์˜ํ•œ๋‹ค. ํด๋ž˜์Šค ์ด๋ฆ„์€ ‘ํ˜•ํƒœ’๊ฐ€ ์•„๋‹ˆ๋ผ ‘๋ชฉ์ , ์šฉ๋„’๋ฅผ ๋‚˜ํƒ€๋‚ด์•ผ ํ•œ๋‹ค.

EX) head, logo, menu (O)
blue-button, small-title (X)

block์€ ๋‹ค๋ฅธ block ๋‚ด๋ถ€์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, modifier๋ฅผ ํ†ตํ•ด ์œ„์น˜๋‚˜ ๋ชจ์–‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆผ – block์˜ ์ค‘์ฒฉ(์ถœ์ฒ˜: en.bem.info)

Element

block์„ ๊ตฌ์„ฑํ•˜๋ฉฐ block ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ๋กœ ์ •์˜ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด menu__item์€ menu๋ผ๋Š” block์„ ๊ตฌ์„ฑํ•˜๋ฉฐ menu ๋ฐ–์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ element๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ฆผ – block์„ ๊ตฌ์„ฑํ•˜๋Š” element(์ถœ์ฒ˜:en.bem.info)


element ํด๋ž˜์Šค ์ด๋ฆ„๋„ block๊ณผ ๋™์ผํ•˜๊ฒŒ ‘ํ˜•ํƒœ’๊ฐ€ ์•„๋‹ˆ๋ผ ‘์šฉ๋„’๋ฅผ ๋‚˜ํƒ€๋‚ด์•ผ ํ•œ๋‹ค.
element๋Š” ์„ ํƒ์  ์š”์†Œ์ด๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ƒ๊ด€์—†์ง€๋งŒ element ์ด๋ฆ„์„ ์ค‘์ฒฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

EX) block__element__element, menu__button__icon (X)

Modifier

block/element์˜ ๋ชจ์–‘์ด๋‚˜ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค.
modifier๋Š” ์„ ํƒ์  ์š”์†Œ์ด๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ƒ๊ด€์—†์ง€๋งŒ ๋‹จ๋…์œผ๋กœ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  block/element์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
๊ฐ™์€ block์ด๋ผ๋„ modifier์— ๋”ฐ๋ผ ๋ชจ์–‘์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, modifier๋Š” ๋Ÿฐํƒ€์ž„์ด๋‚˜ block์— ๋”ฐ๋ผ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.
modifier ํด๋ž˜์Šค ์ด๋ฆ„์€ ํ˜•ํƒœ(ํฌ๊ธฐ, ์ƒ‰, ์ƒํƒœ, ๋™์ž‘)์„ ๋‚˜ํƒ€๋‚ด์•ผ ํ•œ๋‹ค. ํ˜•ํƒœ๋กœ ๋‚˜๋ˆ„๋ฉด boolean, key-value ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

– boolean : ex) active, disabled
– key-value : ex) color_red, line_doubled (์Šค๋„ค์ดํฌ ์ผ€์ด์Šค๋กœ ํ‘œํ˜„)

modifier์˜ ์ˆ˜๋Š” ์ œํ•œ์ด ์—†์œผ๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์ผํ•œ ์Šคํƒ€์ผ์€ ์ค‘๋ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

MIX

mix๋Š” ํ•˜๋‚˜์˜ ์š”์†Œ์— ์—ญํ• ์ด ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.
์žฅ์ ์€ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด์˜ ์Šคํƒ€์ผ๊ณผ ์กฐํ•ฉํ•ด์„œ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
block+element, block+block, element+element ๋“ฑ์˜ mix๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

<!-- HTML -->
<div class="header">
  <div class="logo header__logo"></div>
</div>

/* CSS */
.logo {
  width:100px;
  height:50px;
}
.header__logo {
  margin: 12px;
}

๋‹ค๋ฅธ ์š”์†Œ์™€ ๊ด€๊ณ„๋œ ๋ ˆ์ด์•„์›ƒ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์€ mix, block ๋‚ด๋ถ€์˜ ๋ฌธ์ œ๋Š” modifier๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
mix๋Š” ๋…๋ฆฝ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.


์ฐธ๊ณ 
https://en.bem.info
– ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” CSS ์„ค๊ณ„ ์‹ค์ „ ๊ฐ€์ด๋“œ


CSS ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ฐ€์ด๋“œ

๋ณ€๊ฒฝ๊ณผ ํ™•์žฅ์— ๊ฐ•ํ•˜๊ณ  ์•ˆ์ •์ ์ธ CSS ๊ตฌ์กฐ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ฒ•

๋‹ค์–‘ํ•œ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” CSS ์„ค๊ณ„ ์‹ค์ „๊ฐ€์ด๋“œ์—์„œ ์†Œ๊ฐœํ•˜๋Š” ์„ค๊ณ„์˜ ํ•ต์‹ฌ์„ ์•Œ์•„๋ณด์ž.

CSS์˜ ์—ฌ๋Ÿฌ ์„ค๊ณ„ ๊ธฐ๋ฒ•๋“ค๋„ ๊ฒฐ๊ตญ์—๋Š” ๋‹ค์Œ ์—ฌ๋Ÿ ๊ฐ€์ง€ ๋ฆฌ์ŠคํŠธ์— ์†ํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ ํ•ต์‹ฌ์„ ๊ด€ํ†ตํ•˜๋Š” ํฌ์ธํŠธ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

1. ํŠน์„ฑ์— ๋”ฐ๋ฅธ CSS ๋ถ„๋ฅ˜
2. ๋А์Šจํ•œ ์Šคํƒ€์ผ์˜ ๊ฒฐํ•ฉ
3. ์ ๋‹นํ•œ ์˜ํ–ฅ ๋ฒ”์œ„
4. ํŠน์ • ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์˜์กด๋„
5. ์ ์ ˆํ•œ ๋ช…์‹œ๋„(specificity)
6. ์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ์œ ์ถ” ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋„ค์ž„
7. ํ˜•ํƒœ, ๊ธฐ๋Šฅ, ์—ญํ• ์˜ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋„ค์ž„
8. ํ™•์žฅ ์šฉ์ด์„ฑ

1. ํŠน์„ฑ์— ๋”ฐ๋ฅธ CSS ๋ถ„๋ฅ˜

์ฒซ ๋ฒˆ์งธ๋Š” CSS ์—ญํ• ์ด๋‚˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฒ ์ด์Šค ๊ทธ๋ฃน : ์‚ฌ์ดํŠธ์—์„œ ๋ฒ ์ด์Šค๊ฐ€ ๋˜๊ฑฐ๋‚˜ ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ์‚ฌํ•ญ ๋“ฑ
๋ ˆ์ด์•„์›ƒ ๊ทธ๋ฃน : ํ—ค๋”(header), ํ‘ธํ„ฐ(footer), ์ฝ˜ํ…์ธ (content) ์˜์—ญ ๋“ฑ
๋ชจ๋“ˆ ๊ทธ๋ฃน : ์žฌ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ ๋“ฑ

๋ชจ๋“ˆ ์ž์ฒด์—๋Š” ๋ ˆ์ด์•„์›ƒ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์€ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ชจ๋“ˆ์€ ์ž์‹ ์˜ ๋ ˆ์ด์•„์›ƒ์—๋Š” ๊ด€์—ฌํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๋ชจ๋“ˆ ์ž์ฒด์˜ ์—ญํ•  ๋ฐ ์ž๋…€ ์š”์†Œ์˜ ์Šคํƒ€์ผ๋ง์—๋งŒ ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ ˆ์ด์•„์›ƒ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์ด๋ž€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

-position, z-index, top/right/bottom/left, float, width, margin

/* ๋ฒ ์ด์Šค */
body {
  font-family: 'Noto Sans';
}

/* ๋ ˆ์ด์•„์›ƒ */
layout_content {
  width: 1000px;
  padding: 10px;
  margin: 0 auto;
}

/* ๋ชจ๋“ˆ */
.bl_media {
  display: flex;
  justify-items: center;
  align-items: center;
}

.bl_media_title {
  margin: 5px;
  font-weight: bold;
}

2. ๋А์Šจํ•œ ์Šคํƒ€์ผ์˜ ๊ฒฐํ•ฉ

์ •ํ™•ํžˆ๋Š” HTML๊ณผ ์Šคํƒ€์ผ๋ง์˜ ๋А์Šจํ•œ ๊ฒฐํ•ฉ์ด๋‹ค. ๋А์Šจํ•œ ๊ฒฐํ•ฉ์ด๋ž€ ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ๋ฅผ ์ด์•ผ๊ธฐํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์š”์†Œํ˜• ์…€๋ ‰ํ„ฐ๋ฅผ ํ”ผํ•˜๊ณ  ํด๋ž˜์Šค ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

p{}, div{}, h1{}๊ณผ ๊ฐ™์ด ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ง์ ‘ ์ •์˜ํ•˜๋Š” ์š”์†Œํ˜• ์…€๋ ‰ํ„ฐ๋Š” ์š”์†Œ์˜ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ์Šคํƒ€์ผ์ด ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋ฏ€๋กœ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

3. ์ ๋‹นํ•œ ์˜ํ–ฅ ๋ฒ”์œ„

์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ๊ฐ€๋Šฅํ•œ ์ข๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ๋„“์€ CSS์˜ ์Šคํƒ€์ผ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.

์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์ฑ„ ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๋‹ค๋ณด๋ฉด ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ตœ๋Œ€ํ•œ ๋ฒ”์œ„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ํฌํ•จ์‹œํ‚ค๊ฑฐ๋‚˜ ์†์ž์™€ ์ž๋…€ ์…€๋ ‰ํ„ฐ์˜ ์‚ฌ์šฉ๋„ ํ•จ๊ป˜ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

4. ํŠน์ • ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์˜์กด๋„

์ปจํ…์ŠคํŠธ๋ž€ ์œ„์น˜ ๋˜๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ณ€ํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์‚ฌ์šฉ ๋ชฉ์ ์ด ๋ช…ํ™•ํ•˜๋‹ค๋ฉด ๋ฌธ์ œ์—†์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์…€๋ ‰ํ„ฐ๋ฅผ ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ๊ตฌ์ฒดํ™”ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค.

/* id์ธ main์„ ์ง€์ •ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ .title_top ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด ์˜์กด๋„๊ฐ€ ๋†’์•„์ง. -> ๋ถˆํ•„์š”ํ•œ #main ์ œ๊ฑฐ */
#main .title_top{
  display:flex;
  align-items: center;
  color: green;
}

5. ์ ์ ˆํ•œ ๋ช…์‹œ๋„(specificy)

์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ช…์‹œ๋„์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ช…์‹œ๋„๊ฐ€ ๋†’์€ CSS์˜ ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

– ์…€๋ ‰ํ„ฐ ์˜ˆ์ธก์ด ์–ด๋ ค์›€
– ๋‹ค๋ฅธ ์š”์†Œ(๋ถ€๋ชจ ์š”์†Œ ๋“ฑ)์— ๋Œ€ํ•œ ์˜์กด๋„ ์ƒ์Šน
– ๋ฎ์–ด์“ฐ๊ธฐ์˜ ์–ด๋ ค์›€
– ์œ ์ง€ ๋ณด์ˆ˜์˜ ์–ด๋ ค์›€

๋‹น์—ฐํžˆ !important๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ด๋ฉฐ, ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํด๋ž˜์Šค ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. id ์…€๋ ‰ํ„ฐ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋งค์šฐ ๋†’์œผ๋ฉฐ ํ•œ ํŽ˜์ด์ง€ ์•ˆ์—์„œ ๋™์ผํ•œ ๊ฐ’์€ ํ•œ๋ฒˆ ๋ฐ–์— ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ์ œ์•ฝ๋„ ์žˆ์œผ๋ฏ€๋กœ id๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์ ์€ ๋งŽ์ง€ ์•Š๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜๋„ํ•˜์ง€ ์•Š์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋’ค์„ž์ด์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

6. ์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ์œ ์ถ” ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋„ค์ž„

๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ชจ๋“ˆ์ด๋‚˜ ํด๋ž˜์Šค๋„ ๋Š˜์–ด๋‚˜๋ฏ€๋กœ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ์ˆ˜์ •์ด ์–ด๋–ค ๋ฒ”์œ„๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€๋ฅผ ์ด๋ฆ„์—์„œ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

HTML์—์„œ ์ •์˜๋œ ์š”์†Œ์˜ ํด๋ž˜์Šค ๋„ค์ž„๋งŒ ๋ณด๊ณ ๋„ CSS์˜ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.

ํด๋ž˜์Šค ๋„ค์ž„์œผ๋กœ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์‰ฝ๊ฒŒ ์œ ์ถ”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž๋…€ ์š”์†Œ์— ๋ฃจํŠธ ์š”์†Œ์˜ ํด๋ž˜์Šค ๋„ค์ž„์„ ํฌํ•จํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

7. ํ˜•ํƒœ, ๊ธฐ๋Šฅ, ์—ญํ• ์˜ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋„ค์ž„

์˜ํ–ฅ ๋ฒ”์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ˜•ํƒœ, ๊ธฐ๋Šฅ, ์—ญํ• ๋„ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋„ค์ž„์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

– title1, title2, title3
– main-title, nav-title, sub-title

๋‘ ํ•ญ๋ชฉ ์ค‘ ํ˜•ํƒœ๋‚˜ ๊ธฐ๋Šฅ, ์—ญํ• ์˜ ์œ ์ถ”๊ฐ€ ์‰ฌ์šด ์ชฝ์ด ์–ด๋””์ธ์ง€๋Š” ๋ถ„๋ช…ํ•˜๋‹ค. ๊ฐ ๋ชจ๋“ˆ์˜ ๊ธฐ๋Šฅ์ด๋‚˜ ์—ญํ• ์— ๋งž์ถฐ ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ํŠนํžˆ ์ž‘์€ ๊ทœ๋ชจ์˜ ์ฝ”๋“œ๋ผ๋ฉด title1, title2์™€ ๊ฐ™์ด ๋„ค์ž„์„ ๋Œ€์ถฉ ์ง€์ •ํ•˜๊ธฐ ์‰ฝ๋‹ค. ํ•˜์ง€๋งŒ ๊ทœ๋ชจ๋ž€ ์–ธ์ œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ปค์งˆ์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ ํ•ญ์ƒ ์Šต๊ด€์ ์œผ๋กœ ์ด๋ฆ„์—์„œ ํ˜•ํƒœ, ๊ธฐ๋Šฅ, ์—ญํ• ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ตฌ์ฒด์„ฑ๊ณผ ๋ฒ”์šฉ์„ฑ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋„๋ก ํ•˜๋Š” ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค.

8. ํ™•์žฅ ์šฉ์ด์„ฑ

ํ™•์žฅ์„ฑ์ด๋ž€ ๊ฒฐ๊ตญ ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€๋‚˜ ์œ ์ง€์™€ ์—ฐ๊ฒฐ๋˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, ํ•ญ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘์–ด์•ผ ํ•œ๋‹ค.

ํ™•์žฅ์ด ์‰ฝ๋„๋ก ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ํด๋ž˜์Šค์—๋Š” ๊ธฐ๋Šฅ, ์—ญํ• ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ƒ์„ธ๋„์™€ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ๊ฐ–๋„๋ก ํ•œ๋‹ค.

ํ™•์žฅ์ด ์‰ฌ์šด ํด๋ž˜์Šค๋ž€ ๋ฉ€ํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—๋Š” ๋ณดํŽธ์ ์ธ ์†์„ฑ, ์ถ”๊ฐ€ ํด๋ž˜์Šค์—๋Š” ํŠน์ • ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋กœ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด HTML์€ ๋ณต์žกํ•ด์ง€์ง€๋งŒ CSS๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ด์ง€๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ ํด๋ž˜์Šค์˜ ์ด์ ์€ ๋ถˆ๊ทœ์น™ํ•œ ์ƒํ™ฉ์—์„œ๋„ ํด๋ž˜์Šค ํ•˜๋‚˜๋งŒ์œผ๋กœ ์›ํ•˜๋Š” ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๊ฒฐํ•จ์ด๋‹ค.

๊ฒฐ๊ตญ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ๋ณ„๊ฐœ์˜ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ ๋‹ค ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ž‘์€ ์ˆ˜์ • ํ•˜๋‚˜๊ฐ€ ํฐ ๋‚˜๋น„ํšจ๊ณผ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

๋งค๋ฒˆ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฒดํฌํ•ด๊ฐ€๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ž‘์„ฑ ๋ฐฉ์‹์ด ๊ณ ๋ฏผ๋˜๊ฑฐ๋‚˜ ์ž์œจ์„ฑ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ๋ฅผ ๋– ์˜ฌ๋ฆฌ๋ฉด์„œ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด ์ƒ๊ฐ๋ณด๋‹ค๋„ ๋” ๊ฒฌ๊ณ ํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.


์ฐธ๊ณ  : ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” CSS ์„ค๊ณ„ ์‹ค์ „๊ฐ€์ด๋“œ(2021, ์ œ์ดํŽ)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, class๋ฅผ ๋ฌธ๋ฒ•์  ์„คํƒ•(syntactic sugar)์ด๋ผ ๋ถ€๋ฅด๋Š” ์ด์œ 

function์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” class์˜ ๋™์ž‘ ๋ฐฉ์‹

‘๋ฌธ๋ฒ•์  ์„คํƒ•’์€ ํ†ต์šฉ๋˜๋Š” ๋‹จ์–ด์ด์ง€๋งŒ ์–ด๊ฐ์ด ์ด์ƒํ•œ ๊ฑด ์–ด์ฉ” ์ˆ˜ ์—†๋‹ค. ์˜์—ญํ•˜์—ฌ ‘ํŽธ๋ฆฌํ•œ ๊ตฌ๋ฌธ ์šฉ๋ฒ•’ ์ •๋„๊ฐ€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™๋‹ค.

์œ„ํ‚ค์—์„œ syntactic sugar์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

In computer science, syntactic sugar is syntax within a programming language that is designed to make things easier to read or to express.
์ปดํ“จํ„ฐ ๊ณผํ•™ ๋ถ„์•ผ์—์„œ ‘ํŽธ๋ฆฌํ•œ ๊ตฌ๋ฌธ ์šฉ๋ฒ•’์ด๋ž€ ์ฝ๊ธฐ ์‰ฝ๊ณ  ํ‘œํ˜„ํ•˜๊ธฐ ์‰ฝ๋„๋ก ๊ตฌ์„ฑ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋‚ด์˜ ๊ตฌ๋ฌธ์ด๋‹ค.

์ฆ‰, ๋‹ฌ์ฝคํ•œ ์ดˆ์ฝœ๋ฆฟ์ฒ˜๋Ÿผ ์†์ด ์ž์ฃผ ๊ฐ€๋Š” ๊ตฌ๋ฌธ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ํƒœ์–ด๋‚˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ES ๋ฒ„์ „์œผ๋กœ ๋Œ€ํ‘œ๋˜๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ๊ธฐ์กด์˜ ๋ฌธ๋ฒ•์œผ๋กœ ๊ตฌํ˜„๋œ ๊ฒƒ์ด ๋งŽ๋‹ค.

class ๋˜ํ•œ ๊ธฐ์กด์˜ OOP์—์„œ ์ฐจ์šฉํ•œ ๊ฐœ๋…์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ ๋ฐฉ์‹์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ๋ฒ•์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค๋ฅด์ง€๋งŒ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ๋‘ ์ฝ”๋“œ์˜ ์ž‘๋™ ๋ฐฉ์‹์€ ๋™์ผํ•˜๋‹ค.

function์œผ๋กœ ์„ ์–ธ๋œ ๋ถ€๋ถ„์ด ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹์ด๋ฉฐ class๊ฐ€ ์„ ์–ธ๋˜๋ฉด ์ด function๊ณผ ์™„์ „ํžˆ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค.

๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ function๊ณผ class ์ค‘ ์–ด๋–ค ๊ฒƒ์— ๋” ์„ ๋œป ์†์ด ๊ฐ€๋Š”์ง€๋ฅผ ๋ฌป๋Š”๋‹ค๋ฉด ์„คํƒ•์˜ ์˜๋ฏธ๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

function ์‚ฌ์šฉ

function createGame( user, point ) {
  this.user = user;
  this.point = point;
}

createGame.prototype.addPoint = function() { this.point++; };

const myGame = new createGame("Yoon", 0);

myGame.addPoint();

class ์‚ฌ์šฉ

class CreateGame {
  constructor (user, point) {
    this.user = user;
    this.point = point;
  }
  addPoint() { this.point++; }
}

const myGame = new CreateGame("Yoon", 0);
myGame.addPoint();