์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
TIOBE ์„ ์ • ์˜ฌํ•ด์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
2013๋…„
Transact-SQL
โ†’
2014๋…„
JavaScript
โ†’
2015๋…„
Java


1. ๊ฐœ์š”2. ์—ญ์‚ฌ3. ๊ฐœ๋ฐœ ๋„๊ตฌ4. ํŠน์ง•5. DOM๊ณผ JavaScript6. CommonJS7. ๊ด€๋ จ ๊ฐœ๋…
7.1. ํ‘œ์ค€์•ˆ7.2. ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ7.3. ๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ7.4. ํŒŒ์ƒ ์–ธ์–ด
8. ์›น๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ9. ๊ธฐํƒ€10. ์ฐธ๊ณ ํ•  ๋งŒํ•œ ๊ณณ

1. ๊ฐœ์š”[ํŽธ์ง‘]

document.write("Hello, world!");  //HTML ๋ฌธ์„œ์— ์ถœ๋ ฅ๋œ๋‹ค.
alert("Hello, world!");  //์•Œ๋ฆผ์ฐฝ์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
console.log("Hello, world!");  //๋ณดํ†ต F12(macOS์˜ ๊ฒฝ์šฐ์—๋Š” โŒ˜+โŒฅ+I)๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ณด์ด๋Š” ์ฝ˜์†” ์ฐฝ์— ์ถœ๋ ฅ๋œ๋‹ค.
ํ”„๋กœํ† ํƒ€์ž…๊ธฐ๋ฐ˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ, ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์— ํ•ด๋‹น๋œ๋‹ค. ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์ด ์•„๋‹Œ ์ด์ƒ ๋ชจ๋“  ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค. ์˜ค๋Š˜๋‚  HTML, CSS์™€ ํ•จ๊ป˜ ์›น์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋‹ค. HTML์ด ์›น ํŽ˜์ด์ง€์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋‹ด๋‹นํ•˜๊ณ , CSS๊ฐ€ ๋””์ž์ธ์„ ๋‹ด๋‹นํ•œ๋‹ค๋ฉด JavaScript๋Š” ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ ์›น ํŽ˜์ด์ง€๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋‹ด๋‹นํ•œ๋‹ค.[1] ์›น ํŽ˜์ด์ง€๋ฅผ ์ž๋™์ฐจ์— ๋น„์œ ํ•˜์ž๋ฉด, HTML์€ ์ž๋™์ฐจ์˜ ๋ผˆ๋Œ€, CSS๋Š” ์ž๋™์ฐจ์˜ ์™ธ๊ด€, JavaScript๋Š” ์ž๋™์ฐจ์˜ ๋™๋ ฅ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

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

JavaScript๋Š” C์—์„œ ์˜ํ–ฅ์„ ๋ฐ›์€ C-Family ์–ธ์–ด๋กœ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•์ด ์œ ์‚ฌ ์ค‘๊ด„ํ˜ธ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ธ”๋Ÿญ, ์„ธ๋ฏธ์ฝœ๋ก ์œผ๋กœ ์ค„์ด ๋๋‚จ์„ ์•Œ๋ฆฌ๋Š” ๊ฒƒ[2], ๋ณ€์ˆ˜ ์“ฐ๋Š” ๋ฒ•, ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ๋ฒ• ๋“ฑ ๊ธฐ์ดˆ์ ์ธ ๋ฌธ๋ฒ•์ด C ๋ฌธ๋ฒ•๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. ํ˜ธ์ด์ŠคํŒ…(์„ ์–ธ๋ฌธ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š”๊ฒŒ ์ž๋™์œผ๋กœ ์„ ์–ธ๋ฌธ์ชฝ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๋Š”๊ฒƒ)๊ฐ™์€๊ฒƒ๋„ C์–ธ์–ด์˜ ์ž”์žฌ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ํ•จ์ˆ˜ํ˜•[3] ์–ธ์–ด์˜ ๋ถˆํŽธํ•จ๊ณผ ํ˜ธ์ด์ŠคํŒ… ๋“ฑ ์—ฌ๋Ÿฌ๋ฌธ์ œ๋ฅผ ๋ฌด๋งˆํ•˜๊ธฐ์œ„ํ•ด์„œ ํด๋ž˜์Šค ๊ฐœ๋…์˜ ๋„์ž…๊ณผ ๋ณ€์ˆ˜์„ ์–ธ์„ let[4], const[5]๋กœ ํ•˜๋Š”๋“ฑ ๋‹ค๋ฅธ์–ธ์–ด ์“ฐ๋Š”์‚ฌ๋žŒ๋“คํ•œํ…Œ ์ ์‘์„ ๊ทธ๋‚˜๋งˆ ํ•˜๋„๋ก ํ‰๋‚ด๋Š” ๋‚ด์ฃผ๋Š” ์ฒ™ํ•˜๋Š”๊ฒŒ ๋‹คํ–‰. ๋ฌผ๋ก  ์ผ๋ฐ˜์ ์ธ ๊ฐ์ œ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ด๊ฒƒ๋งˆ์ € ์ดํ•ด๋ฅผ ๋ชป ํ•˜๊ณ  Syntatic Sugar์— ๋ถˆ๊ณผํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋งŒ์กฑ์Šค๋Ÿฌ์›Œํ•œ๋‹ค.

์ตœ๊ทผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ธํ„ฐ๋ทฐ์—์„œ ์•„์ง๋„ ์™œ ํ˜ธ์ด์ŠคํŒ…์„ ๋ฌผ์–ด ๋ณด๋ƒ๋Š” Dan Abramov์˜ ํŠธ์œ— https://twitter.com/dan_abramov/status/1362530955420987396 ์ด ํ™”์ œ๊ฐ€ ๋˜์—ˆ๋Š”๋ฐ, ๋ฌผ๋ก  ํ˜„๋Œ€ JS์—์„œ ํ˜ธ์ด์ŠคํŒ…์„ ๋งŒ๋‚  ์ผ์€ ํ”์น˜ ์•Š์ง€๋งŒ ํ˜ธ์ด์ŠคํŒ…์ด ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ’€๋ ค๊ณ  ํ–ˆ์œผ๋ฉฐ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ˜„๋Œ€ JS์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š”์ง€๋Š” ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค ๋ณธ๋‹ค.

2. ์—ญ์‚ฌ[ํŽธ์ง‘]

์ฒซ ํƒ„์ƒ์€ ๋ธŒ๋žœ๋“  ์•„์ดํฌ๊ฐ€ 10์ผ๋งŒ์— ์„ค๊ณ„ํ•œ ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. ์ฒ˜์Œ์—๋Š” Mocha๋ผ๋Š” ์ด๋ฆ„์ด์—ˆ์ง€๋งŒ 4๋‹ฌ ๋งŒ์— LiveScript๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ฐœ๋ช…ํ•˜๊ณ  ๋‹ค์‹œ 3๋‹ฌ ํ›„์—๋Š” JavaScript๋ผ๋Š” ์ด๋ฆ„์ด ๋˜์–ด ์˜ค๋Š˜๋‚ ๊นŒ์ง€ ์ด์–ด์ง€๊ณ  ์žˆ๋‹ค. Java์™€ ๊ตฌ๋ฌธ์ด ์œ ์‚ฌํ•˜๊ธฐ๋„ ํ•˜๊ณ  ํ•ด์„œ ์ด๋ฆ„์„ JavaScript๋กœ ๋ช…๋ช…ํ–ˆ๋‹ค...๋Š” ํ‘œ๋ฉด์ƒ์˜ ์ด์œ ๊ณ  ๊ทธ ์†์€ Java์˜ ์œ ๋ช…์„ธ๋ฅผ ํƒ€์„œ ๋ฌป์–ด๊ฐ€๋ ค๊ณ  ์˜๋„์ ์œผ๋กœ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.[6]

JS๋Š” ๋ณธ๋ž˜ ๋„ท์Šค์ผ€์ดํ”„ ์„œ๋ฒ„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์ˆ˜์ค€ ์ถ”์ƒํ™” ์–ธ์–ด๋กœ ์„ค๊ณ„๋˜์–ด LiveScript๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋„ค๋น„๊ฒŒ์ดํ„ฐ์— ํฌํ•จ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ JS๋Š” ๋‹น์‹œ ๊ธฐ์ค€์—์„œ ๋ฌด๋ฆฌํ•œ ์ถ”์ƒํ™”[7]๋ฅผ ์‹œ๋„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋งˆ์ผ€ํŒ… ์ข€ ํ•ด๋ณด์ž๊ณ  ๋ถ™์ธ ์ด๋ฆ„์ธ JS๊ฐ€ Java์˜ ์—ดํ™”ํŒ์ด๋ผ๋Š” ๋А๋‚Œ์ด๋ผ์„œ ๋‹น์‹œ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ์ด๋ฆ„์œผ๋กœ ๋ฌด์‹œ๋‹นํ–ˆ๋‹ค.[8] ์—ฌ๊ธฐ์— ๋”ํ•ด์„œ ๊ทธ๋‚˜๋งˆ ํด๋ผ์ด์–ธํŠธ์šฉ JS ์—”์ง„์— ์žˆ๋˜ ์‹œ์Šคํ…œ ์ž์› ์ ‘๊ทผ์šฉ API[9]๋“ค์ด ๋ณด์•ˆ์‚ฌ๊ณ ์˜ ์›์ธ์ด ๋˜๋ฉด์„œ ์‚ญ์ œ๋˜๋Š” ๊ณผ์ •์—์„œ, ๋ณ„๋‹ค๋ฅธ ๋ณด์™„ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•˜์ง€ ๋ชปํ•˜๋Š” ๋“ฑ ํ•œ๊ณ„๊ฐ€ ์—ฌ์‹คํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ JavaScript์˜ ๋ง‰๊ฐ•ํ•œ ๊ธฐ๋Šฅ์€ ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐ ๋ฒค๋” ์‚ฌ์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ๊ตฌํ˜„ํ• ๋งŒํผ ์„ฑ์žฅํ•ด๊ฐ”๋‹ค. ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ๋Š” ์ด๋ฅผ ์ฑ„ํƒํ•จ๊ณผ ๋™์‹œ์— ์ž์‚ฌ๋งŒ์˜ ๋ฌธ๋ฒ•์„ ๋ผ์›Œ ๋„ฃ์–ด JScript๋ฅผ ํƒ„์ƒ์‹œ์ผฐ๋‹ค. ๋„ท์Šค์ผ€์ดํ”„๊ฐ€ ์—ฌ๋Ÿฌ ๋ฌธ์ œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ ์œ ์œจ์„ ๋ง‰๋Œ€ํ•˜๊ฒŒ ์ฐจ์ง€ํ•ด๊ฐ€๋˜ ์–ด๋А 95๋…„ ์ค‘๋ฐ˜, MS๊ฐ€ Windows 95 Plus์—์„œ IE 1.0๋ฅผ ์„ ๋ณด์˜€๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ œ1์ฐจ ๋ธŒ๋ผ์šฐ์ € ์ „์Ÿ์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ์‚ฌ๊ฑด์˜ ์‹œ์ž‘์ด๋‹ค.[10]

