Xterm.js: ํ„ฐ๋ฏธ๋„์ด ํŠธ๋ฃจ ์ปฌ๋Ÿฌ๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2017๋…„ 01์›” 16์ผ  ยท  20์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: xtermjs/xterm.js

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๐Ÿ˜ƒ์ด ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  20 ๋Œ“๊ธ€

๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŠธ๋ฃจ์ปฌ๋Ÿฌ ์ง€์›์„ ์–ป์œผ๋ ค๊ณ  hterm์„ ํ•ดํ‚นํ•ด ์™”์ง€๋งŒ ์ด๊ฒƒ์ด ๋” ๋‚˜์€ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://github.com/sourcelair/xterm.js/blob/365a9f949cc1acfb6c4649ee1d85da3bbc60f928/src/InputHandler.ts#L1276

๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์€ ์บ๋ฆญํ„ฐ์— ๋Œ€ํ•ด ์ƒ‰์ƒ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•(์•„๋งˆ๋„ ์ธ๋ผ์ธ style ์†์„ฑ)์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/sourcelair/xterm.js/pull/450 ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์†์„ฑ ์ถ”๊ฐ€๋ฅผ ๋‹จ์ˆœํ™”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋‚˜๋ฉด ํ•œ ๋ฒˆ ๋ด์•ผ๊ฒ ์ง€๋งŒ ์ปจํŠธ๋กค ์‹œํ€€์Šค์— ๋„ˆ๋ฌด ์ต์ˆ™ํ•˜๋‹ค๊ณ ๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

http://invisible-island.net/xterm/ctlseqs/ctlseqs.html์„ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ํŠธ๋ฃจ ์ปฌ๋Ÿฌ๋‚˜ 24๋น„ํŠธ ์ปฌ๋Ÿฌ์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์„ ๋‹ค๋ฃจ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@cnsumner xterm์€ ํ˜„์žฌ ํŠธ๋ฃจ ์ปฌ๋Ÿฌ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ œ์•ˆ๋œ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://gist.github.com/XVilka/8346728 ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
BTW ์ด๊ฒƒ์€ ECMA-48 ํ‘œ์ค€์— ๋ถ€๋ถ„์ ์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ํ•ด์•ผ ํ•  ์ผ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์•„์ด๋””์–ด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ง€์ €๋ถ„ํ•œ ๊ฐœ๋… ์ฆ๋ช…์„ ์ž‘์„ฑํ•˜์„ธ์š”. https://github.com/Tyriar/xterm.js/tree/484_truecolor

image

