ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € 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๋ฅผ ๋ฌธ์ œ์—†์ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

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์—์„œ ํ•œ๊ธ€ ๋“ฑ์ด ์‚ฌ๋žŒ ์–ธ์–ด๋กœ ํ‘œ์‹œ๋œ๋‹ค.

์›น์Šคํ†ฐ(Webstorm)์—์„œ prettier ํ™œ์„ฑํ™”ํ•˜๊ธฐ

์›น์Šคํ†ฐ์—์„œ prettier๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

์›น์Šคํ†ฐ(webstorm)์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ prettier๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ npm ๋˜๋Š” yarn์„ ํ†ตํ•ด์„œ node_modules์— prettier๋ฅผ ์„ค์น˜ํ•ด์ฃผ๊ณ  prettier๊ด€๋ จ ์„ค์ •๋งŒ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

npm install --save-dev --save-exact prettier

์œ„์™€ ๊ฐ™์ด ์„ค์น˜ํ•ด์ค€ ๋’ค File -> Settings -> Languages & Frameworks -> JavaScript -> Prettier์— ๋“ค์–ด๊ฐ€์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

Prettier package์—๋Š” node_modules/prettier๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๊ณ  ์•„๋ž˜ ์ฒดํฌ ๋ฐ•์Šค๋ฅผ ๋ชจ๋‘ ์ฒดํฌํ•ด์ฃผ๋ฉด ์ €์žฅ ์‹œ์—๋„ prettier๊ฐ€ ์ž‘๋™์ด ๋ฉ๋‹ˆ๋‹ค.

์ž‘๋™์ด ์•ˆ๋  ๋•Œ๋Š” ์›น์Šคํ†ฐ์„ ์žฌ์‹œ์ž‘.

prettier ์ž‘์—…์˜ ๋‹จ์ถ•ํ‚ค๋Š” alt+ctrl+shift+p ์ž…๋‹ˆ๋‹ค.

leaflet, ๋ฐ˜๋ณต๋˜๋Š” ์ง€๋„์— marker ํ‘œ์‹œํ•˜๊ธฐ(react)

๋งต ์ถ•์†Œ ์‹œ ๋ฐ˜๋ณต๋˜๋Š” ์ง€๋„์— Marker ๋ฐ˜์˜ํ•˜๊ธฐ

๋‹ค๋ฅธ ์˜ต์…˜์„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋งต์„ ์ตœ๋Œ€๋กœ ์ถ•์†Œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€๋„๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งต์„ ์˜ค๋ฅธ์ชฝ์ด๋‚˜ ์™ผ์ชฝ์œผ๋กœ ๋„˜๊ฒจ์„œ ์ค‘์‹ฌ์„ ๋ฐ”๊ฟ”๋„ Marker๋Š” ๊ทธ๋Œ€๋กœ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋งต ๋ Œ๋”๋ง ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ‘worldCopyJump’ ์˜ต์…˜์„ ๋„ฃ์–ด์ฃผ๋ฉด ์ค‘์‹ฌ์ด ์ด๋™ํ•˜๋”๋ผ๋„ ๊ธฐ์กด์˜ Marker๋ฅผ ๋ชจ๋‘ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<MapContainer
   center={[35.102, 129.067]}
   zoom={5}
   scrollWheelZoom={true}
   worldCopyJump
>

์˜ต์…˜ ํ•˜๋‚˜๋งŒ์œผ๋กœ ๋งต์„ ์ด๋™ํ•˜๋ฉด Marker๋„ ์ด๋™ํ•˜์—ฌ ๊ฐ™์€ ์ขŒํ‘œ์— ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

leaflet ๋งต ํ‘œ์‹œ ์–ธ์–ด ๋ณ€๊ฒฝ

์ง€๋„ ๋ฐ์ดํ„ฐ ์„œ๋ฒ„ ๋ณ€๊ฒฝํ•˜๊ธฐ

leaflet์˜ ๊ธฐ๋ณธ ๋งต์€ ๊ฐ ์ง€์—ญ๋งˆ๋‹ค ํ˜„์ง€ ๋‚˜๋ผ์˜ ์–ธ์–ด๋กœ ํ‘œ๊ธฐ๋˜์–ด ํ•œ๊ตญ ๋งต์€ ํ•œ๊ตญ์–ด, ์ผ๋ณธ ๋งต์€ ์ผ๋ณธ์–ด, ํ”„๋ž‘์Šค ๋งต์€ ํ”„๋ž‘์Šค์–ด๋กœ ํ‘œ๊ธฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

1. ๋งํฌ์—์„œ ์„œ๋ฒ„ ํ™•์ธ

http://leaflet-extras.github.io/leaflet-providers/preview/

๋งํฌ์— ์ ‘์†ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.