์ œ1์ฐจ ๋ธŒ๋ผ์šฐ์ € ์ „์Ÿ์—์„œ MS๋Š” OS ์ ์œ ์œจ์„ ๋Š˜๋ ค๊ฐ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž๋“ค์„ IE๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์†์ ์œผ๋กœ ์œ ๋„ํ•˜์˜€๊ณ , ์ด์— ๋ฒ„ํ‹ฐ์ง€ ๋ชปํ•œ ๋„ท์Šค์ผ€์ดํ”„๋Š” ๊ธฐ์–ด์ฝ” ๋งํ•˜๊ณ  ๋งŒ๋‹ค.

MS์—์„œ 1999๋…„์— ๋ณธ๋ž˜ ์•„์›ƒ๋ฃฉ์—์„œ ์“ฐ์˜€๋˜ IXMLHTTPRequest๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ XMLHTTP wrapper๋กœ์„œ xml request ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๋„ท์Šค์ผ€์ดํ”„์˜ ํ›„์˜ˆ๋ฅผ ์ž์ฒ˜ํ•˜๋Š” ๋ชจ์งˆ๋ผ ์žฌ๋‹จ์—์„œ๋„ ์ด๊ฒƒ์„ 2002๋…„์— ๊ตฌํ˜„์‹œ์ผฐ๋‹ค. ์ดํ›„ ์ฃผ๋ชฉ ๋ฐ›์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๊ตฌ๊ธ€์— ์˜ํ•ด String ๊ธฐ๋ฐ˜์˜ Data ์ „์†ก ๋ฐฉ์‹์„ AJAX๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์กฐํ•ฉํ•ด ์„ ๋ณด์ด๋ฉด์„œ AJAX ์ธํ„ฐ๋„ท ์‹ ์„ธ๊ณ„๊ฐ€ ์—ด๋ฆฌ๊ณ  ๋ง ๊ทธ๋Œ€๋กœ ๋Œ€๋ฐ•์ด ๋‚ฌ๋‹ค.

์ด๋ ‡๋“ฏ JS๋Š” ๊ฐ ๋ฒค๋” ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒƒ์ด ๋ฌธ์ œ์ธ ๊ฒƒ์„ ๊ธ€์„ ์ฝ์œผ๋ฉด ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ๋‹จ์ผํ™”ํ•œ ์›€์ง์ž„์€ ์ด๋ฏธ 97๋…„ ECMA TC39๋ผ๋Š” ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์‹œ์ž‘์ด ๋˜์—ˆ์ง€๋งŒ, ๊ฐ ๋ฒค๋”(ํŠนํžˆ MS)์˜ ๋น„ํ˜‘์กฐ์ ์ธ ํƒœ๋„๋กœ ์ธํ•ด ๊ธ€๋Ÿฌ ๋จน์—ˆ๋Š”๋ฐ. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋‘ ๋ฒˆ์งธ ๋ธŒ๋ผ์šฐ์ € ์ „์Ÿ์ด ๋ฐœ๋ฐœํ•œ ํ›„ ๊ตฌ๊ธ€ํ•œํ…Œ ์ฒ˜์ฐธํ•˜๊ฒŒ ๋ฐœ๋ฆฐ MS๊ฐ€ ๊นฝ๊นฝ ๊ฑฐ๋ฆฌ๊ณ  ๋‚˜์„œ์•ผ ECMAScript(์ดํ•˜ ES) 5๊ฐ€ ์ œ์ •๋˜๊ณ  ํ‘œ์ค€ ๋ฌธ์ œ๊ฐ€ ๋‹ค์†Œ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.[11]

ํ•œํŽธ ๊ทธ๋ ‡๊ฒŒ ํ‘œ์ค€ํ™”๋ฅผ ๊ฑฐ์นœ JS๋Š” AJAX, jQuery ๋“ฑ์˜ ๋“ฑ์žฅ์œผ๋กœ ๊ฑฐ์นจ์—†๋Š” ๋ฐœ์ „์„ ๋ณด์˜€๊ณ , ๊ธฐ์–ด์ด Node.js์˜ ๋“ฑ์žฅ์œผ๋กœ Server side ์–ธ์–ด๋กœ์„œ ํƒˆ๋ฐ”๊ฟˆํ•˜๊ฒŒ ๋œ๋‹ค. JIT ์ปดํŒŒ์ผ ๋ฐฉ์‹์„ ๋„์ž…ํ•œ ๊ตฌ๊ธ€์˜ V8์ด๋ผ๋Š” JavaScript ์—”์ง„์„ ๊ฐœ๋ฐœํ•˜์˜€๊ณ , ES6 ๊ตฌํ˜„์œจ์ด ๋‹น์‹œ 80% ~ ํ˜„์žฌ 99%์— ๋‹ฌํ•˜๋ฉด์„œ CommonJS, AMD ์ง„์˜ ๋“ฑ์˜ ๋“ฑ์žฅ๋„ ๋‚˜ํƒ€๋‚ฌ๋‹ค. ๊ณผ๊ฑฐ์˜ JS์™€ ๋น„๊ตํ•ด ๋ณด๋ฉด ๊ฒฉ์„ธ์ง€๊ฐ๋งˆ์ € ๋“ค ์ •๋„๋กœ ๊ทธ์•ผ๋ง๋กœ ์žฅ์กฑ์˜ ๋ฐœ์ „์ด๋‹ค.

์ตœ๊ทผ ๋“ค์–ด JavaScript๋Š” ์›น ๋””์ž์ด๋„ˆ๋“ค์—๊ฒŒ๋„ ๊ต์œก์ด ๋˜๊ณ  ์žˆ๋Š” ๋งŒํผ ์ง„์ž… ์žฅ๋ฒฝ์ด ํƒ€ ์–ธ์–ด์— ๋น„ํ•ด ๋‚ฎ์€ ํŽธ์œผ๋กœ ์ธ์‹๋˜๊ณ  ์žˆ๋‹ค. ํ•ด์™ธ๋Š” front-end ์ „๋‹ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์žˆ์„ ๋งŒํผ ์ „๋ฌธํ™”๋˜์–ด์žˆ๋Š” ๋ฐ˜๋ฉด, ๊ตญ๋‚ด์—์„œ๋Š” ์ˆ˜์ค€์ด ํ˜„๊ฒฉํžˆ ๋‚ฎ์€ ๋งŒํผ ์ผ๋ฐ˜์ธ๋„ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ๊ธ€ ๋“ฑ์„ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ๋ฒค๋” ์‚ฌ์—์„œ๋Š” ์ด ์–ธ์–ด๋ฅผ ํ™œ์šฉํ•œ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ ํ™˜๊ฒฝ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, Chrome Extension์ด๋‚˜ App๋“ค์ด ๊ทธ ์ข‹์€ ์˜ˆ์ด๋‹ค. ์ˆœ์ˆ˜ JS๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ์‹ค๋ ฅ์ด ๋œ๋‹ค๋ฉด ์ž์‹ ๋งŒ์˜ ๊ฒƒ๋“ค์„ ๊ตฌํ˜„ํ•ด ๋ฐฐํฌํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ JavaScript๊ฐ€ ๋งˆ๋ƒฅ ์‰ฌ์šด ์–ธ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์˜ค์‚ฐ์ด๋‹ค. ๋™์  ํƒ€์ž… ์–ธ์–ด์ธ ๋งŒํผ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๊ณ , ์ฝœ๋ฐฑ๊ณผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์ดˆ๋ณด์ž ์ž…์žฅ์—์„œ ์ฝ”๋“œ ๋ฆฌ๋”ฉ์ด ๊ต‰์žฅํžˆ ์–ด๋ ต๋‹ค. ์ฆ‰ ์ž…๋ฌธ์€ ์‰ฌ์šฐ๋‚˜ ๋ฐฐ์šฐ๋‹ค๋ณด๋ฉด ๋ฒฝ์— ๋ง‰ํžˆ๋Š” ์–ธ์–ด. ํ•˜์ง€๋งŒ ES6๋กœ ๋„˜์–ด์™€์„œ๋Š” ์ฝœ๋ฐฑ์ด ๋น„๊ต์  ํŽธํ•ด์กŒ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ถ€ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €(๋Œ€ํ‘œ์ ์œผ๋กœ IE)๋Š” ์ง€์›์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค!

์›๋ž˜ JavaScript ์—”์ง„๋“ค์€ ๋ชจ๋‘ ์‹ค์‹œ๊ฐ„ ์ธํ„ฐํ”„๋ฆฌํŒ…์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๋ชจ์งˆ๋ผ์—์„œ SpiderMonkey ์—”์ง„์— JIT ์ปดํŒŒ์ผ ๋ฐฉ์‹์„ ๋„์ž…ํ–ˆ๋‹ค. ์ด๋Š” JavaScript ์—”์ง„์œผ๋กœ๋Š” ์ตœ์ดˆ๋กœ ๋„์ž…ํ•œ ๊ฒƒ์ด๊ณ , ์ด ๋•Œ ์•Œ๋ ค์ง„ ๊ฒƒ์œผ๋กœ๋Š” ์ˆœ์ˆ˜ JavaScript ์„ฑ๋Šฅ๋งŒ ๊ธฐ์กด ๋ฒ„์ „์˜ 20~40๋ฐฐ์— ๋‹ฌํ–ˆ๋‹ค.[12] ๊ทธ๋ฆฌ๊ณ  ๊ตฌ๊ธ€ ์—ญ์‹œ V8์ด๋ผ๋Š” JavaScript ์—”์ง„์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ JIT ์ปดํŒŒ์ผ ๋ฐฉ์‹์„ ๋„์ž…ํ•˜์˜€๊ณ , JavaScript ์„ฑ๋Šฅ์ด ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒํ•˜์—ฌ ์ง€๊ธˆ์€ JavaScript 3D๊ฒŒ์ž„ ์—”์ง„๋„ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๋‹ค.[13]

3. ๊ฐœ๋ฐœ ๋„๊ตฌ[ํŽธ์ง‘]