ํ•ด์•ผ ํ•  ์ผ:

  • ๋ถ„๊ธฐ๋Š” ํ˜„์žฌ 32๋น„ํŠธ ์ •์ˆ˜์— ๋งž๋Š” 0x1RRGGBB (fg) ๋˜๋Š” 0x0RRGGBB (bg) ํ˜•์‹์˜ 'ํŠธ๋ฃจ์ปฌ๋Ÿฌ'๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ ๋ฌธ์ž์— ๋‹ค๋ฅธ ์ˆซ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
  • fg ๋ฐ b ์ƒ‰์ƒ์„ ๋ชจ๋‘ ์ง€์›ํ•ด์•ผ ํ•˜๋ฉฐ ํŠธ๋ฃจ์ปฌ๋Ÿฌ์™€ ์ผ๋ฐ˜ ์ƒ‰์ƒ์„ ํ˜ผํ•ฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • curTrueColor ์ •๋ง ๋ชป์ƒ๊ฒผ์–ด์š”
  • ์ง€์› ์—ญ
  • ์…€์„ ์žฌ์‚ฌ์šฉํ•  ๋•Œ ์ƒ‰์ƒ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ž๊ฐ€ ์ธ์ฝ”๋”ฉ๋˜๋Š” ๋ฐฉ์‹์„ ์žฌ๊ณ ํ•ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    [attribute, character, width]
    
    • attribute : ASCII fg, ASCII bg ๋ฐ ํ”Œ๋ž˜๊ทธ(๊ตต๊ฒŒ, ๋ฐ‘์ค„, ๊นœ๋ฐ•์ž„, ๋ฐ˜์ „, ๋ณด์ด์ง€ ์•Š์Œ)๋ฅผ ํฌํ•จํ•˜๋Š” 32๋น„ํŠธ ์ •์ˆ˜๋กœ ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
    • char : ๋นˆ ๋ฌธ์ž์—ด(๋„“์€ ๋ฌธ์ž๋ฅผ ์ฑ„์šฐ๋Š” ๋„ˆ๋น„๊ฐ€ 0์ธ ๋ฌธ์ž์˜ ๊ฒฝ์šฐ) ๋˜๋Š” ๋‹จ์ผ ๋ฌธ์ž ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด
    • width : ๋ฌธ์ž์˜ ๋„ˆ๋น„๋Š” ํ˜„์žฌ 0, 1 ๋˜๋Š” 2์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ํƒญ์„ ์ œ๋Œ€๋กœ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/sourcelair/xterm.js/issues/734
  • ์ตœ์ข… ์†”๋ฃจ์…˜์€ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ์ปดํŒฉํŠธํ•ด์•ผ ํ•˜๊ณ  ์•ก์„ธ์Šค๋„ ๋นจ๋ผ์•ผ ํ•˜๋ฉฐ ์–ด๋ ˆ์ด, ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”Œ๋ž˜๊ทธ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋น„ํŠธ ์ด๋™์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์•„์ด๋””์–ด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ํ‹ฐ๋ฆฌ์•„๋ฅด
์˜ˆ, ๋‚ฎ์€ ์†Œ๋น„์— ์ตœ์ ํ™”๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํญ๋ฐœํ•ฉ๋‹ˆ๋‹ค. width ์™€ ํ•จ๊ป˜ ํฌ์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” 4๋ฐ”์ดํŠธ(์ผ๋ฐ˜์ ์œผ๋กœ ํƒญ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 4 ๋˜๋Š” 8)๋งŒ ์‚ฌ์šฉํ•˜๋Š” 16๋ณด๋‹ค ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•˜๋‚˜์˜ RGB ์ •์˜*๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋‚จ๊น๋‹ˆ๋‹ค( width ๊ฐ€ 32๋น„ํŠธ ์ •์ˆ˜๋ผ๊ณ  ๊ฐ€์ •). attribute ์— ๋ช‡ ๊ฐœ์˜ ๋น„ํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ RGB ์ •์˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

์†์„ฑ์€ ํ˜„์žฌ bg์— ๋Œ€ํ•ด 9๋ฐ”์ดํŠธ, bg์— ๋Œ€ํ•ด 9๋ฐ”์ดํŠธ, ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•ด 5๋ฐ”์ดํŠธ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋์— ๋„ˆ๋น„๋ฅผ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RGB ์ •์˜์—๋Š” ๊ฐ๊ฐ 24๋ฐ”์ดํŠธ(8*3)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ œ์•ˆํ•˜๋Š” (์•ฝ๊ฐ„ ๋ณต์žกํ•œ) ๊ณต๊ฐ„ ์ ˆ์•ฝ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

[char, attr1, attr2]

์—ฌ๊ธฐ์„œ attr1์€ (29๋น„ํŠธ):

  • ๋„ˆ๋น„: 4๋น„ํŠธ
  • 256์ƒ‰ ๋˜๋Š” ํŠธ๋ฃจ์ปฌ๋Ÿฌ ํ”Œ๋ž˜๊ทธ: 1๋น„ํŠธ
  • bg ์ƒ‰์ƒ: 24๋น„ํŠธ

