Three.js: TypeScript ํ‰๊ฐ€

์— ๋งŒ๋“  2019๋…„ 01์›” 08์ผ  ยท  28์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

TypeScript ํ‰๊ฐ€

Ember.js RFC ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ๋ฌธ์„œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ํฐ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์ฃผ์š” ์šฐ๋ ค ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ข‹์€ ํ…œํ”Œ๋ฆฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. RFC ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ github repo: https://github.com/emberjs/rfcs๋ฅผ ๋ฐฉ๋ฌธ

์š”์•ฝ

์ €๋Š” ๋ชจ๋“  TypeScript ํ† ๋ก ์„ ํ•œ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ˜„์žฌ TypeScript์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐฌ๋ฐ˜ ์–‘๋ก ์ด ์—ฌ๋Ÿฌ ๋ฌธ์ œ, ์Šค๋ ˆ๋“œ, ํ’€ ์š”์ฒญ ๋ฐ ํ† ๋ก ์— ํฉ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋”ฐ๋ผ๊ฐ€๊ธฐ ๋งค์šฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ  ์ง‘์ค‘ํ•˜์ง€ ์•Š์œผ๋ฉด ํฐ ์ง„์ „์ด ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ตœ๊ทผ https://github.com/mrdoob/three.js/issues/11552 ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด three.js ๋ฐ TypeScript์™€ ๊ด€๋ จํ•˜์—ฌ ๋งŽ์€ ๊ฒฌ์ธ๋ ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋™๊ธฐ ๋ถ€์—ฌ

TypeScript๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ ์  ๋” ๋Œ€์ค‘ํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฑ„ํƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ npm์—์„œ @types/three ์˜ ์ฃผ๊ฐ„ ๋‹ค์šด๋กœ๋“œ์™€ three ํŒจํ‚ค์ง€๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ TypeScript์™€ ํ•จ๊ป˜ Three.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 2019๋…„ 1์›” 1์ผ๋ถ€ํ„ฐ 2019๋…„ 1์›” 7์ผ๊นŒ์ง€ ๊ธฐ๊ฐ„ ๋™์•ˆ three 56414๊ฑด, @types/three 40588๊ฑด์ด์—ˆ์Šต๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ https://www.npmjs.com ์ฐธ์กฐ). /package/@types/three ๋ฐ https://www.npmjs.com/package/three). ๊ฒŒ๋‹ค๊ฐ€ ์ด๋ฏธ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์™€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๊ฑธ์ณ ์ˆ˜ํ–‰๋œ ๋งŽ์€ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํž˜์„ ํ•ฉ์น˜๊ณ  TypeScript๋ฅผ ํ•œ ๊ณณ์—์„œ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” TypeScript๋Š” ๋‹จ์ ๋ณด๋‹ค ์žฅ์ ์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” JavaScript์˜ ์œ ํ˜•๊ณผ TypeScript์˜ ์œ ํ˜•์— ๋Œ€ํ•ด ๋งŽ์€ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค)

๋‚ด๊ฐ€ ๋ณด๋Š” ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ, ๋˜ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ์—ฌ์ž ๋ฐ Three ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž
  • ์œ ํ˜•์€ Three ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ API๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฌธ์„œ๋ฅผ ์ฝ์„ ํ•„์š”๊ฐ€ ์ ์€ ๊ฐœ๋ฐœ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ์ด์ƒ ์˜ค๋ž˜๋œ @types/three ์ •์˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ–ฅํ›„ ํŠธ๋žœ์ŠคํŒŒ์ผ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: tsickle ๊ณผ ๊ฐ™์€ ์ž‘์—…์ด ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์ด์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ๋” ๋งŽ์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค). ๋˜ํ•œ AssemblyScript ์™€ ๊ฐ™์€ ์‹คํ—˜์  ๋„๊ตฌ๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ํŠน์ • ์„ฑ๋Šฅ ๋น„ํŒ์  ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ํ˜•์€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ECMAScript ํ‘œ์ค€์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์„ ์‚ฌ์šฉํ•˜๊ณ  ์†Œ์Šค๋ฅผ ๋‹ค๋ฅธ ECMAScript ๋ฒ„์ „์œผ๋กœ ๋ณ€ํ™˜ํ•  ๊ฐ€๋Šฅ์„ฑ
  • ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์™„๋ฃŒ๋˜๋ฉด ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ TS ๋˜๋Š” JS๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ Three ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•„๋ฌด๋Ÿฐ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ declarationDir ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†Œ์Šค ์ฝ”๋“œ์—์„œ d.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ํƒ€์ดํ•‘์ด ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋””ํ…Œ์ผํ•œ ๋””์ž์ธ