์ดˆ๋ก์ƒ‰ ๋„ค๋ชจ์นธ์—์„œ ์„œ๋ฒ„ ์ •๋ณด, ๋นจ๊ฐ„์ƒ‰ ๋„ค๋ชจ์นธ์—์„œ ๋งต์˜ ์ข…๋ฅ˜ ์ƒ˜ํ”Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ๋กœ OpenStreetMap.France๋ฅผ ์ ์šฉํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋นจ๊ฐ„ ๋„ค๋ชจ์นธ์—์„œ OpenStreetMap.France์„ ์„ ํƒํ•˜๋ฉด ์ดˆ๋ก ๋„ค๋ชจ์นธ์— ์„œ๋ฒ„ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

‘https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png’

‘&copy; OpenStreetMap France | &copy; <a href=”https://www.openstreetmap.org/copyright”>OpenStreetMap</a> contributors’

์ด ๋‘ ๋ถ€๋ถ„๋งŒ ์ฝ”๋“œ์—์„œ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋ฐ”๋กœ ์ ์šฉ์ด ๋ฉ๋‹ˆ๋‹ค.

2. ์ฝ”๋“œ ์ ์šฉ

import { MapContainer, TileLayer, useMap, Marker, Popup } from "react-leaflet";
import "leaflet/dist/leaflet.css";
import { icon } from "leaflet";
const Icon = icon({
  iconUrl: "marker-icon.png",
  iconSize: [16, 16],
  iconAnchor: [12, 16],
});

const MyMap = () => {
  return (
    <MapContainer
      center={[37.56675, 126.97842]}
      zoom={10}
      scrollWheelZoom={true}
      style={{ width: "500px", height: "500px" }}
    >
      <TileLayer
        attribution='&copy; OpenStreetMap France | &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
        url="https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png"
      />
      <Marker position={[37.56675, 126.97842]} icon={Icon}>
        <Popup>์„œ์šธ์‹œ์ฒญ์ด์—์š”.</Popup>
      </Marker>
    </MapContainer>
  );
};

export default MyMap;

์„ค์ •์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋œ ๋งต๊ณผ ์–ธ์–ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งฅ OS(M1)์—์„œ mongoDB ์„ค์น˜(zsh: command not found: mongo ํ•ด๊ฒฐ)

zsh์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •ํ•˜๊ธฐ

brew๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ˜น์‹œ ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ‘M1 homebrew’๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋งŽ์€ ์•ˆ๋‚ด ์ž๋ฃŒ๊ฐ€ ๋‚˜์˜ค๋ฏ€๋กœ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์„ค์น˜ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ brew search mongodb

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

tap ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋งŽ์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ brew tap mongodb/brew

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ brew search mongodb๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋” ํ™•์žฅ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์›ํ•˜๋Š” ๋ฒ„์ „์„ ์„ ํƒํ•ด์„œ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

4.2 ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๋„๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ brew install mongodb-community@4.2

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์œผ๋‹ˆ ๋จผ์ € start๋กœ ๋ชฝ๊ณ DB๋ฅผ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ brew services start mongodb/brew/mongodb-community@4.2

Successfully started ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.

์ด์ œ DB์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด mongo๋ฅผ ์ž…๋ ฅํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ปค๋งจ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ์š”.

์œ„๋ฅผ ์‚ดํŽด๋ณด๋ฉด If you need to have~~~~~ ๋ถ€๋ถ„์—์„œ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ์ž๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ผ๊ณ  ๋‚˜์˜ต๋‹ˆ๋‹ค.

$ echo 'export PATH="/opt/homebrew/opt/mongodb-community@4.2/bin:$PATH"' >> ~/.zshrc

์‹คํ–‰ํ•˜๊ณ  ๋‹ค์‹œ mongo๋ฅผ ์‹คํ–‰ํ•ด๋„ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •๋งŒ ํ•˜๊ณ  ์ ์šฉ์ด ์•ˆ๋œ ์ƒํƒœ๋ผ์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ธ๋ฐ์š”.

ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

$ source ~/.zshrc

๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘์†๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ด ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ์—๋””ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ~/.zshrc๋ฅผ ์—ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

vi ์—๋””ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด zsh(Z shell)์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํŒŒ์ผ์„ ์—ด์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ vi ~/.zshrc

์•ž์—์„œ ์„ค์ •ํ•œ path๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์›ํ•˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ณ  ์ €์žฅ(ESC + :wq + ENTER)ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ผญ! source ~/.zshrc๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€๊ฒฝ์„ ์ ์šฉ์„ ํ•ด์ค˜์•ผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

MongoDB, lean์„ ์‚ฌ์šฉํ•œ ์†๋„ ๊ฐœ์„ (mongoose)