๊ทธ๋ฆฌ๊ณ  attr2๋Š” (30๋น„ํŠธ):

  • ํ”Œ๋ž˜๊ทธ: 5๋น„ํŠธ
  • 256์ƒ‰ ๋˜๋Š” ํŠธ๋ฃจ์ปฌ๋Ÿฌ ํ”Œ๋ž˜๊ทธ: 1๋น„ํŠธ
  • fg ์ƒ‰์ƒ: 24๋น„ํŠธ

๋” ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํŠนํžˆ ์†์„ฑ์— ๋Œ€ํ•ด ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

[char, attr, truecolorBg, truecolorFg]

์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋„ˆ๋น„: 4๋ฐ”์ดํŠธ
  • ํ”Œ๋ž˜๊ทธ: 5๋ฐ”์ดํŠธ
  • 256bg ์ƒ‰์ƒ: 9๋ฐ”์ดํŠธ
  • 256 fg ์ƒ‰์ƒ: 9๋ฐ”์ดํŠธ

์ด๋Ÿฌํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋งค์šฐ ๋ณต์žกํ•˜๊ฒŒ ์บก์Šํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. typescript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ๋“  ๋ฐฐ์—ด์— getter๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ jsperf์—์„œ ์ˆ˜ํ–‰ํ•œ ๋งˆ์ดํฌ๋กœ ๋ฒค์น˜๋งˆํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์–ด๋ ˆ์ด๋ณด๋‹ค 20๋ฐฐ ๋Š๋ ธ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋“  ํ˜•์‹์€ ๋งค์šฐ ์ž˜ ๋ฌธ์„œํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ์€ InputHandler.charAttributes ๋ฅผ ๋ณด๊ณ  ์Šค์Šค๋กœ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ƒ๊ฐ:

  • ๋ฌธ์ž์˜ ๋„ˆ๋น„๊ฐ€ 1๋ณด๋‹ค ํฌ๋ฉด ๋‹ค์Œ ๋ฌธ์ž์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „ํ˜€ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. "๋นˆ ๋ฌธ์ž"๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์žˆ์œผ๋ฉฐ null ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ๋ จ์˜ ๋ฌธ์ž์— ์Šคํƒ€์ผ์ด ์ง€์ •๋˜๋ฏ€๋กœ ์ผ๋ จ์˜ ๋ฌธ์ž ๊ฐ„์— ์†์„ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์†์„ฑ์„ ์บ์‹œํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ ๋ฌธ์ž๋Š” ์บ์‹œ๋œ ๊ฐ’ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋Œ€๋ถ€๋ถ„์˜ JS ์—”์ง„์—์„œ ์ธ๋ฑ์Šค ์•ก์„ธ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ด ๊ฐ์ฒด ๋ฐ ํ•ด๋‹น ์†์„ฑ ํ™•์ธ๋ณด๋‹ค ์—ฌ์ „ํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค. V8์€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋ฐ GC ํ˜„๋ช…ํ•œ ๋ฐฐ์—ด์€ ํ›จ์”ฌ ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์ธํ•ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค(์ด ๋‹จ์ ์€ ๊ธฐ์กด ๊ฐœ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Œ).

์—ฌ๊ธฐ์„œ ์˜ฌ๋ฐ”๋ฅธ ๋ ˆ์ด์•„์›ƒ์— ๋Œ€ํ•œ ๋‹จ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋„ˆ๋ฌด ๋งŽ์ด ํฌ์žฅ๋œ ํ•ญ๋ชฉ์ด ํ•„์š”ํ•œ ๋ณ€ํ™˜์œผ๋กœ ์ธํ•ด ๋Ÿฐํƒ€์ž„ ํŽ˜๋„ํ‹ฐ๋ฅผ ๋†’์ผ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ด๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ C์—์„œ ๋น„ํŠธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ์ด ๋ช…๋ น์–ด ์บ์‹œ๋ฅผ ์˜ค์—ผ์‹œ์ผœ ์บ์‹œ ๋ˆ„๋ฝ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.)
Imho ์ „์šฉ ํ…Œ์ŠคํŠธ๋Š” ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