๋‚ ์ฝ”๋”ฉ ํ•ญ๋ชฉ์—์„œ ์„œ์ˆ ๋˜์–ด ์žˆ๋“ฏ, ์›น ๊ฐœ๋ฐœ์ž๋“ค์€ ๋‹ค์–‘ํ•œ ๋งˆํฌ์—… ์–ธ์–ด ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๋ณด๋‹ค๋Š” ํ…์ŠคํŠธ ์—๋””ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํฌ๋กฌ์ด๋‚˜ ํŒŒ์ด์–ดํญ์Šค์—์„œ๋Š” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์ง€์›ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐœ๋ฐœ์„ ๋•๊ธฐ๋„ ํ•œ๋‹ค.# ํ…์ŠคํŠธ ์—๋””ํ„ฐ๋กœ๋Š” ๊ทธ๋ƒฅ ๋ฉ”๋ชจ์žฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋„ ์žˆ์ง€๋งŒ EditPlus, UltraEdit, Notepad++๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด JetBrains์˜ WebStorm์ด ๊ถŒ์žฅ๋˜๋Š”๋ฐ ์ด๋Š” ์œ ๋ฃŒ์ด๋‹ค.[14] ์ดํด๋ฆฝ์Šค์˜ JavaScript Development Tools๋Š” ๋ฌด๋ฃŒ. ํ—ˆ๋‚˜ ์ดํด๋ฆฝ์Šค์˜ ๋ฌด๊ฑฐ์›€์€ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ตœ๊ทผ์—๋Š” GitHub์˜ Atom, MS์˜ Visual Studio Code, Adobe์˜ Brackets ๋“ฑ์˜ ์˜คํ”ˆ์†Œ์Šค ์—๋””ํ„ฐ๋„ ์ถœ์‹œ๋˜๊ณ  ์žˆ๋‹ค.[15] ํ•ด์™ธ์˜ ๊ฒฝ์šฐ 99ํ”„๋กœ ๊ฐ€๊นŒ์ด ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ๋งŒํผ ์›น ๊ฐœ๋ฐœ์— ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ์ฝ”๋“œ๋Š” ์‚ฌ์‹ค์ƒ ์—…๊ณ„ ํ‘œ์ค€์ด๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ์ฐธ๊ณ .

4. ํŠน์ง•[ํŽธ์ง‘]

JavaScript๋Š” ๋ฉ€ํ‹ฐ-ํŒจ๋Ÿฌ๋‹ค์ž„ ์–ธ์–ด๋กœ ๋ช…๋ นํ˜•, ํ•จ์ˆ˜ํ˜•, ๊ฐ์ฒด์ง€ํ–ฅํ˜• ์–ธ์–ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰์‹œ๋ฏผ์œผ๋กœ ์ทจ๊ธ‰๋˜๋Š” ์–ธ์–ด๋กœ์จ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋”ฐ๋ฅธ๋‹ค. ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋Š” ํด๋กœ์ €๋กœ ์‹œ์ž‘ํ•ด ๋์„ ๋ณด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.[16] ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์–ธ์–ด์ธ๋งŒํผ ์›ํ•œ๋‹ค๋ฉด ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(delcarative programming)์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์“ธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ณดํ†ต์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ JavaScript๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์žฅ์ ์„ ๋ฐฑ๋ถ„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๊ณ  ์‹ฌ์ง€์–ด class๋„ ES6์ดํ›„๋กœ ์ œ๊ณตํ•˜์ง€๋งŒ, JavaScript์—์„œ์˜ class๋Š” ๊ทธ๋ƒฅ function์„ classํ˜•์‹์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ์ œ๊ณตํ•˜๋Š” syntatic sugar์— ์ง€๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ JavaScript์—์„œ class๋Š” ์กด์žฌํ•˜์ง€๋งŒ C++์˜ class์™€๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋ฉฐ, JavaScript์˜ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ•จ์ˆ˜ ํ”„๋กœํ† ํƒ€์ž…์— ๊ธฐ๋ฐ˜ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค. # ๊ฒฐ๊ตญ ๊ทผ๋ณธ์ ์œผ๋กœ JavaScript๋Š” ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ์•Š์œผ๋ฉด ์ œ๋Œ€๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์—†๋Š” ์–ธ์–ด์ธ ์…ˆ์ด๋‹ค.

์ด๋Ÿฐ ํŠน์ง• ๋•Œ๋ฌธ์— for์ด๋‚˜ while ๋“ฑ์˜ loop์€ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์“ฐ์ด์ง€ ์•Š์œผ๋ฉฐ, ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰์‹œํ‚ค๋Š” ๋ฐ ์žˆ์–ด์„œ JavaScript์—์„œ ์ œ๊ณต๋˜๋Š” prototype function์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์„ ์–ธ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€ํ•™๊ต์—์„œ C++ ๋“ฑ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‹œ์ž‘ํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์ด๋Ÿฐ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์— ์ต์ˆ™ํ•ด์ง€๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ, ํ•œ๋ฒˆ ์ตํžˆ๊ณ  ๋‚˜๋ฉด ๋งค์šฐ ๊ฐ„๋‹จ๋ช…๋ฃŒํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ , ์–ธ์ œ๋‚˜ Immutability๊ฐ€ ๋ณด์žฅ๋œ๋‹ค๋Š” ์ , ์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure Function)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๊ฐ€ ์ตœ์†Œํ™”๋œ๋‹ค๋Š” ์  ๋“ฑ์ด ๋งค๋ ฅ์ ์ธ ์š”์†Œ๊ฐ€ ์ •๋ง ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค. 2010๋…„ ํ›„๋ฐ˜ ๋“ค์–ด์„œ๋Š” RxJS๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋“ฑ์žฅํ–ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋งค์šฐ ํก์‚ฌํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์— ์ด๋ฒคํŠธ์™€ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ(Observable)์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ๊ณ ํ•˜๋Š” ๊ฒƒ์„ ๋”ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, side effect ์ˆ˜ํ–‰ ๋ฐ asynchronous operation์— ์žˆ์–ด์„œ ๋งค์šฐ ์žฅ์ ์ด ๋งŽ์•„ ๋Œ€์„ธ๋กœ ๋– ์˜ค๋ฅด๊ณ  ์žˆ๋‹ค.

JS๋Š” ๋™์  ํƒ€์ดํ•‘, ์•ฝํƒ€์ž… ์–ธ์–ด๊ณ [17], ๊ฐ„๋‹จํ•œ ๋ฌธ๋ฒ•์— ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•์ด ๋น„๊ต์  ์œ ์—ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ ์ง„์ž…์žฅ๋ฒฝ์ด ๊ฑฐ์˜ ์—†์–ด์„œ ์‰ฝ๋‹ค๊ณ  ์ด์•ผ๊ธฐ ๋˜์ง€๋งŒ, ๊นŠ์ด ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด ๋งค์šฐ ๋ณ€ํƒœ์ ์ธ ํŠน์ดํ•œ ์–ธ์–ด์ด์ž ๋งค์šฐ ์šฐ์ˆ˜ํ•œ ์„ค๊ณ„๋ฅผ ์ž๋ž‘ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์–ธ์–ด์ด๋‹ค. ํŽธํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ํ…์ŠคํŠธ ํ‘œ๊ธฐ๋ฒ•(JSON)[18]์„ ๊ฐ€์กŒ์œผ๋ฉฐ, ๊ตฌ์กฐ์ ์œผ๋กœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์œ ๋ฆฌํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ํŠนํ™”๋œ ํŠน์ง•์€ ์ดํ›„ Node.js๋ฅผ ํƒ„์ƒ์‹œํ‚ค๋ฉฐ JavaScript๋ผ๋Š” ์–ธ์–ด์˜ ์‚ฌ์šฉ ๋ฐ˜๊ฒฝ์„ ํญ๋ฐœ์ ์œผ๋กœ ๋Š˜๋ฆฌ๋Š” ๋ฐ ๊ธฐ์—ฌํ•˜๊ฒŒ ๋œ๋‹ค.

์ง„์ž… ์žฅ๋ฒฝ์€ ๋‚ฎ์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ชจ๋“  ์–ธ์–ด๊ฐ€ ๊ทธ๋ ‡๋“ฏ ์–ด๋ ต๋‹ค. ํŠนํžˆ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ƒ์ƒ๋„ ๋ชปํ•  ๋…ํŠนํ•œ ํŠน์ง•๋“ค์ด ๋งŽ์€ ์–ธ์–ด์ด๋‹ค. ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ๊ฐ์ฒด(Object)์˜ ์ƒ์ˆ˜(const) ๊ฐœ๋…์ด๋‹ค. ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•ด๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ’๋งŒ ์ƒ์ˆ˜์ผ ๋ฟ ๊ฐ์ฒด ์•ˆ์˜ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋œ ๊ณต๊ฐ„์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ •๋ณด๋งŒ ์ƒ์ˆ˜์ผ๋ฟ ๊ทธ ๊ฐ์ฒด์˜ ์ •๋ณด ์ž์ฒด๋Š” ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ JavaScript์—์„œ ๊ฐ์ฒด๋Š” ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•  ์ด์œ ๊ฐ€ ์—†์œผ๋ฉฐ ๊ฑฐ์˜ ๋ชจ๋“  ์ผ€์ด์Šค์—์„œ ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค. ๋˜ ์ด๋ ‡๊ฒŒ ์ƒ์ˆ˜๋กœ ์„ ์–ธ๋œ ๊ฐ์ฒด์˜ Immutability๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํ…Œํฌ๋‹‰์ด ์“ฐ์ด๊ฒŒ ๋˜๋Š”๋ฐ ์ฃผ๋กœ ES6์—์„œ ๋„์ž…๋œ Spread Operator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ๋„ Deep cloneํ•˜์ง€ ์•Š์œผ๋ฉด ์˜๋„์น˜ ์•Š๊ฒŒ ์›๋ณธ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋˜ํ•œ ๋น„๋™๊ธฐ๋กœ ์ž‘๋™๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„ ์ฝ”๋“œ ์œ„์—์„œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์‹คํ–‰๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ๋Š” ์  ๋˜ํ•œ JavaScript๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๋ฐ์— ๋„˜์–ด์•ผํ•  ์žฅ๋ฒฝ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ด ๋•Œ๋ฌธ์— ํŠนํžˆ Side effect ์ˆ˜ํ–‰์ด ์š”๊ตฌ๋˜๋Š” ์ƒํ™ฉ์—์„œ ์ ˆ์ฐจ์ ์œผ๋กœ ์›ํ•˜๋Š” ๋ฐ”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” promise๋‚˜ callback์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์—์„œ๋ถ€ํ„ฐ ๋ณต์žกํ•˜๊ฒŒ๋Š” ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ํ…Œํฌ๋‹‰์ด ์š”๊ตฌ๋œ๋‹ค. ์ด๋Ÿฐ ๋…ํŠนํ•œ ํŠน์ง•๋“ค ๋•Œ๋ฌธ์— ํƒ€ ์ฃผ๋ฅ˜ ์–ธ์–ด์™€๋Š” ๋˜ ๋‹ค๋ฅธ ์‚ฌ๊ณ ๋ฐฉ์‹์„ ์š”๊ตฌํ•œ๋‹ค. ๋ณต์žกํ•œ side effect ์ˆ˜ํ–‰์— ์žˆ์–ด์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋“ฑ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งŽ์€ ํ”ผ๋กœ๊ฐ์„ ์•ˆ๊ฒจ์ฃผ๋Š” ํŠน์ง•์ด์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ์˜คํผ๋ ˆ์ด์…˜์€ JavaScript์˜ ๋†’์€ ํผํฌ๋จผ์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ์ฃผ์š”ํ•œ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