์ฟผ๋ฆฌ์— lean() ์ถ”๊ฐ€๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ๊ฐœ์„ 

๋ชฝ๊ตฌ์Šค(mongoose) ์ฟผ๋ฆฌ์˜ ๋ฆฌํ„ด๊ฐ’์€ Document ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.

์ด ์ธ์Šคํ„ด์Šค๋Š” ๋งŽ์€ state๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด ๋‹ค์–‘ํ•œ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

.get(), .set(), .save(), toObject(), toJSON() ๋“ฑ ๋ฆฌํ„ด๊ฐ’์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ด ๊ฒฐ๊ณผ๋กœ ๋‹ค์‹œ ์ฟผ๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹จ์ง€ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋งŒ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” find() ๊ฐ™์€ ์ž‘์—…์€ ๋‹ค๋ฅธ ์ •๋ณด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ lean()์„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ์— lean()์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ POJO(Plain Old Javascript Object)๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋‹ˆ ์†๋„์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋ถ„์—์„œ ํฐ ์žฅ์ ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import sizeof from 'object-sizeof';

const query = {'status':1};
const lean = await Product.find(query).lean();
const normal = await Product.find(query).exec();

console.log('lean: '+sizeof(lean));
console.log('-----------');
console.log('normal: '+sizeof(normal));

์œ„์—์„œ lean๊ณผ normal์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

lean ํ•˜๋‚˜๋กœ ๊ฐ์ฒด์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์•ฝ 10๋ฐฐ๊ฐ€ ๋„˜๊ฒŒ ์ฐจ์ด ๋‚˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ lean์„ ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ๊ฐ’์€ .save(), .get() ๋“ฑ์˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ˆ ํ•„์š”์— ๋”ฐ๋ผ์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ ์„ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Faster Mongoose Queries With Lean



์„ฑ๋Šฅ ๊ฐœ์„ ์€ ๋›ฐ์–ด๋‚œ ์•ˆ๋ชฉ๊ณผ ๋ถ„์„๋ ฅ์ด ์žˆ์–ด์•ผ๋งŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž‘์€ ๋ถ€๋ถ„ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ฐจ์ด๋ฅผ ์Œ“์•„๊ฐ€๋Š” ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Moment.js, A Simple Tool For Calculating Date And Time(feat.Nodejs)

Easy way to calculate date and time way better

Sometimes we need to calculate date and time.

Actually more than sometimes.

And this library, moment.js, is so powerful for your purpose.

Getting date, setting a date format whatsoever you want, subtracting date from date, counting days, and others.

Below listed some functions for your quick use.

Let’s dig it.


Install moment.js

Install library with below command.

npm install moment

Import the library with ‘require’ function.

var moment = require('moment');
moment();

//ES6 syntax
import moment from 'moment';
moment();

Let’s get started from parsing date.

const date = moment(""); //2022-01-23T11:15:00+09:00

We can display date using format() method with below tokens.

tokenmeanexample
YY(YY) year ex) YYYY -> 2022, YY -> 22
MM(MM) monthex) MMMM -> January, MM -> 01
DD dateex) DD -> 25
dd(dd) dayex) dd -> Tu, dddd -> Tuesday
hhhour(12)ex) hh -> 01
HH hour(24)ex) HH -> 13
mm minuteex) mm -> 07
sssecondex) ss -> 03
a am, pmex) a -> pm
Do ordinalex) Do -> 25th
//January Tu 2022, 01:07:21 pm
moment.format('MMMM dd YYYY, hh:mm:ss a'); 

//January Tuesday 2022, pm 01:17
moment.format('MMMM dddd YYYY, a hh:mm') 

// 01/25/2022
moment.format('MM/DD/YYYY'); 

isValid() method works well on it.

moment('2022-01-25','YYYY-MM-DD').isValid(); //true

moment('2022-02-30','YYYY-MM-DD').isValid(); //false

moment('My birth is 2022-1-25','YYYY-MM-DD').isValid(); //true

Also parsing every detail date is available by intuitive methods.

hour()get hour
minute()get minute
second()get second
millisecond()get millisecond
date()get date (1~31)
day()get day of week (0~6)
week()get week of year (1~53)
month()get month (0~11)
year()get year
moment(new Date).hour(); //13

moment().millisecond(); //331

moment().week(); //5

To get the difference in date, use diff() method.

const theDate = moment('2021-01-20', 'YYYY-MM-DD');
const myDate = moment('2022-01-25', 'YYYY-MM-DD');

myDate.diff(theDate, 'days');     // 5
myDate.diff(theDate, 'year');    // 1
myDate.diff(theDate, 'month');  // 12

We can use this method for counting expire date or calculate D-day.

And there is a bunch of methods this library thanks to the last long maintenance till today.

Please check official web for further infomation.

momentjs.com