@jerch ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ง€๊ธˆ https://github.com/sourcelair/xterm.js/pull/756 ์— ๋‹จ์ˆœ์„ฑ์„ ์œ„ํ•ด 4๊ฐœ์˜ ์ˆซ์ž ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ 

๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•ฝ 5 * (1000 ์Šคํฌ๋กค๋ฐฑ) * (64๋น„ํŠธ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ 8๋ฐ”์ดํŠธ) * 80 = 3.2mb(js ๋ฐฐ์—ด์˜ ์˜ค๋ฒ„ํ—ค๋“œ ์ „) ์ •๋„๊ฐ€ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ VS Code ํ„ฐ๋ฏธ๋„์˜ ์‹ค์ œ ๋„ˆ๋น„๋Š” ํ˜„์žฌ ํ˜•์‹์„ ์œ ์ง€ํ•˜๋ฉด ๋‘ ๋ฐฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ข…์ข… 1000๊ฐœ ์ด์ƒ์˜ ์Šคํฌ๋กค๋ฐฑ๊ณผ ์—ฌ๋Ÿฌ ํ™œ์„ฑ ํ„ฐ๋ฏธ๋„์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ๋ณด๋‹ˆ ๊ฝค ๊ฐ€ํŒŒ๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ๋ณ„๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š๊ณ  ์‰ฝ๊ฒŒ null์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ›„ํ–‰ ๊ณต๋ฐฑ์€ ์•„๋งˆ๋„ ๊ฝค ํฐ ์Šน๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†์„ฑ/์ƒ‰์ƒ ์„ธํŠธ ์บ์‹œ ์•„์ด๋””์–ด๋„ ๋น ๋ฅธ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ํ•œ ์œ ๋งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฐ€๋ฒผ์šด ์Šคํ”Œ๋ ˆ์ด ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค(์†์„ฑ์— ๋Œ€ํ•œ ๋น ๋ฅธ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋จ).

๋ผ์ธ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ๊ทธ๋ƒฅ ๋ฒ„๋ฆฌ๋Š” ๋Œ€์‹  ํŠธ๋ฆฌ๋ฐํ•  ๋•Œ( ์˜ˆ: ์—ฌ๊ธฐ ) ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์—”์ง„ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ํฌ๊ธฐ๊ฐ€ ๋” ์ปค์ง‘๋‹ˆ๋‹ค. ๋ฐฐ์—ด์ด๋‚˜ ๊ฐœ์ฒด์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ธ ์ฐธ์กฐ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์กฐ๋ฐ€ํ•œ js-array๋Š” ์•ฝ๊ฐ„์˜ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ์–ด๋”˜๊ฐ€์— C์™€ ๊ฐ™์€ ๋ฐฐ์—ด๋กœ ํ˜•์„ฑ๋ฉ๋‹ˆ๋‹ค(์‹ค์ œ๋กœ๋Š” ArrayList). ํฌ์†Œ ๋ฐฐ์—ด ๋ฐ ๊ธฐํƒ€ ๊ฐ์ฒด๋Š” ์†์„ฑ ํ™•์ธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ํŠธ๋ฆฌ ๋งˆ์ˆ ๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ 64๋น„ํŠธ์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ ํ•ญ๋ชฉ์€ ์…€๋‹น 5 * 8๋ฐ”์ดํŠธ๋ฅผ ๋” ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„ ๊ณ„์‚ฐ์˜ ๋‘ ๋ฐฐ์ธ 6.4mb). ์ฝ˜ํ…์ธ ๋Š” "์‹ค์ œ ์ฝ˜ํ…์ธ " ์™ธ์— ๋” ๋งŽ์€ ๋ฐ”์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” Integer ๋ฐ String ์œ ํ˜•์˜ ์‹ค์ œ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ TypedArray๊ฐ€ ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ์ •์ˆ˜ ํ•ญ๋ชฉ์€ ์ถ”๊ฐ€ ๊ฐ„์ ‘ ์ฐธ์กฐ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ์˜ ์ธ๋ฑ์Šค ์œ„์น˜์— ์ง์ ‘ ์ƒ์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. asm.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋“ค์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ƒ์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…์„ ์œ„ํ•ด TypedArray์™€ js-Array๋ฅผ ๋น„๊ตํ•˜๋Š” ๋น ๋ฅธ ๋งˆ์ดํฌ๋กœ ๋ฒค์น˜๋งˆํฌ์ž…๋‹ˆ๋‹ค. http://jsbench.github.io/#af3ea1056a70df2aa6775699d174df0d