์งง์€ ๋™์ž‘๋“ค์˜ ๊ฒฝ์šฐ ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋„ ์ž˜ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ธด ์ฝ”๋“œ๋ฅผ ์งœ๋ณด๋ฉด ์˜์™ธ๋กœ ๊ณจ์น˜ ์•„ํ”„๋‹ค.[19] ์˜ˆ๋ฅผ ๋“ค์–ด ์›น ๋ธŒ๋ผ์šฐ์ €๋‚˜ Node.js ์„œ๋ฒ„์—์„œ๋„ JavaScript์˜ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์‹œ์—๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋ถ„๊ธฐํ•˜์—ฌ ์ž‘์—…์„ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ์ฝ”๋ฃจํ‹ด์œผ๋กœ ์ž‘์—…์„ ๋Œ€๊ธฐ ์‹œํ‚ค๋Š” ๋Œ€์‹  ์ปจํ‹ฐ๋‰ด์—์ด์…˜(+ํƒ€์ด๋จธ)๋งŒ ์ด์šฉํ•ด ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์ฆ‰ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ์œ„์— ์‹œ๋ถ„ํ• ๋งŒ ์กด์žฌํ•˜๊ณ  1 ํ”„๋กœ์„ธ์Šค 1 ์Šค๋ ˆ๋“œ๋กœ ์ž‘๋™ํ•œ๋‹ค[20]. ์Šค๋ ˆ๋“œ ๋ถ„๊ธฐ์™€ ์ฝ”๋ฃจํ‹ด ๊ฐ™์€ ์ถ”์ƒํ™” ๋œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ž์›์— ์ต์ˆ™ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด๋ผ๋ฉด ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ธํ•˜์—ฌ ๊ฝค ๊ณ ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.[21] ํŠนํžˆ ๋žŒ๋‹ค์‹์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ค‘์ฒฉ๋˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ๊ทธ์•ผ๋ง๋กœ ์•„์ŠคํŠธ๋ž„์˜ ๊ทน์น˜. ์ •์ž‘ Java๋Š” ๋žŒ๋‹ค์‹์„ 8๋ฒ„์ „์—์„œ์•ผ ์ง€์›ํ•œ๋‹ค... ๊ฒŒ๋‹ค๊ฐ€ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๋Š”, ํŠน์ • ์กฐ๊ฑด ํ•˜์—์„œ ์„ ์–ธํ•˜๋Š” ์ˆœ์„œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋Š” ํŠน์„ฑ์ด ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ const๋‚˜ let๋ฅผ ์ฃผ๋กœ ์“ด๋‹ค. ๋ณดํ†ต ๋ถˆ๋ณ€์„ฑ์ด ์žˆ๋Š” const๋ฅผ ๋” ์‚ฌ์šฉํ•˜๋Š” ํŽธ.

๋‹ค๋งŒ ์œ„์—์„œ ์–ธ๊ธ‰๋œ ์ฝ”๋ฃจํ‹ด์€ ES6, ์ฆ‰ 2015๋…„๋„ ํ‘œ์ค€์— ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์˜ค๋ž˜๋‹ค. ๋ณดํ†ต ์ฝ”๋ฃจํ‹ด์ด ์•„๋‹Œ Promise๋ผ๊ณ  ๋ถ€๋ฅด๋‹ค ๋ณด๋‹ˆ ๋‘˜์ด ๊ฐ™์€ ๊ฒƒ์ด๋ผ๋Š”๊ฑธ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๋Š” ํŽธ. ๋˜ํ•œ ๋ณ‘๋ ฌ์  ์‹คํ–‰๋„ Promise.all๋กœ ๋™์‹œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.[22]

2010๋…„๋Œ€ ์ค‘๋ฐ˜ ์ดํ›„ JavaScript๋Š” ๊ตฌ๊ธ€์˜ V8 JS Engine ๋ฒ„ํ”„๋ฅผ ๋ฐ›์•„ ํ•˜๋ฃจ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๋ชจ์–‘์ƒˆ๋Š” ๋‹ค์Œ ๊ธ€์—์„œ๋„ ์ž˜ ๋‚˜ํƒ€๋‚œ๋‹ค. 2016๋…„์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ธฐ๋ถ„ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ์ด๋Ÿฐ ๋ฐœ์ „์ƒ์ด ํ™”์ œ๊ฐ€ ๋˜๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์›น ์ „์šฉ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋ถˆ๊ณผํ–ˆ์ง€๋งŒ, ํ˜„์žฌ๋Š” Node.js๋ผ๋Š” ๊ฐ•๋ ฅํ•œ Runtime Envioronment์˜ ๋“ฑ์žฅ์œผ๋กœ ๋ฐฑ์—”๋“œ ์–ธ์–ด๋กœ์จ๋„ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ์„ ๊ฐ€์ง„ ์–ธ์–ด๋กœ ์žฌํƒ„์ƒํ–ˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ๋„ ๋ฐฑ์—”๋“œ ๋ถ„์•ผ์—์„œ ๋น ๋ฅด๊ฒŒ ์ ์œ ์œจ์„ ๋†’์—ฌ๊ฐ€๊ณ  ์žˆ๋‹ค. Node.js ์„œ๋ฒ„๋Š” ํ™•์žฅ์„ฑ์ด ๋†’๊ณ  ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋„ JavaScript๋งŒ ์•Œ๋ฉด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ๋„ ์œ ๋ฆฌํ•œ๋ฉด์ด ์žˆ๊ณ  ๋ฌด์—‡๋ณด๋‹ค i/o๊ฐ€ ์ž์ฃผ ์ด๋ฃจ์–ด์ง€๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ํผํฌ๋จผ์Šค ์ž์ฒด๊ฐ€ ๋งค์šฐ ์ข‹๋‹ค. ์—ฌ๊ธฐ์— ORM๊นŒ์ง€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ์‹ฌ์ง€์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด ์ œ๊ณตํ•˜๋Š” Stored Procedure๊นŒ์ง€๋„ ๋Œ€์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€๊นŒ์ง€ ์ด๋ฅด๋ €๋‹ค. ์ด์™€ ๋™์‹œ์— ๋ฐฑ์—”๋“œ ๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ์–‘๋ฐฉํ–ฅ์—์„œ ์ •๋ง ์ˆ˜๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ๋ฐœ์ „์ด ๊ฐ€์†ํ™”๋˜๋Š” ์ค‘์ด๋‹ค. '์—ฌ๊ธฐ์— HTML5, ๋ฐ˜์‘ํ˜• ์›น ๋“ฑ ๋‹ค์–‘ํ•œ ์›น ๊ธฐ์ˆ ์˜ ๋ฐœ๋‹ฌ๋กœ ์ธํ•ด ์‚ฌ์‹ค์ƒ ๋ฐ์Šคํฌํƒ‘ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‡ ํ‡ดํ•˜๊ณ  ์›น์ด ๋ชจ๋˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ‘œ์ค€์ด ๋˜๋ฉด์„œ ์ค‘์š”์„ฑ์ด ๋”์šฑ ๋‘๋“œ๋Ÿฌ์ง€๋Š” ์–ธ์–ด๊ฐ€ ๋˜์—ˆ๋‹ค. ์‹ค์ œ๋กœ ๋งŽ์€ ์†Œํ”„ํŠธ์›จ์–ด ํšŒ์‚ฌ๋“ค์ด ๊ธฐ์กด C++๋‚˜ Java ๋“ฑ์œผ๋กœ ์“ฐ์—ฌ์ง„ PC์šฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์›น์•ฑ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์žˆ์–ด ์ˆ˜์š”๋„ ๋งŽ๊ณ  ์ „๋ง ๋˜ํ•œ ๋ฐ์€ ์–ธ์–ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ๋•Œ๋ฌธ์— ํ˜„์žฌ JavaScript๋Š” ํ™•์žฅ์„ฑ์ด ๋งค์šฐ ๋†’์€ ์–ธ์–ด์ด๋‹ค. JavaScript๋งŒ ์•Œ๋ฉด ์ผ๋ฐ˜์ ์ธ ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ๋ถ€ํ„ฐ React.js ๋˜๋Š” Vue.js๋ฅผ ์‚ฌ์šฉํ•ด SPA (Single Page Application) ์›น์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ, iOS์™€ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š” React Native, ์›น์„œ๋ฒ„๋‚˜ ๋‹ค๋ฅธ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— Node.js, ๋ฐ์Šคํฌํƒ‘ ์•ฑ์€ ๋ฆฌ๋ˆ…์Šค, macOS, ์œˆ๋„์šฐ, tvOS ๋“ฑ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Electron์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ React Native for Windows๋ฅผ ์‚ฌ์šฉํ•ด Windows 10 SDK๊นŒ์ง€ ์ ‘๊ทผํ• ์ˆ˜ ์žˆ๋‹ค.

๊ณผ๊ฑฐ ํ”„๋ก ํŠธ์—”๋“œ ์–ธ์–ด๋กœ๋งŒ JavaScript๊ฐ€ ์“ฐ์˜€์„ ๋•Œ ๊ฐ€์žฅ ์œ ๋ช…ํ–ˆ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋Š” jQuery๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ž˜ ์ตํ˜€๋‘๋ฉด ์ง์ ‘ ์งœ๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฝค ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ธฐ๋Šฅ์„ ๋ถˆ๋Ÿฌ ์“ธ ์ˆ˜ ์žˆ์–ด ๋Œ€ํ•™์—์„œ๋„ ๊ฐ€๋ฅด์ณค๋˜ ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜€๋‹ค. ํ•˜์ง€๋งŒ React๋‚˜ Vue.js, ํ˜น์€ Angular๊ฐ€ ๋“ฑ์žฅํ•œ ์ดํ›„๋กœ ๋ชจ๋“ˆํ˜• ๊ฐœ๋ฐœ์ด ์ˆœ์‹๊ฐ„์— ๋Œ€์„ธ๊ฐ€ ๋˜์—ˆ๊ณ , ์ด๋Š” jQuery ๋Œ€๋น„ ๋น„๊ต๋„ ์•ˆ๋  ์ •๋„๋กœ ์›”๋“ฑํ•˜๊ฒŒ ์ƒ์‚ฐ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋กœ์„œ๋Š” jQuery ์ž์ฒด๊ฐ€ ๋ชจ๋˜ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—๋Š” ๋”์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ์ˆ ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์›ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์— jQuery ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋ณ‘ํ–‰ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋‚˜, ๊ทธ๋Ÿด ๋ฐ”์—์•ผ ๊ทธ๋ƒฅ ์ง์ ‘ Query selector๋ฅผ ์‚ฌ์šฉํ•ด์„œ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒŒ ๋‚ซ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ๊ฐ„๋‹จํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†์–ด์ ธ๋ฒ„๋ ธ๋‹ค.