TypeScript์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๋ชจ๋“  ES6 ์ž‘์—…์„ ๋จผ์ € ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ES6์—์„œ TypeScript๋กœ์˜ ์ „ํ™˜์€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(TypeScript๋Š” ์œ ํ˜•์ด ์žˆ๋Š” ์ตœ์‹  JavaScript์™€ ๋งŽ์ด ์œ ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ ๋กค์—… - ํ”Œ๋Ÿฌ๊ทธ์ธ - ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ํ•  ํ•„์š”๊ฐ€ (๋‚ด๊ฐ€ ์ œ์•ˆ - ํ”Œ๋Ÿฌ๊ทธ์ธ - typescript2๋ฅผ ๋กค์—… ). ๊ทธ๋Ÿฐ ๋‹ค์Œ tsconfig.json ๋งŒ๋“ค๊ณ  ๋ชจ๋“  TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ์„ค์ •์„ ํ•„์š”์— ๋งž๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. tslint ๋„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋ฅผ ์œ„ํ•œ ๋กค์—… ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ rollup-plugin-tslint ๋ผ๊ณ  ํ•จ). ๋นŒ๋“œ๊ฐ€ ์ž‘๋™ํ•œ ํ›„ @types/three ๋ฐ three.ts ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž…๋ ฅ์„ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ๊ฐ€๋ฅด์น˜๋Š” ๋ฐฉ๋ฒ•

์ฒ˜์Œ์— ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ์—ฌ์ž๋“ค์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Three.js ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒƒ์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค(TypeScript๊ฐ€ JavaScript๋กœ ๋ณ€ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—). ๋ช‡ ๋ฒˆ ๋ฐ˜๋ณตํ•œ ํ›„์—๋Š” TypeScript ๋ฐ JavaScript์˜ ๋ฌธ์„œ์— ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ข‹์€ ์˜ˆ๋Š” Stripe API ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

๋‹จ์ 

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

๋Œ€์•ˆ

์ˆœ์ˆ˜ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณ ์ˆ˜ํ•˜์ง€๋งŒ ์ด๋Š” @types/three ์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋ฏธ ์ˆ˜ํ–‰ํ•œ ๋ชจ๋“  ๋…ธ๋ ฅ์„ ๋ฌด์‹œํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Three.js์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ๋น„๊ณต์‹์ ์œผ๋กœ Three๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ

  • ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๊นŒ?
  • ์–ธ์ œ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ(์ง€๊ธˆ ๋˜๋Š” ES6 ์™„๋ฃŒ ํ›„)?
  • ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•? ์ฒ˜์Œ์—๋Š” d.ts ํŒŒ์ผ๋กœ๋งŒ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด TypeScript๋กœ ์™„์ „ํžˆ ๊ฑด๋„ˆ๋›ฐ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ๋ˆ„๊ฐ€ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ˆ„๊ฐ€ ์ด๊ฒƒ์„ ์‹œ์ž‘ํ•˜๋„๋ก ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌ๋ฐ›์•˜์Šต๋‹ˆ๊นŒ?

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

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ TypeScript๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ €๋Š” JavaScript ES6์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

.js๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ src์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด TypeScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ”„๋กœ์ ํŠธ์— ๋” ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/blob/dev/examples/webgl2_sandbox.html#L37 -L48

*.d.ts ํŒŒ์ผ์„ ๋‚˜๋ž€ํžˆ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํŒŒ์ผ์„ ์†Œ์œ ํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์‚ฌ๋žŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์˜ ๊ด€์ ์—์„œ ๋‚˜๋Š” ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ AssemblyScript์™€ ๊ฐ™์€ ์‹คํ—˜์  ๋„๊ตฌ๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ํŠน์ • ์„ฑ๋Šฅ ๋น„ํŒ์  ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Three.js ์ฝ”์–ด + WASM ์‹คํ—˜์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค.

https://github.com/takahirox/three.wasm-experimental
https://twitter.com/superhoge/status/1071132448426262529