TypedArray๋Š” ๋‚ด ์ปดํ“จํ„ฐ์—์„œ FF ๋ฐ Chrome์„ ์‚ฌ์šฉํ•˜์—ฌ 10๋ฐฐ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์ „ ํ• ๋‹น ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ถŒ์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ js-Array๋กœ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. JIT๊ฐ€ ๊ฐ’์ด 8๋ฐ”์ดํŠธ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ์ตœ์ ํ™”ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฒค์น˜๋งˆํฌ๋Š” ์ „ํ˜€ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

TypedArray์˜ ๊ฒฝ์šฐ ์•ก์„ธ์Šค๊ฐ€ ์•ฝ๊ฐ„ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค( Number ๋ณ€ํ™˜์œผ๋กœ ์ธํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Œ). ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋Š” TypedArray์—์„œ ํ›จ์”ฌ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๐Ÿ˜ƒ์ด ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋…ผ์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? @chabou @

์ด๊ฒƒ์€ tmux ๋ฐ vim/neovim์„ ์ง€์›ํ•˜๋Š” ์ ์ ˆํ•œ dev CLI ์›Œํฌํ”Œ๋กœ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด Windows 10์˜ WSL์—์„œ ํ•˜์ดํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์ง€์—ฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. WSL๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ๋ณด๊ธฐ์— ์ข‹์ง€ ์•Š๊ณ  wsltty๊ฐ€ ๊ฐ€๊น์ง€๋งŒ ํƒญ ์ง€์› ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์›์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค...

@vastbinderj ๋ˆ„๋ฝ๋œ ํŠธ๋ฃจ ์ปฌ๋Ÿฌ ์ง€์›์ด ์ ์ ˆํ•œ dev CLI ์›Œํฌํ”Œ๋กœ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์†”์งํ•œ ์งˆ๋ฌธ.

@szmarczak ๋ฐ @vastbinderj
์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์˜์ œ์— ์žˆ์ง€๋งŒ ํ˜„์žฌ ํ„ฐ๋ฏธ๋„ ๋ฒ„ํผ ์„ค๊ณ„์— ๋„์ž…๋  ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์œผ๋กœ ์ธํ•ด ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. #791์ด ๋” ํšจ์œจ์ ์ธ ๋ฒ„ํผ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@rfgamaral simple - ์ €๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ๋งŽ์€ ์ดˆ๋Œ€ํ˜• ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ์—์„œ ํ•˜๋ฃจ์— ๋‹ค์–‘ํ•œ ์œ ๋‹‰์Šค/๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„์—์„œ ์ž‘์—…ํ•˜๋ฉฐ ๋ฉ”์ธ ํ˜ธ์ŠคํŠธ์—์„œ ์ ์ ˆํ•œ ์ƒ‰์ƒ ์ง€์›์ด ์—†์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ rhel์ด๋“  centos์ด๋“  ๋ฐ๋น„์•ˆ์ด๋“  ์ƒ๊ด€์—†์ด ์ƒ‰์ƒ์ด ๋™์ผํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Windows์—์„œ ์ฃผ๋‹ˆ์–ด ๋˜๋Š” ํ”ผ์–ด ๊ฐœ๋ฐœ์ž๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์•‰์•„ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ผ์ด ๊ท ์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปจํ…์ŠคํŠธ ์ „ํ™˜์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ์˜ ์›” ๋‹จ์œ„๋กœ ๋ฆด๋ฆฌ์Šค๋œ ๊ฐœ์„  ์‚ฌํ•ญ๊ณผ VS Code์˜ ๋™์ผํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์œผ๋กœ wsl์ด ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ๋ฐœ์ „ํ–ˆ๋Š”์ง€ ๋งค์šฐ ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค.