๋Œ€์„ธ๊ฐ€ ๋œ React๋‚˜ Vue.js์˜ ๊ฒฝ์šฐ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋ฉฐ Redux๋‚˜ Mobx๊ฐ™์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•œ๋‹ค. ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ฐœ๋ฐœ์€ ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅํ•˜๋‚˜ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋ผ ๊ทœ๋ชจ๊ฐ€ ํฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์‚ฌ์‹ค์ƒ ๊ฐœ๋ฐœ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์ด ๋•Œ๋ฌธ์— ํ˜„์žฌ๋กœ๋Š” Redux๊ฐ€ ์‚ฌ์‹ค์ƒ ์—…๊ณ„ ํ‘œ์ค€์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ์ตœ๊ทผ์—๋Š” Facebook์—์„œ context๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ React์— ํฌํ•จ์‹œํ‚ค๋ฉด์„œ ์ž‘์€ ๊ทœ๋ชจ์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” context๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•ด๋ณผ๋งŒ ํ•˜๋‹ค.

๊ด€๋ จ ์ฑ…์œผ๋กœ๋Š” Douglas Crockford์˜ JavaScript ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ํŒจํ„ด, JavaScript: The Good Parts(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ต์‹ฌ ๊ฐ€์ด๋“œ) ๋งค์šฐ ์–‡์€ ๊ฒŒ ํ•จ์ • , ์นด์ผ ์‹ฌ์Šจ์˜ You don't know JS(์›๋ฌธ)์ด ์žˆ๋‹ค.


๋ณ€์ˆ˜.ํ•จ์ˆ˜.ํ•จ์ˆ˜.ํ•จ์ˆ˜.์ฝœ๋ฐฑ(์—๋Ÿฌ,๊ฐ’) ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ์ƒ์œ„ํด๋ž˜์Šค.ํ•˜์œ„ํด๋ž˜์Šค......ํ•˜์œ„ํด๋ž˜์Šค.๊ทธ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ ์ด๋Ÿฐ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ~์˜์™€ ๊ฐ™์€ ๋˜‘๊ฐ™์€ ์˜๋ฏธ๋กœ ์ด๋Ÿฐ์‹์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

5. DOM[23]๊ณผ JavaScript[ํŽธ์ง‘]

์˜ค๋Š˜๋‚  JavaScript๊ฐ€ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” ๋ถ„์•ผ๋Š” ํด๋ผ์ด์–ธํŠธ์šฉ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ด ๋•Œ ์ฃผ๋กœ JavaScript๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณต๋˜๋Š” DOM API๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

JavaScript์—์„œ html์˜ ๋ฌธ์„œ์— ์ ‘๊ทผํ•˜๋Š” API๋ฅผ ๋œปํ•˜๋Š” ์šฉ์–ด๋กœ DOM์ด ๋“ฑ์žฅํ•˜์˜€๋‹ค. ์ดˆ์ฐฝ๊ธฐ ECMA 5์˜ ๋“ฑ์žฅ๊ณผ ๋ณธ๊ฒฉํ™” ์ด์ „ Browser War์˜ ์‚ฌ๊ฑด์—์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค์‹œํ”ผ MS๋Š” ์ž์‚ฌ๋งŒ์˜ ๊ตฌํ˜„์„ ๊ณ ์ง‘ํ•˜์˜€๊ณ , ์ด๋Š” DOM์˜ ๊ตฌํ˜„์ด ๊ฐ ๋ฒค๋” ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ๋‹ค. ์œ„์—์„œ ๋งํ•œ IE 8 ์ดํ•˜์˜ ๋ธŒ๋ผ์šฐ์ €๋“ค์ด addEventListener๊ฐ€ ์•„๋‹Œ attachEvent ๋“ฑ MS ์ž์‚ฌ์˜ ๋ฌธ๋ฒ•์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ด method๋“ค์€ ๋ชจ๋‘ document object ์•„๋ž˜์— ์žˆ๋‹ค. ๋‹คํ–‰ํžˆ ์ด ๋ฌธ์ œ์ ์€ browser war 2 ์ดํ›„ ๊ตฌ๊ธ€์ด MS๋ฅผ ๊บพ์Œ์œผ๋กœ์„œ JS ํ‘œ์ค€ํ™”๋กœ ์ ์ฐจ ์‚ฌ๋ผ์ง€๊ณ  ์žˆ๋‹ค.

๊ทธ ์ค‘์—์„œ๋„ DOM์˜ ๊ฒฝ์šฐ ECMAScript ์ชฝ์— ์˜ํ•œ ์ œ์ •๋ณด๋‹ค๋Š” Apple, google ๋“ฑ์ด WHATWG working group์„ ๊ตฌ์„ฑํ•˜๊ณ  html5 ํ‘œ์ค€์„ ์ •ํ•œ ๊ฒƒ์— ์˜ํ•ด ํ‘œ์ค€ํ™” ๋˜์—ˆ๋‹ค.

6. CommonJS[ํŽธ์ง‘]

JavaScript์˜ ๋ฐœ์ „๊ณผ ํ•จ๊ป˜ ์ด ์–ธ์–ด๋ฅผ ์„œ๋ฒ„ ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… ๋“ฑ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์›€์ง์ž„์ด ์ผ์–ด๋‚ฌ์œผ๋ฉฐ, ๊ทธ ์‹œ์ดˆ๊ฐ€ ๋ฐ”๋กœ CommonJS๋‹ค.[24] CommonJS๋Š” ๋‹ค์–‘ํ•œ API ๊ทœ๊ฒฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ๋ชจ๋“ˆ ์ŠคํŽ™์ด๋‹ค. ๋‹น์‹œ ECMAScript ํ‘œ์ค€์— ๋ชจ๋“ˆ ์ŠคํŽ™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, CommonJS์˜ ๋ชจ๋“ˆ ์ŠคํŽ™์€ ์ƒ๋‹นํ•œ ํŒŒ๊ธ‰๋ ฅ์„ ๊ฐ€์กŒ๋‹ค.

CommonJS ์ง„์˜์ด ๋ชจ๋“ˆ ๊ตฌํ˜„์—์„œ ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋น„ํŒ์— ๊ฐˆ๋ผ์ ธ ๋‚˜์˜จ ๊ฒƒ์ด AMD(Asynchronous Module Definition)์ด๋‹ค.

CommonJS๋ฅผ ์ด์šฉํ•œ ๊ฐ€์žฅ ์ฃผ์š”ํ•œ ํ”Œ๋žซํผ์€ Node.js์ด๋‹ค. Node.js๋กœ ์ด๋ค„์ง„ ์„œ๋ฒ„๋Š” ๊ฝค ์ธ๊ธฐ๋ฅผ ๋Œ๊ณ  ์žˆ๋Š”๋ฐ, ์›น์˜ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๋™์ผ ์–ธ์–ด๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•จ์œผ๋กœ์„œ ์–ป๋Š” ์ด๋“์ด ์ƒ๋‹นํ•˜๊ณ , ์ˆœ์ˆ˜ํ•œ ์„œ๋ฒ„๋กœ์„œ์˜ ์„ฑ๋Šฅ์ด ๊ฝค ์ข‹์€ ํŽธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ CommonJS์—์„œ ์ •์˜ํ•œ ๊ธฐ๋Šฅ์ด ์ฐจํ›„ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ECMAScript ํ‘œ์ค€์— ๋Œ€๋ถ€๋ถ„ ์ถ”๊ฐ€๋˜์—ˆ๊ณ , Node.js๋Š” CommonJS์˜ ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๊ทธ๋Ÿผ์—๋„ ์—ฌ์ „ํžˆ CommonJS์˜ API๋Š” Node.js ํ™˜๊ฒฝ์—์„œ ๋งŽ์ด ์“ฐ์ด๊ณ  ์žˆ๋‹ค.

7. ๊ด€๋ จ ๊ฐœ๋…[ํŽธ์ง‘]

7.1. ํ‘œ์ค€์•ˆ[ํŽธ์ง‘]

  • ECMAScript: ๋„ท์Šค์ผ€์ดํ”„๊ฐ€ ์ธํ„ฐ๋„ท ์ƒ์˜ ๋‹ค์–‘ํ•œ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๊ธฐ ์œ„ํ•ด ์ œ์‹œํ•œ ํ‘œ์ค€์•ˆ. ์ด ์ŠคํŽ™์„ ๊ตฌํ˜„ํ•œ JavaScript ๊ตฌํ˜„์ฒด๋กœ๋Š” ๊ตฌ๊ธ€์˜ V8 ์—”์ง„, ๋ชจ์งˆ๋ผ์˜ SpiderMonkey, Microsoft์˜ Chakra ๋“ฑ์ด ์žˆ๋‹ค. ์‹ค์ œ๋กœ JavaScript์—๋งŒ ์ ์šฉ๋˜๋Š” ํ‘œ์ค€์•ˆ์ด ์•„๋‹ˆ๋ผ, IE์˜ JScript๋‚˜ Adobe Flash ActionScript์˜ ํ‘œ์ค€์ด๊ธฐ๋„ ํ•˜๋‹ค. ํ˜„์žฌ๋Š” ECMAScript 2020์˜ ํ‘œ์ค€ (ES11)๊นŒ์ง€ ๋‚˜์™€์žˆ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ JavaScript ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ์ด ํ‘œ์ค€์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•œ ์ƒํƒœ๋Š” ์•„๋‹ˆ๋‹ค. 2018๋…„ ํ˜„์žฌ๋Š” IE๋“ฑ์˜ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ES2016 ํ‘œ์ค€๊นŒ์ง€๋Š” ์ ๋‹นํžˆ ๊ตฌํ˜„์ด ๋˜์–ด์žˆ๋Š” ์ƒํƒœ. ๋˜ํ•œ, ๊ตฌํ˜„์ด ์•ˆ๋œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ Babel ๋“ฑ์˜ Transpiler๋ฅผ ์‚ฌ์šฉํ•ด์„œ ES2015 ์ด์ƒ์˜ ๊ธฐ๋Šฅ์„ ์–ด๋А ์ •๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