์‹คํ—˜์„ ํ†ตํ•ด ์ „์ฒด ์ฝ”์–ด๋ฅผ WASM์œผ๋กœ ์ด์‹ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ 1.5๋ฐฐ ๋” ๋น ๋ฅด๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์ž‘์€ ๋ถ€๋ถ„(์˜ˆ: Math ์ฝ”๋“œ(Vector3, Matrix4, ...))๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ ์ด์‹ํ•˜๋Š” ๊ฒƒ์€ ์ด์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํฐ JS-WASM ์˜ค๋ฒ„ํ—ค๋“œ.

ํ•˜์ง€๋งŒ ์œ ์ง€ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€ ๋•Œ๋ฌธ์— ๊ธฐ์—ฌ์ž๋ฅผ ์œ„ํ•ด ์ „์ฒด Three.js ์ฝ”์–ด๋ฅผ C++ ๋˜๋Š” Rust๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. TypeScript + AssemblyScript๊ฐ€ Three.js์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•? ์ฒ˜์Œ์—๋Š” d.ts ํŒŒ์ผ๋กœ๋งŒ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์™„์ „ํžˆ TypeScript๋กœ ๊ฑด๋„ˆ๋›ฐ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ์ฃผ๋กœ @types/three๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” *.d.ts ํŒŒ์ผ์„ Three.JS์— ์ถ”๊ฐ€ํ•˜๋Š” PR์„ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์ง„์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@takahirox ๋ฉ‹์ง„ ์ž‘์—… :-) ์ €๋Š” Three.js ์ฃผ๋ณ€์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํ˜์‹ ์ ์ธ ์ž‘์—…์ด ์ผ์–ด๋‚˜๋Š”์ง€ ํ•ญ์ƒ ๋งค๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ๋… ์ฆ๋ช…์ด ๊ทธ๋‹ค์ง€ ์ฃผ๋ชฉ์„ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ C++๋‚˜ Rust๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. AssemblyScript๊ฐ€ ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์ง€๋งŒ AssemblyScript๋ฅผ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— AssemblyScript์— ๋Œ€ํ•ด ์ฝ์€ ๋‚ด์šฉ์„ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ AssemblyScript๋„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ๋กœ๋Š” ์ด๊ฒƒ์ด TypeScript์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@bhouston d.ts ํŒŒ์ผ์„ @types/three ์—์„œ three ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๋Ÿฌํ•œ d.ts ํŒŒ์ผ์€ TypeScript ํŒŒ์ผ์—์„œ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ญ์ƒ ๋™๊ธฐํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. d.ts ํŒŒ์ผ์ด ํ•ญ์ƒ ์ž๋™ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ js ํŒŒ์ผ๊ณผ ๋™๊ธฐํ™”๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด d.ts ํŒŒ์ผ์„ three ์ €์žฅ์†Œ์— ๋„ฃ๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ทธ๊ฒƒ์€ ์œ ์ง€ ๋ณด์ˆ˜์˜ ๊ฒฐ์ •์— ๋‹ฌ๋ ค ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. TypeScript๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด d.ts ํŒŒ์ผ๋„ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ช‡ ๋…„ ์•ˆ์— TypeScript๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ์ด๋ฒˆ์—๋Š” d.ts ํŒŒ์ผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด์ต์ด ์ ๊ณ  ์ผ์ด ๋งŽ์•„์งˆ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด์ฉŒ๋ฉด ๋‚˜๋Š” ๊ทธ์ € ๋ญ”๊ฐ€๋ฅผ ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชฐ๋ผ

@bhouston d.ts ํŒŒ์ผ์„ @types/three์—์„œ three repo๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๋Ÿฌํ•œ d.ts ํŒŒ์ผ์€ TypeScript ํŒŒ์ผ์—์„œ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ญ์ƒ ๋™๊ธฐํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

TypeScript๋กœ ์ง์ ‘ ์ด๋™ํ•˜๋ฉด *.d.ts ํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ํ˜„์žฌ @types/three ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณ„๋„๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— Three.JS์—์„œ ํ•ญ์ƒ ์•ฝ๊ฐ„ ๊ตฌ์‹์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐœ๋ณ„ ํŒŒ์ผ์ด ์•„๋‹Œ three.js์˜ ๋นŒ๋“œ ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋Ÿฌ๋งํ•˜๋ฏ€๋กœ ํŠธ๋ฆฌ ์‰์ดํ‚น ๋ฐ ๊ธฐํƒ€ ํ˜•ํƒœ์˜ ์ตœ์ ํ™”๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ *.d.ts ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ˜„์žฌ ์ƒํƒœ์—์„œ ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์ง€๋งŒ *.ts ํŒŒ์ผ๋กœ ์ง์ ‘ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋งŒํผ ์ข‹์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