@jerch ์—…๋ฐ์ดํŠธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. #791์ด ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์ฐธ์„์„ฑ ์žˆ๊ฒŒ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค...

์ด๊ฒƒ๋„ ๋งŽ์ด ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค.

JavaScript ์ˆซ์ž๋Š” ์ตœ๋Œ€ 53๋น„ํŠธ์˜ ์ •ํ™•ํ•œ ์ •์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 32๊ฐœ์˜ "ํŽธ๋ฆฌํ•œ" ๋น„ํŠธ ์™ธ์— 21๋น„ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐ„๋‹จํ•œ ์ถ”๊ฐ€๋กœ ์กฐ๊ธˆ "๋˜๋Š”"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์œ„ ๋น„ํŠธ๋ฅผ ์ฝ์œผ๋ ค๋ฉด ์ ์ ˆํ•œ 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ ์ •์ˆ˜๋กœ ๋‚˜๋ˆˆ ๋‹ค์Œ ์ผ๋ฐ˜ ๋น„ํŠธ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ณ ์ฐจ ๋น„ํŠธ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์กฐ๊ธˆ ๋” ์žˆ์ง€๋งŒ ์ตœ์‹  CPU์—์„œ๋Š” 2์Šน์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค.

์ „๊ฒฝ๊ณผ ๋ฐฐ๊ฒฝ์— ๋Œ€ํ•ด ๊ฐ๊ฐ 25๋น„ํŠธ์ธ 50๋น„ํŠธ์˜ ๋‹จ์ผ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์„ค์ •๋œ ๊ฒฝ์šฐ 1๋น„ํŠธ๋Š” 24๋น„ํŠธ "ํŠธ๋ฃจ" ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด "๋…ผ๋ฆฌ์ "(ํ…Œ๋งˆ ๊ฐ€๋Šฅ) ๋˜๋Š” 8๋น„ํŠธ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์‹œ๊ธฐ ๋น„ํŠธ๋Š” 2๊ฐœ์˜ ํ•˜์œ„ ๋น„ํŠธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋…ผ๋ฆฌ/8๋น„ํŠธ ์ƒ‰์ƒ์ด ๋‹ค์Œ 30๋น„ํŠธ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ํŠธ๋ฃจ ์ปฌ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋น„ํŠธ 32-50๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@PerBothner ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๋ฒ„ํผ์— Uint32Array๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ํŽธ์˜๋ฅผ ์œ„ํ•ด ํ•ด๋‹น ๋ฐฐ์—ด์—๋„ ์ƒ‰์ƒ์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. ํŠธ๋ฃจ์ปฌ๋Ÿฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ƒˆ๋กœ์šด impl์„ ์‚ด๊ท ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด์•„์›ƒ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ/๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค(https://gist.github.com/jerch/27c2cf91ad313a25415873e4047b2900 ์ฐธ์กฐ). ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์•„์ด๋””์–ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ๊ณผ ๋Ÿฐํƒ€์ž„ ํŒจ๋„ํ‹ฐ์˜ ์ ˆ์ถฉ์ ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜•์‹ํ™”๋œ ๋ฐฐ์—ด๋กœ์˜ ์ „ํ™˜์€ ์ด๋ฏธ ์—„์ฒญ๋‚œ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค(ํ˜„์žฌ ํŠธ๋ฃจ ์ปฌ๋Ÿฌ ๊ฐ’์€ ์•„์ง ์ ์šฉ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์œ„์—์„œ ๋‘ ๋ฒˆ์งธ ์•„์ด๋””์–ด๋ฅผ ๊ตฌํ˜„ํ•จ).

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