7.2. ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ[ํŽธ์ง‘]

  • jQuery: DOM Manipulating ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์‚ฌ์‹ค์ƒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์— ํ•„์ˆ˜์˜€๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜€์œผ๋‚˜ ๋ฆฌ์•กํŠธ, ์•ต๊ทค๋Ÿฌ ๋“ฑ์˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ƒ์‚ฐ์„ฑ์ด ์›Œ๋‚™ ๋†’๋‹ค ๋ณด๋‹ˆ 2010๋…„๋Œ€ ํ›„๋ฐ˜๋ถ€ํ„ฐ๋Š” ์‚ฌ์‹ค์ƒ ๋ ˆ๊ฑฐ์‹œ๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์›น์‚ฌ์ดํŠธ์—์„œ๋งŒ ์“ฐ์ด๊ณ  ์•ˆ์“ฐ๋Š” ์ถ”์„ธ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ document.querySelectorAll('oooo')๋ฅผ $('oooo')๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.
  • AngularJS: ๊ตฌ๊ธ€์—์„œ ์ œ์ž‘ํ•œ ํ”„๋ก ํŠธ์—”๋“œ์šฉ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ JavaScript ํ”„๋ ˆ์ž„์›Œํฌ. Angular 1์œผ๋กœ๋„ ๋ถˆ๋ฆฐ๋‹ค. ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋™์‹œ์— ์ž‘์—… ํ•  ์ˆ˜ ์žˆ๋‹ค. MongoDB, Express, AngularJS, Node.js๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ MEAN Stack์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. Angular 2 ์ดํ›„๋กœ๋Š” ์ด๊ฑด TypeScript๋ฅผ ์ด์šฉํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ๋‚ด์žฌ๋˜์–ด ์žˆ๋‹ค.
  • React: Facebook์—์„œ ๋งŒ๋“  ํ”„๋ก ํŠธ์—”๋“œ์šฉ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ, Virtual DOM ๊ฐœ๋…์„ ๋„์ž…ํ•œ UI ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์ƒ์‚ฐ์„ฑ์ด ๋†’๊ณ , DOM ์—…๋ฐ์ดํŠธ์— ์žˆ์–ด์„œ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋นจ๋ผ ๋™์ ์ธ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์— ์œ ๋ฆฌํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋™์  ์›น์ด ๋ชจ๋˜ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•„์ˆ˜ ์š”์†Œ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋งŒํผ ์ถœ์‹œ ์ดํ›„ ๊พธ์ค€ํžˆ ์ ์œ ์œจ์„ ๋Š˜๋ ค๊ฐ€๋ฉฐ ์—…๊ณ„ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋กœ ์ž๋ฆฌ์žก์•˜๋‹ค. ์ตœ๊ทผ์—๋Š” React Hooks์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์ง€์›๋˜๋ฉด์„œ ์ƒ์‚ฐ์„ฑ์ด ๋” ์ข‹์•„์กŒ๋‹ค. html๋กœ ๋ทฐ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” Angular์™€๋Š” ๋‹ค๋ฅด๊ฒŒ JSX๋ผ๋Š” ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๋ฉด์„œ JavaScript๋งŒ์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ธฐ์กด ๋ฌธ์„œ์—๋Š” MVC์˜ V(View)๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ๋˜์–ด ์žˆ์—ˆ์œผ๋‚˜ ๋ฆฌ์•กํŠธ๋Š” MVC framework๊ฐ€ ์•„๋‹ˆ๋ฉฐ View๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Controller ๋ถ€๋ถ„๊นŒ์ง€๋„ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ •ํ™•ํ•œ ์„ค๋ช…์ด ์•„๋‹ˆ๋‹ค.
  • Vue.js: ์ค‘๊ตญ๊ณ„ ๋ฏธ๊ตญ์ธ ์—๋ฐ˜ ์œ ๊ฐ€ ๋งŒ๋“  ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ”„๋ก ํŠธ์—”๋“œ์šฉ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๊ต‰์žฅํžˆ ์ž์œ ๋กญ๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์œผ๋‚˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋“ค์„ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์•ˆ์ •์„ฑ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • Node.js: ๋ธŒ๋ผ์šฐ์ € ์•ˆ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋˜ JavaScript๋ฅผ ๋ธŒ๋ผ์šฐ์ € ์™ธ์˜ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ์ค€ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด๋‹ค.
  • Express.js: Node.js๋ฅผ ์œ„ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ. ์ฃผ๋กœ Node๋กœ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
  • Deno: Node.js์˜ ๊ฐœ๋ฐœ์ž Ryan Dahl์ด Node.js์˜ ์•„์‰ฌ์šด์ ์„ ๊ฐœ์„ ํ•œ JavaScript ์—”์ง„์ด๋‹ค.

7.3. ๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ[ํŽธ์ง‘]

  • Electron: GitHub์—์„œ ๋งŒ๋“  HTML+CSS+Javascript ๋ฐ์Šคํฌํ†ฑ ์•ฑ ํ”„๋ ˆ์ž„์›Œํฌ.
  • ์–ธ๋”์Šค์ฝ”์–ด: ๋ฆฌ์ŠคํŠธ ํ•ด์„, ๊ณ ์ฐจ ํ•จ์ˆ˜ ์ง‘ํ•ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ํ™ˆํŽ˜์ด์ง€
    • Lo-Dash: ์œ„์˜ ์–ธ๋”์Šค์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ฑ๋Šฅ ๊ฐœ์„  ๋ฒ„์ „.
    • npm : Node Package Manager
  • HTML5shiv: IE 6~8์—์„œ HTML5๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด๋‹ค.
  • Prefix Free: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ ๋œ CSS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Vendor Prefix ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ง„ํ–‰ํ•˜์—ฌ ์ค€๋‹ค.

7.4. ํŒŒ์ƒ ์–ธ์–ด[ํŽธ์ง‘]

  • TypeScript: ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ๋ฐœํ‘œํ•œ JavaScript์— ์ •์  ํƒ€์ž… ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ•œ ์‹ ํ˜• ์–ธ์–ด. CoffeeScript์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋Š” JavaScript์ด๋‹ค. ์•ฝํƒ€์ž… ์–ธ์–ด์ธ JavaScript ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ๊ตฌ๋ฉ์„ ๋ฉ”์šฐ๊ธฐ ์œ„ํ•ด ๋‚˜์™”๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๊ฐ•ํƒ€์ž… ์–ธ์–ด๊ฐ€ ๋œ TypeScript๋Š” ์ฝ”๋“œ์˜ ๊ฒฌ๊ณ ํ•จ์„ ๊ฐ•์ ์œผ๋กœ ๋‚ด์„ธ์šฐ๊ณ  ์žˆ๋‹ค. ํ˜„์žฌ๋Š” Angular 2 ์ดํ›„์—์„œ ์ด ์–ธ์–ด๋ฅผ ์ฑ„ํƒํ•˜๋ฉด์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ECMAScript 2015 ํ‘œ์ค€๋„ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ ์ˆœ์ˆ˜ํ•œ JavaScript์™€ ๋ฌธ๋ฒ•์ ์ธ ์ฐจ์ด๊ฐ€ ์ ๋‹ค. ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ๋งŒ๋“ค์—ˆ๋‹ค๋ณด๋‹ˆ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ํŽธ์ง‘๊ธฐ์ธ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜ ํƒ€์ž…์ด๋‚˜ ์˜ค๋ฅ˜์— ๊ด€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ฆ‰๊ฐ์ฆ‰๊ฐ ํ•ด ์ฃผ์–ด์„œ ๋ฒ„๊ทธ ๋ฐฉ์ง€์— ์œ ์šฉํ•˜๋‹ค.
  • CoffeeScript: JavaScript์˜ ๋ฌธ๋ฒ•์„ ๊ฐœ์„ ํ•œ ์‹ ํ˜• ์–ธ์–ด. ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋กœ JavaScript ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ธ๋‹ค. ๊ธฐ์กด JavaScript์˜ ์„ค๊ณ„ ๊ฒฐํ•จ์„ ๊ทน๋ณตํ•  ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Python์ฒ˜๋Ÿผ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ์ฝ”๋“œ ๋ธ”๋ก์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฌธ๋ฒ•์„ ์ฑ„ํƒํ•ด ํ˜ธ๋ถˆํ˜ธ๊ฐ€ ๊ฐˆ๋ฆฌ๋Š” ํŽธ์ด๋‹ค. 2017๋…„ ๋ง์—๋Š” '๋ถˆํ˜ธ' ์ชฝ์œผ๋กœ ๋งŽ์ด ๊ธฐ์šธ์–ด ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค.
  • Dart: ๊ตฌ๊ธ€์—์„œ ๋ฐœํ‘œํ•œ JavaScript ๋ฌธ๋ฒ•์„ ๊ฐœ์„ ํ•œ ์–ธ์–ด. TypeScript๋ณด๋‹ค ์กฐ๊ธˆ ๋น ๋ฅธ ์‹œ๊ธฐ์— ๋ฐœํ‘œํ–ˆ๋‹ค.
  • JavaScript.NET: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์šฉ ์–ธ์–ด๋กœ ๊ฐœ์กฐํ•œ ๊ฒƒ์ด๋‹ค.

8. ์›น๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ[ํŽธ์ง‘]

2016๋…„ ํ˜„์žฌ๊นŒ์ง€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์˜ ์œ ์ผํ•œ ์–ธ์–ด์ด์ž ๋Œ€์ฒด์žฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์–ธ์–ด์ด๋‹ค. ์ผ๋ถ€ ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹จ์ˆœ ์• ๋‹ˆ๋ฉ”์ด์…˜(์• ๋‹ˆ๋ฉ”์ด์…˜ gif, CSS ์• ๋‹ˆ๋ฉ”์ด์…˜)์„ ๋„˜์–ด์„œ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋ ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ด์ง„๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ธฐ์กด์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•˜๋˜ ์ผ์„ ๋Œ€์‹ ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ธฐ์ˆ ์ด ํ”Œ๋ž˜์‹œ ๊ฐ™์€ ๋ฆฌ์น˜ ์ธํ„ฐ๋„ท ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜๋ฐ–์— ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ”Œ๋ž˜์‹œ์˜ ์•ก์…˜์Šคํฌ๋ฆฝํŠธ๋„ ๊ฒฐ๊ตญ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‘œ์ค€์ธ ECMA๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ๊ทธ๋ž˜์„œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ๋Š” ์ˆ˜์‹ญ ์ข…์˜ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์‚ฌ์šฉ๋˜์ง€๋งŒ ์›น ํ™˜๊ฒฝ์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์ด ๊ฐ•์ œ๋˜๊ณ  ์žˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๊ธฐ์ˆ ๋œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ(ํŠธ๋žœ์Šค์ปดํŒŒ์ผ๋Ÿฌ)๊ฐ€ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ์–ด์ฐจํ”ผ ์ตœ์ข…์ ์œผ๋กœ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฒˆ์—ญ๋ผ์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ”ผํ•ด๊ฐˆ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

๋ฐ˜๋ฉด, ๊ฐ™์€ ์›น ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‚˜๋จธ์ง€ ๋‘ ํ•ต์‹ฌ ์–ธ์–ด(๋งˆํฌ์—… ์–ธ์–ด)์ธ HTML๊ณผ CSS๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋Œ€์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ ์ค‘ HTML์€ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ .js ํŒŒ์ผ์„ ์ง์ ‘ ์ฝ์–ด ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ(script ํƒœ๊ทธ ํ•œ ์ค„)๋Š” ํ•„์š”ํ•˜์ง€๋งŒ, CSS๋Š” ์™„์ „ํžˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋Œ€์ฒดํ•ด์„œ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ์ง€ ์„ฑ๋Šฅ๊ณผ ํŽธ์˜์„ฑ์—์„œ ์†ํ•ด๋ฅผ ๋ณด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์„ ๋ฟ์ด๋‹ค. ํŽ˜์ด์Šค๋ถ์—์„œ ๊ฐœ๋ฐœํ•œ React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” HTML๊ณผ CSS๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ œ์–ดํ•œ๋‹ค. jsx ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์ด HTML์„ ๋‹ฎ์•„์žˆ๊ธด ํ•˜์ง€๋งŒ jsx transformer(babel ์ปดํŒŒ์ผ๋Ÿฌ ๋“ฑ)๋ฅผ ํ†ต๊ณผํ•œ ๋’ค์—๋Š” ๋ชจ๋‘ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜๋ผ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ์˜ ๊ธฐ๊ณ„์–ด์™€ ๊ฐ™์€ ์ง€์œ„๋ฅผ ํ˜„์žฌ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ˆ„๋ฆฌ๊ณ  ์žˆ๋Š” ์…ˆ์ด๋‹ค.