*.ts ํŒŒ์ผ๋กœ ์ง์ ‘ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์ด ๋” ๋‚˜์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ง€์›์ด ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Three.JS๊ฐ€ ์ผ์„ ์ ์ง„์ ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋น…๋ฑ…์ด ์•„๋‹ˆ๋ผ ์ฆ๋ถ„ ์˜ต์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@bhouston ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น…๋ฑ… ์žฌ์ž‘์„ฑ์€ ๋ถˆ๊ฐ€๋Šฅํ•ด์„œ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TypeScript ๋ฌธ์„œ๋ฅผ ์ฝ์œผ๋ฉด ts ๋ฐ js ํŒŒ์ผ์„ ๋‚˜๋ž€ํžˆ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‹จ์ผ ํŒŒ์ผ์„ ts๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐธ์กฐํ•˜์„ธ์š” .

๊ทธ๋Ÿฌ๋‚˜ TypeScript์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ด€๋ฆฌ์ž ์ค‘ ํ•œ ์‚ฌ๋žŒ์ด ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์˜ต์…˜( d.ts ํŒŒ์ผ ๋˜๋Š” ts ๋ฐ js ํŒŒ์ผ ํ˜ผํ•ฉ)์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๊ฐœ์ธ์˜ ์ทจํ–ฅ๊ณผ ์Šคํƒ€์ผ์— ๊ด€ํ•œ ์–ด๋Š ์ •๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@tchoartschi ์ด ๋ฌธ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. @mrdoob ์ด(๊ฐ€) ๋‚˜๋ž€ํžˆ *.d.ts ํŒŒ์ผ์„ ์Šน์ธํ–ˆ์Šต๋‹ˆ๋‹ค. TypeScript๋ฅผ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ฆ‰์‹œ ๊ฐ•์š”ํ•˜์ง€ ์•Š๊ณ  *.t ๋‹จ๊ณ„ ๋™์•ˆ ๋ชจ๋“  ๊ธฐ์—ฌ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ฒ ํšŒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ๊ธฐ์— ๊ฐ€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ *.js ํŒŒ์ผ์„ *.ts ํŒŒ์ผ๋กœ ์ ์ง„์ ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ๋ณ‘๋ ฌ *.d.ts ํŒŒ์ผ๊ณผ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋ณ‘๋ ฌ *.d.ts ํŒŒ์ผ์€ ์ •๋ง ์ข‹์€ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ด๋ฉฐ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” "์™„๋ฒฝํ•จ"์ด ์ ์ง„์ ์ธ ๋ฐœ์ „์„ ๊ฐ€๋กœ๋ง‰๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@bhouston ๋ฉ‹์ ธ์š” ๐Ÿ˜Ž ์ €๋„ ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์‹œ์ž‘ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๋‚ด๊ฐ€ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ๋Š” @types/three ์˜ ์œ ์ง€ ๊ด€๋ฆฌ์ž์™€ ์ด์•ผ๊ธฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Three.js ์ž‘์—… ๊ณต๊ฐ„์—์„œ Slack ์ฑ„๋„์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋‚˜์š”? ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋” ๋นจ๋ฆฌ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์ฑ„ํŒ…๊ณผ ๊ฐ™์€ ๋Œ€ํ™”๋กœ ์ด ๋ฌธ์ œ๋ฅผ ๋”๋Ÿฝํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  @mrdoob์ด ์ž์‹ ์˜ ๊ด€์ ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๊นŒ์ง€ ๊ฒ ์Šต๋‹ˆ๋‹ค . ๊ทธ๊ฐ€ TypeScript์— ๋ฐ˜๋Œ€ํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@mrdoob์—์„œ ์ถ•๋ณต์„ ๋ฐ›์œผ๋ฉด ํฌํŠธ์— ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ TypeScript๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ €๋Š” JavaScript ES6์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