2016๋…„ ๊นŒ์ง€๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์„ฑ๋Šฅ์„ ๋Œ์–ด์˜ฌ๋ฆฌ๋ ค๋Š” ์‹œ๋„(asm.js ๋“ฑ)๋Š” ์žˆ์–ด๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋Œ€์ฒดํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ณ  ์žˆ๋‹ค. ๊ณผ๊ฑฐ์— ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ ๋น„์ฃผ์–ผ ๋ฒ ์ด์ง ๊ธฐ๋ฐ˜์˜ VBScript๋ฅผ ๋ฏผ ์ ์ด ์žˆ์ง€๋งŒ ๊ฒฐ๊ตญ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋ฐ€๋ ค ์‚ฌ๋ผ์กŒ๊ณ , ์˜ค๋Š˜๋‚ ์—๋Š” ๊ตฌ๊ธ€์˜ Dart ์–ธ์–ด๊ฐ€ ๋Œ€์ฒด๋ฅผ ์‹œ๋„ํ•˜๊ณ ๋Š” ์žˆ์ง€๋งŒ ํ˜„์žฌ๊นŒ์ง€๋Š” Dart ์–ธ์–ด๋„ ํŠธ๋žœ์Šค์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฒˆ์—ญ๋˜๋Š” ๊ตด์š•์„ ๋‹นํ•˜๋Š” ์ค‘์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ง์ ‘ Dart ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ตฌ๊ธ€ ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์œ ์ผํ•˜๋‹ค.

2016๋…„ 11์›” ๊ธฐ์ค€ ๊ตฌ๊ธ€ยทMSยท๋ชจ์งˆ๋ผยท์• ํ”Œ์—์„œ ์›น์–ด์…ˆ๋ธ”๋ฆฌ(WebAssembly)์— ๋Œ€ํ•œ ์‹œ๋„๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋‹ค. ์›น ์—”์ง„์„ ์œ„ํ•œ ์ผ์ข…์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด(์ •ํ™•ํžˆ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ)๋ฅผ ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ํ”„๋กœ์ ํŠธ๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ C, C++ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €์—์„œ๋“  ๋Œ์•„๊ฐ€๋„๋ก ์ปดํŒŒ์ผ ํ• ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” C/C++ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผ ํ•ด์„œ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ง€๋งŒ, ๋‚˜์ค‘์—๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๋„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ๋‹ค. ๋‹ค๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ์ƒํ˜ธ ๋ณด์™„์˜ ๊ด€๊ณ„๋กœ ์—ฐ๊ตฌ๋˜๊ณ  ์žˆ๋‹ค.

9. ๊ธฐํƒ€[ํŽธ์ง‘]

  • Java์™€๋Š” ์ด๋ฆ„์˜ ์œ ์‚ฌ์„ฑ๊ณผ ๊ฐ™์€ C-์กฑ ์–ธ์–ด๋ผ๋Š” ๊ฑธ ๋นผ๋ฉด ์ „ํ˜€ ์ƒ๊ด€์ด ์—†๋Š”, ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ์–ธ์–ด๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์ด ์•„์ง๊นŒ์ง€๋„ ์ž์ฃผ ํ—ท๊ฐˆ๋ คํ•˜๋Š” ๋ถ€๋ถ„.[25]
  • ํ•ด์™ธ์—์„œ๋Š” JavaScript๋ฅผ ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋‚ด๋ณด๋‚ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŽ์ด ๋“ฑ์žฅํ•˜๊ณ  ์žˆ๋‹ค. ์ด์™€ ํ•จ๊ป˜ ๊ณ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์™€ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์ง€๊ธˆ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ธŒ์…‹ ๊ฐœ๋ฐœ์ด ์ง„ํ–‰ ์ค‘์ด๋‹ค. LLJS(Low-Level JavaScript)์™€ asm.js๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์„œ๋ธŒ์…‹๊ณผ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” C++ ๊ฐ™์€ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ JavaScript๋กœ ์ปดํŒŒ์ผ ํ•ด์„œ ๋Œ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ๋˜ํ•œ JSIL์€ CIL๊ณผ .Net ๊ฐ€์ƒ๊ธฐ๊ณ„๋ฅผ ๋‹ค์‹œ JavaScript๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ ์˜ˆ๋กœ, archive.org์—์„œ ์ œ๊ณตํ•˜๋Š” Classic PC Games Archive๊ฐ€ ์žˆ๋‹ค. DOSBox, MESS๋ฅผ LLVM/Clang์œผ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ตฌ๋™ํ•˜๊ฒŒ ํ•œ ๊ฒƒ์ด๋‹ค. Core i5 ์ •๋„์˜ ์ปดํ“จํ„ฐ๋ผ๋ฉด ํ”Œ๋ ˆ์ด ํ•˜๋Š” ๋ฐ ๊ฑฐ์˜ ์ง€์žฅ์ด ์—†๋Š” ์ˆ˜์ค€์„ ๋ณด์—ฌ์ค€๋‹ค.
  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐœ๋ฐœ ํŠธ๋ Œ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋‹ค ๋ณด๋ฉด ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์›น ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์–ธ์–ด์ธ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ์ ˆ์ฐจํ˜•์—์„œ ๊ฐ์ฒด์ง€ํ–ฅ์œผ๋กœ, ๋‹ค์‹œ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ๋Š” ํ•จ์ˆ˜ํ˜•์—์„œ ๋” ๋ฐœ์ „ํ•ด ๋ฐ˜์‘ํ˜•(Reactive)์œผ๋กœ ๊ฐ€๊ณ  ์žˆ๊ณ  reactive ๊ตฌํ˜„์ฒด์ธ rxjs๋Š” ํ˜„์žฌ ํ”„๋ก ํŠธ์—”๋“œ 3๋Œ€์žฅ ํ”„๋ ˆ์ž„์›Œํฌ์ธ AngularJS/Angular์˜ ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋‹ค๋ฅธ reactive ๊ตฌํ˜„์ฒด๋กœ๋Š” Java์—์„œ ์“ฐ์ด๋Š” rxjava๊ฐ€ ์žˆ๋‹ค.
  • JavaScript๋Š” ๋ฉ€ํ‹ฐํŒจ๋Ÿฌ๋‹ค์ž„ ์–ธ์–ด๋กœ, ์ ˆ์ฐจํ˜•, ํ•จ์ˆ˜ํ˜•, ๋…ผ๋ฆฌํ˜•์„ ํฌํ•จํ•œ ๊ทธ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋„ ์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, ์ด๊ฑธ JavaScript ํ‚น์™•์งฑ ๋งŒ๋Šฅ ๋ํŒ์™• ์ข…๊ฒฐ์ž๋กœ ์ƒ๊ฐํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๋‚˜์˜๊ฒŒ ๋งํ•˜๋ฉด ์žกํƒ•์ด๊ธฐ ๋•Œ๋ฌธ. ์ ๋งˆ๋„์‚ฌ ์ •ํ™•ํžˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํฉ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์ž˜ ์“ธ ์ˆ˜ ์žˆ์„ ์ •๋„์˜ ์ˆ˜์ค€์ด ๋˜์–ด์•ผ ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์–ธ์–ด๋ฅผ ์ด์šฉํ•œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์žกํƒ•์ด ์•ˆ ๋œ๋‹ค. C++๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด๋ฉด ๋„ˆ๋ฌด ๋งŽ์€ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ง€์›ํ•ด์„œ ๋ฐฐ์šฐ๊ธฐ๋„ ์“ฐ๊ธฐ๋„ ์–ด๋ ค์šด ์–ธ์–ด ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๊ณ , ๊ฒฐ๊ตญ ์ข‹์€ ๊ฐœ๋ฐœ์ž๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ํž˜๋“  ์ƒํ™ฉ์ด ๋๋‹ค. ๊ทธ๋ž˜๋„ ์–ธ๋งค๋‹ˆ์ง€๋“œ ์–ธ์–ด๋ฅ˜์—์„œ๋Š” ๋Œ€์ฒด๊ฐ€ ์—†๋Š” ๊ฒŒ ํ•จ์ •
  • ์–ผ๋งˆ ์ „๊นŒ์ง€๋งŒ ํ•ด๋„ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ๋งคํฌ๋กœ๋กœ ์ทจ๊ธ‰๋๋Š”๋ฐ ์ด์ œ๋Š” ๋…๋ฆฝ์ ์ธ ์–ธ์–ด๋กœ ์ธ์ •๋˜๊ณ  ์žˆ๋Š” ์ด์œ ๋Š”, ๋” ์ด์ƒ ๋ธŒ๋ผ์šฐ์ €์˜ ํ™•์žฅ์ด๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹Œ, ์„œ๋ฒ„ํ˜•์ธ NodeJS(๊ตฌ๊ธ€ V8 ์—”์ง„)๋‚˜ ์ปดํŒŒ์ผํ˜•์ธ JavaScript .Net ๊ฐ™์€ ๊ฒƒ๋“ค์˜ ๊ฐœ๋ฐœ์— ๊ธฐ์ธํ•œ ๊ฒƒ์ด๋‹ค. ์•„๋งˆ๋„ ๋จธ์ง€์•Š์•„ ๋”๊ธ€๋ผ์Šค ํฌ๋ฝํฌ๋“œ(Douglas Crockford)์˜ ์ฃผ์žฅ๊ณผ ์š”๊ตฌ๋Œ€๋กœ ๋…๋ฆฝ์ ์ธ ์–ธ์–ด๋กœ ์„ ์–ธ์ด ๋  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
  • ๋ฅ˜์ƒค์˜ค๋ณด ์‚ฌ๋ง ์ดํ›„ ์ค‘๊ตญ์—์„œ๋Š” ๋œฌ๊ธˆ์—†์ด ๊ธˆ์ง€์–ด๊ฐ€ ๋˜์—ˆ๋‹ค. ์ถ”๋ชจ ๋ถ„์œ„๊ธฐ ํ™•์‚ฐ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด RIP๋ฅผ ๊ธˆ์ง€์–ด๋กœ ์ง€์ •ํ–ˆ๋”๋‹ˆ ์ด ์ฒ ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript)๊ฐ€ ์–ผ๋–จ๊ฒฐ์— ํ”ผํ•ด๋ฅผ ๋ณธ ๊ฒƒ(...).
  • 2018๋…„ 11์›” ๊ธฐ์ค€ ํ•ด์ปค๋žญํฌ์˜ ์กฐ์‚ฌ ๊ฒฐ๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋Šฅ์ˆ™ํ•˜๋‹ค๊ณ  ์‘๋‹ตํ•œ ๊ฐœ๋ฐœ์ž์˜ ๋น„์œจ์ด 73%๋กœ ๊ฐ€์žฅ ๋†’๊ฒŒ ๋‚˜ํƒ€๋‚ฌ๋‹ค. 2์œ„๋Š” ์ž๋ฐ”๋กœ 71%. #
  • ์–ด์งธ์„œ์ธ์ง€ await, async, of, let, yield๋Š” ์˜ˆ์•ฝ์–ด์ด์ง€๋งŒ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ช…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด์—๋Š” ์ด ๋‹จ์–ด๋“ค์ด ์˜ˆ์•ฝ์–ด๊ฐ€ ์•„๋‹ˆ์—ˆ๊ธฐ์— ์ด ๋‹จ์–ด๋“ค์„ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ์ผ๋˜ ์Šคํฌ๋ฆฝํŠธ์˜ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ์ผ ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋ฅผ ํ™œ์šฉํ•ด์„œ of๋ฅผ ์ดํ„ฐ๋ ˆ์ดํƒ€๋‚˜ ๋ฐฐ์—ด๋กœ ํ•ด๋†“๊ณ  for(of of arr) { ... } ๋‚˜ for(i of of) { ... } ๋ผ๊ณ  ์“ฐ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • async function async() { ... } ๋ผ๋Š” ์ฝ”๋“œ๋„ ์ •์ƒ ์ž‘๋™ํ•œ๋‹ค. ํ•˜์ง€๋งŒ async function await() { ... }; console.log(await await());๋ผ๊ณ  ์“ฐ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. ํ—ˆ๋‚˜ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋‚ฎ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜์˜ ์ž‘๋™ ๋ฐฉ์‹ ๋•Œ๋ฌธ์ธ์ง€ setInterval() ๋˜๋Š” setTimeout() ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ ์•ฝ๊ฐ„์˜ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•œ๋‹ค.