.js๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ src์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด TypeScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ”„๋กœ์ ํŠธ์— ๋” ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/blob/dev/examples/webgl2_sandbox.html#L37 -L48

*.d.ts ํŒŒ์ผ์„ ๋‚˜๋ž€ํžˆ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํŒŒ์ผ์„ ์†Œ์œ ํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์‚ฌ๋žŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@mrdoob ๋ธŒ๋ผ์šฐ์ €๊ฐ€ TypeScript๋ฅผ ์ง€์›ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TypeScript๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ณต๊ธ‰์—…์ฒด์˜ ์–ด๋–ค ์˜๋„๋„ ๋“ฃ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ํŠนํžˆ ์˜ˆ์—์„œ ๋‹น์‹ ์˜ ์šฐ๋ ค๋ฅผ ๋ด…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒˆ๋กœ์šด ์˜ˆ๋ฅผ ๋ณด์ง€ ์•Š์•˜๋‹ค. ์˜ˆ์ œ์—์„œ ์†Œ์Šค ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ •๋ง ๋ฉ‹์ง„ ์ผ์ž…๋‹ˆ๋‹ค.

TypeScript์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  src์—์„œ JavaScript๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ„์† ์œ ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ์†”๋ฃจ์…˜์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  TypeScript ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ํ•ด๋‹น JavaScript ํŒŒ์ผ์„ ๋‚˜๋ž€ํžˆ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ(TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํ‘œ์ค€ ์„ค์ •์ž„) ์ด๋Š” ์ฝ”๋“œ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋“ฑ์„ ๋ณต์žกํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋” ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

three/
โ”œโ”€โ”€ src/
    โ”œโ”€โ”€ cameras
        โ”œโ”€โ”€ PerspectiveCamera.ts // authored code
        โ”œโ”€โ”€ PerspectiveCamera.js // generated code by TS compiler

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” dist , build ๋˜๋Š” bin ํด๋” ์–ด๋”˜๊ฐ€์— ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์กฐ๊ธˆ ์–ด์ƒ‰ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์˜๊ฒฌ์ผ ๋ฟ์ด๋ฉฐ ํ™•์‹คํ•œ ์‚ฌ์‹ค์€ ์•„๋‹™๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„ ์•Œ๊ณ  ์žˆ๋Š” TypeScript ๊ดด์งœ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ต์…˜์€ @bhouston์ด ์ œ์•ˆํ•œ d.ts ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @mrdoob์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด d.ts ํŒŒ์ผ์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์žฅ๊ธฐ์ ์ธ ๊ด€์ ์—์„œ. ๋‹ค์Œ ๋ช‡ ๋…„ ๋™์•ˆ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”? d.ts ํŒŒ์ผ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ•ญ์ƒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ๊ด€์—ฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ณด์žฅํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ์ผํšŒ์„ฑ ์Šฌ๋กฏ์„ ์ฐจ๋‹จํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ง€์†์ ์œผ๋กœ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. @types/three ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€์ง€ ์•„๋‹ˆ๋ฉด three ํ”„๋กœ์ ํŠธ์— ์ง์ ‘ d.ts ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€์ง€ ์•„์ง ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @types/three ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ฏธ ์ž‘๋™ ์ค‘์ด๋ฉฐ d.ts ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ๋™์ผํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ๊ณผ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์‹  ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ ๊ฒฐ๋ก ์€ ์ค‘๊ธฐ์ ์œผ๋กœ Three.js์˜ TypeScript๊ฐ€ ๊ทธ๋‹ค์ง€ ์ข‹์•„ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ TypeScript ์ฑ„ํƒ์„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ์ €์—๊ฒŒ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ œ์•ˆ:
Phaser ๊ฒŒ์ž„ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ์ •์˜๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ•จ์ˆ˜ ์œ„์— /** ์ฃผ์„ */์„ ์ถ”๊ฐ€ํ•˜์—ฌ TS ์ •์˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Phaser ๊ฒŒ์ž„ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ์ •์˜๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค...

https://github.com/mrdoob/three.js/issues/11550 ๋ฐ https://github.com/mrdoob/three.js/issues/4725#issuecomment -41833647์„ ์ฐธ์กฐ ํ•˜์„ธ์š” .

ํ•˜์ง€๋งŒ *.d.ts ํŒŒ์ผ์˜ ์ฃผ์„์—์„œ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค”

*.d.ts ํŒŒ์ผ์„ ๋‚˜๋ž€ํžˆ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํŒŒ์ผ์„ ์†Œ์œ ํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์‚ฌ๋žŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์†Œ์Šค์— ๋Œ€ํ•ด ํƒ€์ดํ•‘์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ๊ฒฐ๊ตญ TypeScript์—์„œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ๊ณ„ํš์ด ์—†๋‹ค๋ฉด ํƒ€์ดํ•‘์„ ์ €์žฅ์†Œ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ํ˜„์žฌ ์œ ์ง€ ๊ด€๋ฆฌ์ž๋Š” TypeScript ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค https://github.com/semleti/three.ts
์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‚ดํŽด๋ณด๊ณ  v100์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
TypeScript์—์„œ Three.js๊ฐ€ ์žฌ์ž‘์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ๊ฑฐ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์œ ํ˜•์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋” ์ข‹์€์ง€ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์€ ํ•œ... ๊ทธ๋ฆฌ๊ณ  ์–ธ์–ด์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋ฅผ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์˜ ํ‘œ์ค€์ด ์•„๋‹™๋‹ˆ๋‹ค.

@schoening ์ด ํ† ๋ก ์„ ์‹œ์ž‘ํ•œ ์ด์œ ๋Š” Three.js์˜ ๊ฐœ๋… ์ฆ๋ช… TypeScript ๋ฒ„์ „์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งํฌํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค (https://github.com/flyover/three.ts, https://github.com/mrdoob/three.js/issues/11552#issuecomment-367026821). . ๋ถ„๊ธฐ๋œ Three.ts ๋ฒ„์ „์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ์ผ๋ถ€ ๋ฒ„์ „ ๋’ค์— ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์€ "ํ•ต์‹ฌ" ํŒ€์—์„œ ์œ ์ง€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Three.js ํ”„๋กœ์ ํŠธ๊ฐ€ TypeScript๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด @types/three ํ”„๋กœ์ ํŠธ๊ฐ€ ๋™๊ธฐํ™” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ณณ์—์„œ ํž˜์„ ๋ชจ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Three.js๊ฐ€ ๋จผ ๋ฏธ๋ž˜์˜ ์–ด๋Š ์‹œ์ ์—์„œ TypeScript๋ฅผ ์ง€์›ํ•  ์˜ˆ์ •์ด๋ผ๋ฉด ๊ทธ๋Ÿฌํ•œ ์ „ํ™˜์ด ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @donmccurdy๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋” ๋‚˜์€ TypeScript ํ˜ธํ™˜์„ฑ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. JSDoc์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. JSDoc ์ฃผ์„๋ณด๋‹ค ํŒŒ์ผ์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— *.d.ts ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋Š” ์•„์ง ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ *.d.ts ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์†Œ์Šค์— ๋Œ€ํ•ด ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @bhouston ์€ ๊ทธ์˜ ์ ‘๊ทผ ๋ฐฉ์‹, ํŠนํžˆ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์šฐ๋ ค๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ˜„๋ช…ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ข‹์€ ๊ฒฝํ—˜์€ vscode + d.ts + JSDoc์ด๋ฉฐ ๋ชจ๋‘ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์— ์žˆ์œผ๋ฏ€๋กœ ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  vscode ๋ฒ„์ „์€ d.ts ์—์„œ ๋ณ‘ํ•ฉ๋œ ์„ ์–ธ๊ณผ JSDoc์˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•˜๋Š” TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์ธ checkJs ์ง€์›์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค( tsconfig.json ์—์„œ ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ). JSDoc ๊ตฌ๋ฌธ์—์„œ ๋ณด๊ธฐ ํ‰ํ•œ "๊ณ ๊ธ‰" ์œ ํ˜•์˜ ๊ฒฝ์šฐ.

vscode๋Š” ๋ชจ๋“  ์œ ํ˜•์„ ํŒŒ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ์œ ํ˜•์˜ ์˜ค๋ฅ˜๋„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฆฌํŒฉํ† ๋ง์ด ์™„๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค d.ts ์—์„œ "๋ฒ„๊ทธ/์ด์ „" ์œ ํ˜•์„ ์‰ฝ๊ฒŒ ๋ณด๊ณ  ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณ„์† ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. .

TypeScript์˜ ๊ฐ€์žฅ ๋‚˜์œ ์ ์€ ์ถ”๊ฐ€ ํŠธ๋žœ์ŠคํŒŒ์ผ ๋‹จ๊ณ„๋กœ, ๋ชจ๋“  ๋‹จ์ผ ์ฝ”๋“œ ๋ณ€๊ฒฝ์— ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ปจ๋Œ€, vscode์˜ JSDoc + d.ts ๋Š” ์œ ํ˜•์˜ ๋ชจ๋“  ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์ถ”๊ฐ€๋กœ ๋Š๋ฆฐ ํŠธ๋žœ์ŠคํŒŒ์ผ ๋‹จ๊ณ„์˜ ๋‹จ์ ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ๋ชจ๋“  ๊ฒƒ์— 100% ์ ์ ˆํ•œ JSDoc ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ vscode๊ฐ€ ์ด์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( @constructor , <strong i="16">@enum</strong> {number} , <strong i="18">@param</strong> {number} n Number of steps )

๋‚˜๋Š” ๋˜ํ•œ @bhouston ๊ณผ @LuWangThreekit ์ด *.d.ts ํŒŒ์ผ์— ๋Œ€ํ•œ PR์„ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://github.com/mrdoob/three.js/issues/11552#issuecomment -454881060 ๋ฐ/๋˜๋Š” PR https://github.com/mrdoob/three.js/pull/์—์„œ ํ™•์ธํ•˜์„ธ์š”. 15597

์ฐธ๊ณ : ๋ธŒ๋ผ์šฐ์ €์˜ TypeScript๋Š” Deno (GitHub์—์„œ 32,000๊ฐœ์˜ ๋ณ„์„ ๊ฐ€์ง„ Rust์™€ V8 ๊ธฐ๋ฐ˜ TypeScript ์ธํ„ฐํ”„๋ฆฌํ„ฐ)๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜๋ฉด ๊ทธ๋ฆฌ ๋ฉ€์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”์–ด ๋ฐ ์˜ˆ์ œ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์œ ํ˜• ์„ ์–ธ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ๋ฌธ์ œ๋ฅผ ๋‹ซ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. TS ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์€ ํ™•์‹คํžˆ ์ž‘๋…„๋ณด๋‹ค ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TypeScript์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•ด...

@bhouston ์ด ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์ด Three.js์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์ด ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://threeify.org/

@bhouston ์˜ Threeify ๋Š” ํ›Œ๋ฅญํ•œ ํ”„๋กœ์ ํŠธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿคฉ SemVer๊ฐ€ ์žˆ๊ณ  ์˜๋ฏธ๋ก ์  ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. TypeScript ์œ„์— ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ ํ•ต์‹ฌ ๊ฐ€์น˜๋Š” Tree Shaking, Small Build Files ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Three.js์—์„œ๋„ ๋ณด๊ณ  ์‹ถ์–ดํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” Threeify์— ๋“ค์–ด๊ฐ€๋Š” ์ž‘์—…์„ ์ •๋ง ์†Œ์ค‘ํ•˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค๐Ÿ‘

@bhouston @mrdoob ํ•˜์ง€๋งŒ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ •๋ง ํ•„์š”ํ•œ๊ฐ€์š”? ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋งŽ์€ ๋Œ€ํ˜• ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ฝ”๋“œ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ํฌํฌ ์—†์ด SemVer, TypeScript, Tree Shaking ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@pailhead ๊ฐ€ Three.js๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค: ๋‹ค๋ฅธ three.js ๋ฒ„์ „์œผ๋กœ ์ž‘์—…ํ•˜๊ธฐ . ๊ทธ๋ž˜์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ์— Threeify ๊ฐ€ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ๋“ค์„ ์ฑ„ํƒํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ํž˜์„ ํ•ฉ์ณ Three.js๋ฅผ ๊ฐœ์„ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

์ธํ„ฐ๋„ท์˜ ๋งŽ์€ ๊ธฐ์‚ฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Pailhead์˜ ๊ธฐ์‚ฌ๋Š” ํŽธํ–ฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‹ค๋ฅธ ์šฉ๋„๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„œ๋กœ์˜ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ์œ ํ˜•์˜ js ๊ฐœ๋ฐœ์ž๋ฅผ ์ˆ˜์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” @pailhead ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฒฝํ—˜์„ Vue , Ember , React , Svelte , Angular ์™€ ๊ฐ™์€ ์ตœ์‹  ํ”„๋ก ํŠธ ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งค์šฐ ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

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

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ด๋ฏธ Three.ts์™€ Threeify๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ ์•„๋งˆ๋„ ๋” ๋งŽ์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌํฌ์™€ ๋ณ„๋„์˜ ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ํ•จ๊ป˜ ์ž‘์—…ํ•œ๋‹ค๋ฉด ์ „์ฒด Three.js ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์—„์ฒญ๋‚œ ์ด์ ์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ง„์‹ฌ์œผ๋กœ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

@mrdoob , ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•œ ์„ค๋ฌธ์กฐ์‚ฌ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? typescript์˜ ์‚ฌ์šฉ์€ ํ•œ ๊ฐ€์ง€์ด๋ฉฐ ์ถ”์ •์น˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์งˆ์  ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

@roomle-build ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ TypeScript๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ์˜ ๋‹จ์ ์„ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— TypeScript๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ฑ„ํƒํ•  ๋•Œ์˜ ์‹ค์งˆ์ ์ธ ๋‹จ์ ์€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ ๋งŽ์€ ์ด์ ์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋งŽ์€ ํ”„๋กœ์ ํŠธ๊ฐ€ TypeScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฌผ๋ก  ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋น„ TS ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ด๋–ป๊ฒŒ ์ข‹์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๋นŒ๋“œ ๋‹จ๊ณ„๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋“ค

๊ทธ๋Ÿฌ๋‚˜ ์ด์ „์— ๋งํ–ˆ๋“ฏ์ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์„ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Vue ๋˜๋Š” Ember ).

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ง€์ ํ•˜๊ณ  ์‹ถ์€ ์ฃผ์š” ๋‚ด์šฉ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ถ„์—ด๋˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ํฌํฌ์˜ ํฌํฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ„ํ—˜ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŒŒํŽธํ™”์˜ ํŒฌ์ด ์•„๋‹ˆ๋ฉฐ ์„œ๋กœ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ•จ๊ป˜ ์ผํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ฒฝ์Ÿ์ด ๋Œ€๋‹จํ•˜๊ณ  ์ด๊ฒƒ์ด Three.js ํ”„๋กœ์ ํŠธ์—์„œ๋„ ํ˜์‹ ์„ ๋ฒˆ์ฐฝํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ์žˆ์ง€๋งŒ ์ €๋Š” ํ˜‘์—…์„ ๋” ๋ฏฟ์Šต๋‹ˆ๋‹ค ๐Ÿ™‚