10. ์ฐธ๊ณ ํ•  ๋งŒํ•œ ๊ณณ[ํŽธ์ง‘]

[1] ์ด ๋•Œ๋ฌธ์— ๋™์ ์ธ ํ™ˆํŽ˜์ด์ง€๊ฐ€ ํ•„์š”์—†๋‹ค๋ฉด JavaScript๋Š” ์•ˆ ์จ๋„ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 2016๋…„ ํ˜„์žฌ ์›ฌ๋งŒํ•œ ํ™ˆํŽ˜์ด์ง€์—๋Š” ๋™์ ์ธ ์š”์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ๊ฑฐ์˜ ํ•„์ˆ˜์ ์œผ๋กœ ์“ฐ์ด๋Š” ๊ฒƒ์ด ํ˜„์‹ค.
[2] ๋‹ค๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•œ ์ค„๋กœ ๋ถ™์—ฌ ์“ฐ์ง€ ์•Š๋Š” ์ด์ƒ ๊ตณ์ด ์„ธ๋ฏธ์ฝœ๋ก ์„ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋Š”๋ฐ, ๊ฐ•์ œ๊ฐœํ–‰์ด ์„ธ๋ฏธ์ฝœ๋ก  ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
[3] ์ •ํ™•ํžˆ๋Š” ํ•จ์ˆ˜ํ˜•์ด ์ฃผ๋กœ ์“ฐ์ด๋Š” ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„
[4] ๊ฐ€๋ณ€ ๋ณ€์ˆ˜ ์„ ์–ธ
[5] ๋ถˆ๋ณ€ ๋ณ€์ˆ˜ ์„ ์–ธ. ๋‹ค๋งŒ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ• ์‹œ ๋ถˆ๋ณ€์„ฑ์ด ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ์ฒด ๊ทธ ์ž์ฒด์—๋งŒ ๋ถˆ๋ณ€์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ์…ˆ.
[6] ๋‹น์‹œ์— Java๊ฐ€ ์œ ํ–‰์„ ํƒ€๊ธฐ ์‹œ์ž‘ํ•˜๋‹ˆ๊นŒ ์ฌ ๋งˆ์ดํฌ๋กœ์‹œ์Šคํ…œ์ฆˆ(์ง€๊ธˆ์€ ์˜ค๋ผํด์— ์ธ์ˆ˜๋จ)์—๊ฒŒ ํŠธ๋ ˆ์ด๋“œ๋งˆํฌ ๋ผ์ด์„ ์Šค๋ฅผ ๋นŒ๋ ค ์™”๋‹ค. #
[7] 1990๋…„๋Œ€ ์ค‘๋ฐ˜์— ๋ฐœํ‘œ๋œ ์–ธ์–ด๊ฐ€ ์š”์ฆ˜ ์ƒˆ๋กญ๊ฒŒ ๋‚˜์˜ค๋Š” ์–ธ์–ด๋“ค๋ณด๋‹ค๋„ ๋” ํ•œ ์ถ”์ƒํ™”๋ฅผ ์ž๋ž‘ํ•œ๋‹ค.
[8] ๊ทธ๋•Œ๋Š” Java๋ฅผ ํ•  ์ค„ ์•Œ๋ฉด JS๋ฅผ ๋ชฐ๋ผ๋„ ๊น” ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ฆ„์œผ๋กœ...
[9] ๊ณผ๊ฑฐ์—๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ JS ์—”์ง„์ด ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฐ™์€ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
[10] ๋งํฌ๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ์ดˆ์ฐฝ๊ธฐ ๋„ท์Šค์ผ€์ดํ”„ ์‚ฌ์˜ ์ ์œ ์œจ์€ 80%๋กœ ์••๋„์ ์ด์—ˆ์œผ๋‚˜ ์ ์  ์ผ๋ฐฉ์ ์œผ๋กœ IE์—๊ฒŒ ๋ฐ€๋ฆฌ๋Š” ๊ฒƒ์ด ๋ณด์ธ๋‹ค. ์ฐธ์กฐ.
[11] IE 8 ์ดํ•˜์˜ ๋ฒ„์ „์—์„œ๋Š” JScript๋งŒ์˜ ๋ฌธ๋ฒ•์ด ๋‚จ์•„์žˆ์–ด ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ๋ฌธ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚ฌ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ addEventListener๋ฅผ attachEvent ๊ฐ™์€ ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋Ÿฌํ•˜๋‹ค. IE 9๋ถ€ํ„ฐ๋Š” ECMA ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋„๋ก ์ˆ˜์ •๋˜์—ˆ์œผ๋‚˜, ๋ ˆ๊ฑฐ์‹œ ์ง€์›์„ ์œ„ํ•ด ๊ธฐ์กด์˜ JScript๋„ ๋‚จ๊ฒจ ๋‘์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ JScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ญ์‹œ jscript.dll๊ณผ jscript9.dll์ด ๊ฐ™์ด ์กด์žฌํ•˜๋ฉฐ, ๊ธฐ๋ณธ์˜ JScript๋Š” ๋ฌธ์„œ ๋ชจ๋“œ๋ฅผ 8 ์ดํ•˜๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค.
[12] Paul, Ryan (2008-08-22). "Firefox to get massive JavaScript performance boost". Ars Technica. Retrieved 2013-03-21.
[13] ์ด๋Ÿฐ 3D ๊ฒŒ์ž„ ๊ฐ™์€ ๋ถ„์•ผ์—์„œ๋Š” ๋น ๋ฅธ JavaScript์™€ WebGL ๋“ฑ์œผ๋กœ๋„ ๋ถ€์กฑํ•ด์„œ ์ด์   ๋ชจ์งˆ๋ผ์—์„œ asm.js ๊ฐ™์€ ์„œ๋ธŒ์…‹๊นŒ์ง€ ๋งŒ๋“ค์–ด์„œ, ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ด ๊ฑฐ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์— ๊ฐ€๊น๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๊ทนํ•œ์˜ ์ตœ์ ํ™”๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค.
[14] ๋‹ค๋งŒ ๋Œ€ํ•™์ƒ์ด๋ผ๋ฉด ํ•™๊ต ์ด๋ฉ”์ผ์„ ํ†ตํ•ด ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๋ฏ€๋กœ ๋Œ€ํ•™์ƒ์ด๋ผ๋ฉด ๋†“์น˜์ง€ ๋ง์ž.
[15] ์žฌ๋ฏธ์žˆ๋Š” ์ ์€ ์ด ์„ธ ์—๋””ํ„ฐ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ JavaScript๋ฅผ ์“ด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค! ์ •ํ™•ํžˆ๋Š” Node.js์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ ElectronJS๋กœ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.
[16] ํŠนํžˆ arrow syntax์˜ ๋“ฑ์žฅ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์€ ๋”๋”์šฑ ๊ฐ•ํ•ด์กŒ๋‹ค.
[17] ์•ฝํƒ€์ž… ์–ธ์–ด๋ผ๋Š” ์•ฝ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ JavaScript ์Šˆํผ์…‹ ์–ธ์–ด์ธ TypeScript๋ผ๋Š” ๊ฒƒ๋„ ๋‚˜์™”์œผ๋ฉฐ ์‹ค์ œ๋กœ ์ˆœ์ • JavaScript์™€ ๋”๋ถˆ์–ด ๋งŽ์ด ์“ฐ์ด๊ณ  ์žˆ๋‹ค.
[18] JavaScript Object Notation, ์ฆ‰ JavaScript ๊ฐ์ฒด ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์˜ค๋Š˜๋‚  AJAX์˜ XML ๋Œ€์‹  ์“ฐ์ด๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ AJAJ๋ผ๊ณ  ๋ถˆ๋ ค์•ผ ๋œ๋‹ค๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ์„ ์ •๋„.
[19] ๋ฌผ๋ก  ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ ๊ธฐ์ค€์—์„œ๋‹ค.
[21] ๋ฐ˜๋Œ€๋กœ JavaScript ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ์™€ ์ปจํ‹ฐ๋‰ด์—์ด์…˜์˜ ๋‹จ์ˆœํ•˜๊ณ  ํˆฌ๋ช…ํ•œ ์ž‘๋™ ๋ชจ๋ธ์ด ์˜คํžˆ๋ ค ํ”„๋กœ๊ทธ๋žจ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ์˜๊ฒฌ๋„ ์žˆ๋‹ค.
[22] ์™„์ „ํ•œ ๋™์‹œ ์‹คํ–‰์€ ์•„๋‹ˆ๋ฉฐ, ๊ทธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฑฐ๋ถ€(rejected)๋˜๋ฉด ๊ทธ Promise์˜ ์˜ค๋ฅ˜๊ฐ€ ๋–  Promise ๋ณ„๋กœ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Promise.allSettled๋ฅผ ์จ์•ผํ•œ๋‹ค. ํŒŒ์ด์ฌ์˜ asyncio.gather์™€ ๋น„์Šทํ•˜๋‹ค.
[23] Document Object Model
[24] ๋ณธ๋ž˜ ์ด๋ฆ„์€ ServerJS์˜€๋‹ค.
[25] ์ž๋ฐ”๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด ๊ธฐ๋ฐ˜ ์–ธ์–ด์ด๋‹ค.