three.js ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์ ‘๊ทผ์„ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @roomle-build๊ฐ€ ๋‚˜์—ดํ•œ ์š”์ ์€ ์—”์ง„์˜ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํŠนํžˆ ์ดˆ๋ณด์ž์˜ ๊ฒฝ์šฐ). ๋Œ€์ฒด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š” ํ•œ JavaScript๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŒŒํŽธํ™”์˜ ํŒฌ์ด ์•„๋‹ˆ๋ฉฐ ์„œ๋กœ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ•จ๊ป˜ ์ผํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์›น์— 3D ์—”์ง„์ด ๋” ๋งŽ๋‹ค๊ณ  ํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„œ๋กœ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

three.js ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์ ‘๊ทผ์„ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @roomle-build๊ฐ€ ๋‚˜์—ดํ•œ ์š”์ ์€ ์—”์ง„์˜ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํŠนํžˆ ์ดˆ๋ณด์ž์˜ ๊ฒฝ์šฐ).

๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์ ‘๊ทผ์„ฑ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  TypeScript์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ €๋Š” ์ด ๋ฐฉ๋ฒ•์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „์— Vue์™€ Ember๋ฅผ ์˜ˆ๋กœ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. TypeScript์— ๋Œ€ํ•œ ์ž…์žฅ์„ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ๊นŒ์š”? ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๊ณต์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ณต์‚ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๋ช…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ TypeScript๋Š” IDE๊ฐ€ ์ „์ฒด ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ์š”๋ฅผ ๋” ๋นจ๋ฆฌ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์—ฌ์ž๊ฐ€ three.js ๋” ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์ฒด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š” ํ•œ JavaScript๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์šฐ๋ฆฌ์˜ ์ž…์žฅ์„ ๋ถ„๋ช…ํžˆ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

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