๐Ÿš€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต ๋Œ€์ž‘์ „! ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต ๋Œ€์ž‘์ „! ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋•ํ›„ ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ๊นŠ~์€ ๋Œ€ํ™”์˜ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋ ค๊ณ  ํ•ด์š”. ๋ฐ”๋กœ "ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต"์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด๊ฑฐ ์ง„์งœ ๋Œ€๋ฐ• ์ฃผ์ œ ์•„๋‹ˆ์—์š”? ใ…‹ใ…‹ใ…‹

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ ํ•  ๋•Œ๋งˆ๋‹ค ์ปดํ“จํ„ฐ๊ฐ€ ๋™๋™๋Œ€๋Š” ์†Œ๋ฆฌ ๋“ค์–ด๋ณด์…จ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์ปคํ”ผ ํ•œ ์ž” ๋งˆ์‹œ๊ณ  ์˜ฌ ์ •๋„๋กœ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๋นŒ๋“œ ์‹œ๊ฐ„ ๋•Œ๋ฌธ์— ์ŠคํŠธ๋ ˆ์Šค ๋ฐ›์•„๋ณด์‹  ์  ์žˆ์œผ์‹ ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๊ธ€์€ ์—ฌ๋Ÿฌ๋ถ„์„ ์œ„ํ•œ ๊ฑฐ์˜ˆ์š”! ๐Ÿ‘€

์šฐ๋ฆฌ๋Š” ์ด ๊ธ€์„ ํ†ตํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ F1 ๋ ˆ์ด์‹ฑ์นด๋ฅผ ํŠœ๋‹ํ•˜๋“ฏ์ด, ์šฐ๋ฆฌ์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋„ ์ฅ์–ด์งœ์„œ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ๋ฝ‘์•„๋‚ผ ๊ฑฐ๋ผ๊ตฌ์š”! ๐ŸŽ๏ธ๐Ÿ’จ

๊ทธ๋ฆฌ๊ณ  ์ž ๊น! ์ด ๊ธ€์€ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์˜ '์ง€์‹์ธ์˜ ์ˆฒ' ๋ฉ”๋‰ด์— ๋“ฑ๋ก๋  ์˜ˆ์ •์ด์—์š”. ์žฌ๋Šฅ๋„ท์€ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•˜๋Š” ํ”Œ๋žซํผ์ธ๋ฐ, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ๋„ ์ถฉ๋ถ„ํžˆ ์žฌ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ์–ด์ฉŒ๋ฉด ์ด ๊ธ€์„ ์ฝ๊ณ  ๋‚œ ํ›„์—๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€๋กœ ๋ณ€์‹ ํ•ด์„œ ์žฌ๋Šฅ๋„ท์—์„œ ๋Œ€๋ฐ• ๋‚ ์ง€๋„ ๋ชจ๋ฅด๊ฒ ์–ด์š”! ใ…Žใ…Ž

์ž, ์ด์ œ ์ •๋ง ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์„ธ๊ณ„๋กœ ํ’๋ฉ~ ๋น ์ ธ๋ด…์‹œ๋‹ค! ๐ŸŠโ€โ™‚๏ธ

๐Ÿง  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ, ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ๊ฑธ๊นŒ์š”?

์šฐ์„ , ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ์ตœ์ ํ™”๋„ ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ๊ทธ๋ž˜์„œ ๋จผ์ € ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ž‘๋™ ์›๋ฆฌ๋ถ€ํ„ฐ ์‚ดํŽด๋ณผ๊ฒŒ์š”!

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์š”:

  • 1๏ธโƒฃ ํŒŒ์‹ฑ (Parsing)
  • 2๏ธโƒฃ ๋ฐ”์ธ๋”ฉ (Binding)
  • 3๏ธโƒฃ ํƒ€์ž… ์ฒดํ‚น (Type Checking)
  • 4๏ธโƒฃ ๋ณ€ํ™˜ (Transformation)
  • 5๏ธโƒฃ ์ถœ๋ ฅ ์ƒ์„ฑ (Emitting)

์ด ๊ณผ์ •์„ ์ข€ ๋” ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณผ๊นŒ์š”? ๐Ÿ•ต๏ธโ€โ™€๏ธ

1. ํŒŒ์‹ฑ (Parsing) ๋‹จ๊ณ„

์ด ๋‹จ๊ณ„์—์„œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋“ค์—ฌ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(AST, Abstract Syntax Tree)๋กœ ๋ณ€ํ™˜ํ•ด์š”. AST๋Š” ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด์—์š”. ๋งˆ์น˜ ๋ฌธ์žฅ์„ ์ฃผ์–ด, ๋™์‚ฌ, ๋ชฉ์ ์–ด๋กœ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๋Š” ๊ฑฐ์ฃ .

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณผ๊ฒŒ์š”:


const greeting: string = "Hello, TypeScript!";
console.log(greeting);

์ด ์ฝ”๋“œ๋Š” ๋Œ€๋žต ์ด๋Ÿฐ ์‹์˜ AST๋กœ ๋ณ€ํ™˜๋ผ์š”:

Abstract Syntax Tree Example Program VariableDeclaration ExpressionStatement Identifier "greeting" StringLiteral "Hello, TypeScript!" CallExpression MemberExpression Identifier "greeting"

์ด๋Ÿฐ ์‹์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๊ตฌ์กฐํ™”๋˜๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์–ด์š”.

2. ๋ฐ”์ธ๋”ฉ (Binding) ๋‹จ๊ณ„

๋ฐ”์ธ๋”ฉ ๋‹จ๊ณ„์—์„œ๋Š” AST๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ฌ๋ณผ(Symbol)์„ ์ƒ์„ฑํ•˜๊ณ , ์ด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ด์š”. ์‹ฌ๋ณผ์ด๋ž€ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ข… ์‹๋ณ„์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์˜ˆ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ์ฝ”๋“œ์—์„œ 'greeting'์ด๋ผ๋Š” ๋ณ€์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์‹ฌ๋ณผ์ด ๋˜๊ณ , 'console.log'๋„ ํ•˜๋‚˜์˜ ์‹ฌ๋ณผ์ด ๋ผ์š”. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ด๋Ÿฐ ์‹ฌ๋ณผ๋“ค์ด ์–ด๋””์„œ ์„ ์–ธ๋˜๊ณ  ์–ด๋””์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํŒŒ์•…ํ•ด์š”.

์ด ๊ณผ์ •์€ ๋งˆ์น˜ ํผ์ฆ ์กฐ๊ฐ์„ ๋งž์ถ”๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ๊ฐ ์กฐ๊ฐ(์‹ฌ๋ณผ)์ด ์–ด๋””์— ๋งž๋Š”์ง€(์–ด๋””์„œ ์„ ์–ธ๋˜๊ณ  ์‚ฌ์šฉ๋˜๋Š”์ง€) ์ฐพ์•„๋‚ด๋Š” ๊ฑฐ์ฃ . ๐Ÿงฉ

3. ํƒ€์ž… ์ฒดํ‚น (Type Checking) ๋‹จ๊ณ„

์ด์ œ ์ง„์งœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ฝƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ์ฒดํ‚น ๋‹จ๊ณ„์˜ˆ์š”! ๐ŸŒธ

์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ฐ”์ธ๋”ฉ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋œ ์‹ฌ๋ณผ๋“ค์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•ด์š”. ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๊ฐ’์ด ์„ ์–ธ๋œ ํƒ€์ž…๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ธ์ž์˜ ํƒ€์ž…์ด ๋งž๋Š”์ง€ ๋“ฑ์„ ํ™•์ธํ•˜์ฃ .

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ ์ฝ”๋“œ์—์„œ๋Š” 'greeting'์ด string ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ ๋ฌธ์ž์—ด์ด ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์š”. ๋งŒ์•ฝ ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด:


const greeting: string = 42; // ์˜ค๋ฅ˜!

ํƒ€์ž… ์ฒด์ปค๋Š” "์ž ๊น๋งŒ์š”! string ํƒ€์ž…์— number๋ฅผ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜์‹œ๋„ค์š”? ๊ทธ๊ฑด ์•ˆ ๋ผ์š”!"๋ผ๊ณ  ๋งํ•˜๊ฒ ์ฃ . ๐Ÿ˜…

์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์—„๊ฒฉํ•œ ๊ฒฝ๋น„์›์ด ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์‹ ๋ถ„์ฆ์„ ๊ผผ๊ผผํžˆ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ํƒ€์ž…์ด ๋งž์ง€ ์•Š์œผ๋ฉด ์ถœ์ž…์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฑฐ์ฃ ! ๐Ÿšซ

4. ๋ณ€ํ™˜ (Transformation) ๋‹จ๊ณ„

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

์šฐ๋ฆฌ์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜๋  ๊ฑฐ์˜ˆ์š”:


const greeting = "Hello, TypeScript!";
console.log(greeting);

๋ณด์ด์‹œ๋‚˜์š”? ํƒ€์ž… ์ •๋ณด(:string)๊ฐ€ ์‚ฌ๋ผ์กŒ์–ด์š”! ์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์š”๋ฆฌ์‚ฌ๊ฐ€ ์Œ์‹์„ ํ”Œ๋ ˆ์ดํŒ… ํ•˜๊ธฐ ์ „์— ๋ถˆํ•„์š”ํ•œ ์žฌ๋ฃŒ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ๐Ÿฝ๏ธ

5. ์ถœ๋ ฅ ์ƒ์„ฑ (Emitting) ๋‹จ๊ณ„

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ณ€ํ™˜๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํŒŒ์ผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋‹จ๊ณ„์˜ˆ์š”. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ณ€ํ™˜๋œ ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์†Œ์Šค๋งต(source map)์ด๋ผ๋Š” ๊ฒƒ๋„ ํ•จ๊ป˜ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”.

์†Œ์Šค๋งต์€ ๋ญ๋ƒ๊ณ ์š”? ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ๋ณ€ํ™˜๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์™€ ์›๋ณธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋Š” ํŒŒ์ผ์ด์—์š”. ์ด๊ฒŒ ์žˆ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋””๋ฒ„๊น…ํ•  ๋•Œ ์›๋ณธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์—„์ฒญ ํŽธ๋ฆฌํ•˜๋‹ต๋‹ˆ๋‹ค! ๐Ÿ‘€

์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์š”๋ฆฌ๊ฐ€ ์™„์„ฑ๋˜์–ด ์†๋‹˜์—๊ฒŒ ์„œ๋น™๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋ชจ๋“  ์ค€๋น„ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋“œ๋””์–ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ ํƒ„์ƒํ•˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿฐ

์ž, ์ด๋ ‡๊ฒŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋™์ž‘ ๊ณผ์ •์„ ์‚ดํŽด๋ดค์–ด์š”. ์ดํ•ด๊ฐ€ ๋˜์…จ๋‚˜์š”? ์ด ๊ณผ์ •์„ ์•Œ๋ฉด ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ฐ์ด ์˜ค์‹ค ๊ฑฐ์˜ˆ์š”.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต๋“ค์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜†

๊ทธ๋ฆฌ๊ณ  ์ž ๊น! ์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์ด๋Ÿฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์‹์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๋‚˜๋ˆ„๊ณ  ์‹ถ์ง€ ์•Š์œผ์„ธ์š”? ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์„ ๊ณต์œ ํ•˜๊ณ  ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€๋กœ ๋ณ€์‹ ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ง€์‹์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒ ์ •๋ง ๊ฐ’์ง„ ์žฌ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ˜‰

๐Ÿš€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ „๋žต๋“ค์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ด‘์†์œผ๋กœ ๋นŒ๋“œ๋˜๋Š” ๊ทธ๋‚ ๊นŒ์ง€! ๐Ÿ’ซ

1. tsconfig.json ์ตœ์ ํ™”ํ•˜๊ธฐ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ์˜ ์‹ฌ์žฅ, ๋ฐ”๋กœ tsconfig.json ํŒŒ์ผ์ด์—์š”. ์ด ํŒŒ์ผ์„ ์ž˜ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ปดํŒŒ์ผ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

์ฃผ์š” ์˜ต์…˜๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • incremental: true๋กœ ์„ค์ •ํ•˜๋ฉด ์ด์ „ ์ปดํŒŒ์ผ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋‘๊ณ , ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋งŒ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์š”. ์—„์ฒญ๋‚œ ์‹œ๊ฐ„ ์ ˆ์•ฝ!
  • skipLibCheck: true๋กœ ์„ค์ •ํ•˜๋ฉด ์„ ์–ธ ํŒŒ์ผ(.d.ts)์˜ ํƒ€์ž… ์ฒดํฌ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด์š”. ํŠนํžˆ node_modules์˜ ํƒ€์ž… ์ฒดํฌ๋ฅผ ์Šคํ‚ตํ•ด์„œ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œ์ผœ์š”.
  • esModuleInterop: true๋กœ ์„ค์ •ํ•˜๋ฉด CommonJS ๋ชจ๋“ˆ์„ ๋” ์‰ฝ๊ฒŒ importํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด ์˜ต์…˜์€ ์„ฑ๋Šฅ๋ณด๋‹ค๋Š” ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•œ ๊ฑฐ์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๊ฐ„์ ‘์ ์œผ๋กœ ์„ฑ๋Šฅ์— ๋„์›€์„ ์ค˜์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”:


{
  "compilerOptions": {
    "incremental": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    // ๊ธฐํƒ€ ์˜ต์…˜๋“ค...
  }
}

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "์™€! ์ด์ œ ์ข€ ์ˆจ์‰ฌ๊ธฐ๊ฐ€ ํŽธํ•ด์กŒ๋„ค~" ํ•˜๊ณ  ์ข‹์•„ํ•  ๊ฑฐ์˜ˆ์š”. ใ…‹ใ…‹ใ…‹ ๐Ÿ˜Œ

2. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ตœ์ ํ™”ํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋„ ์ปดํŒŒ์ผ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์ณ์š”. ํŠนํžˆ ํฐ ํ”„๋กœ์ ํŠธ์ผ์ˆ˜๋ก ๋”์šฑ ์ค‘์š”ํ•ด์ง€์ฃ .

๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆด๊ฒŒ์š”:

  • ๋ชจ๋“ˆ ๋ถ„๋ฆฌ: ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ„์„ธ์š”. ๊ฐ ๋ชจ๋“ˆ์€ ์ž์ฒด์ ์ธ tsconfig.json์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ฐฐ๋Ÿด(Barrel) ํŒŒ์ผ ์‚ฌ์šฉ: index.ts ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด exportํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด import ๋ฌธ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ .
  • circular dependencies ํ”ผํ•˜๊ธฐ: ์ˆœํ™˜ ์ฐธ์กฐ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค์–ด์š”. ๊ฐ€๋Šฅํ•œ ํ•œ ํ”ผํ•˜๋Š” ๊ฒŒ ์ข‹์•„์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์–ด์š”:


project/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ module1/
โ”‚   โ”‚   โ”œโ”€โ”€ index.ts
โ”‚   โ”‚   โ”œโ”€โ”€ component1.ts
โ”‚   โ”‚   โ””โ”€โ”€ component2.ts
โ”‚   โ”œโ”€โ”€ module2/
โ”‚   โ”‚   โ”œโ”€โ”€ index.ts
โ”‚   โ”‚   โ”œโ”€โ”€ component3.ts
โ”‚   โ”‚   โ””โ”€โ”€ component4.ts
โ”‚   โ””โ”€โ”€ index.ts
โ”œโ”€โ”€ tsconfig.json
โ””โ”€โ”€ package.json

์ด๋ ‡๊ฒŒ ๊ตฌ์กฐ๋ฅผ ์žก์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "์˜ค~ ๊น”๋”ํ•˜๋‹ค!" ํ•˜๋ฉด์„œ ๊ธฐ๋ถ„ ์ข‹๊ฒŒ ์ผํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜Ž

3. ํƒ€์ž… ์„ ์–ธ ์ตœ์ ํ™”ํ•˜๊ธฐ

ํƒ€์ž… ์„ ์–ธ๋„ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ๋ณต์žกํ•œ ํƒ€์ž…์€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ค์ฃ .

๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆด๊ฒŒ์š”:

  • union ํƒ€์ž… ๋Œ€์‹  enum ์‚ฌ์šฉํ•˜๊ธฐ: ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ union ํƒ€์ž… ๋Œ€์‹  enum์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ ์ค„์ด๊ธฐ: ์ œ๋„ค๋ฆญ์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์–ด์š”. ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€์‹  ํƒ€์ž… ๋ณ„์นญ ์‚ฌ์šฉํ•˜๊ธฐ: ๋ณต์žกํ•œ ํƒ€์ž…์˜ ๊ฒฝ์šฐ, ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค ํƒ€์ž… ๋ณ„์นญ์ด ๋” ์„ฑ๋Šฅ์ด ์ข‹์„ ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”:


// Before
type Color = 'red' | 'green' | 'blue';

// After
enum Color {
  Red = 'red',
  Green = 'green',
  Blue = 'blue'
}

// Before
interface ComplexType {
  prop1: string;
  prop2: number;
  prop3: boolean;
}

// After
type ComplexType = {
  prop1: string;
  prop2: number;
  prop3: boolean;
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "์™€~ ์ด์ œ ์ข€ ํŽธํ•˜๊ฒŒ ์ผํ•  ์ˆ˜ ์žˆ๊ฒ ์–ด!" ํ•˜๊ณ  ์ข‹์•„ํ•  ๊ฑฐ์˜ˆ์š”. ใ…‹ใ…‹ใ…‹ ๐Ÿ˜„

4. ํƒ€์ž… ์ถ”๋ก  ํ™œ์šฉํ•˜๊ธฐ

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

๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆด๊ฒŒ์š”:

  • ๋ช…์‹œ์  ํƒ€์ž… ์„ ์–ธ ์ค„์ด๊ธฐ: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ตณ์ด ํƒ€์ž…์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋ผ์š”.
  • const assertions ์‚ฌ์šฉํ•˜๊ธฐ: ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, const assertions๋ฅผ ์‚ฌ์šฉํ•ด ๋” ์ •ํ™•ํ•œ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ํƒ€์ž… ์ถ”๋ก  ํ™œ์šฉํ•˜๊ธฐ: ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…๋„ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•ด์š”. ๋ณต์žกํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์ ์ง€ ์•Š์•„๋„ ๋ผ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”:


// Before
const numbers: number[] = [1, 2, 3, 4, 5];
const greeting: string = "Hello, TypeScript!";

function add(a: number, b: number): number {
  return a + b;
}

// After
const numbers = [1, 2, 3, 4, 5];
const greeting = "Hello, TypeScript!";

function add(a: number, b: number) {
  return a + b;
}

// const assertions ์‚ฌ์šฉ ์˜ˆ
const config = {
  apiUrl: 'https://api.example.com',
  timeout: 3000
} as const;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "์˜ค~ ์ด์ œ ๋‚ด๊ฐ€ ์•Œ์•„์„œ ํ• ๊ฒŒ!" ํ•˜๋ฉด์„œ ์‹ ๋‚˜ํ•  ๊ฑฐ์˜ˆ์š”. ใ…‹ใ…‹ใ…‹ ๐Ÿ˜†

5. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์ตœ์ ํ™”ํ•˜๊ธฐ

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ด์š”. ํŠนํžˆ ํฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์ฃ .

๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆด๊ฒŒ์š”:

  • ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ importํ•˜๊ธฐ: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์ฒด๋ฅผ importํ•˜์ง€ ๋ง๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ importํ•˜์„ธ์š”.
  • ํƒ€์ž… ์ •์˜ ํŒŒ์ผ (.d.ts) ์‚ฌ์šฉํ•˜๊ธฐ: ๊ฐ€๋Šฅํ•˜๋ฉด ํƒ€์ž… ์ •์˜ ํŒŒ์ผ์ด ์ œ๊ณต๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํƒ€์ž… ์ฒดํฌ๊ฐ€ ๋” ๋นจ๋ผ์ ธ์š”.
  • dynamic import ์‚ฌ์šฉํ•˜๊ธฐ: ํฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ, ํ•„์š”ํ•  ๋•Œ๋งŒ ๋™์ ์œผ๋กœ importํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”:


// Before
import * as lodash from 'lodash';

// After
import { debounce, throttle } from 'lodash';

// ๋˜๋Š” dynamic import ์‚ฌ์šฉ
const loadLodash = async () => {
  const lodash = await import('lodash');
  // lodash ์‚ฌ์šฉ
};

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "์™€~ ์ด์ œ ์ข€ ๊ฐ€๋ฒผ์›Œ์กŒ๋„ค!" ํ•˜๊ณ  ์ข‹์•„ํ•  ๊ฑฐ์˜ˆ์š”. ใ…‹ใ…‹ใ…‹ ๐Ÿ˜Œ

6. ๋ณ‘๋ ฌ ์ปดํŒŒ์ผ ํ™œ์šฉํ•˜๊ธฐ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ 3.7 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๋ณ‘๋ ฌ ์ปดํŒŒ์ผ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์š”. ์ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU์˜ ์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ปดํŒŒ์ผ ์†๋„๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด:

  • ํ”„๋กœ์ ํŠธ ๋ชจ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ: tsconfig.json์— "references" ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์„ธ์š”.
  • --build ๋ชจ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ: tsc --build ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํŒŒ์ผํ•˜์„ธ์š”.
  • composite ์˜ต์…˜ ํ™œ์„ฑํ™”ํ•˜๊ธฐ: ๊ฐ ์„œ๋ธŒ ํ”„๋กœ์ ํŠธ์˜ tsconfig.json์—์„œ "composite": true๋กœ ์„ค์ •ํ•˜์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”:


// root tsconfig.json
{
  "files": [],
  "references": [
    { "path": "./src/frontend" },
    { "path": "./src/backend" }
  ]
}

// src/frontend/tsconfig.json
{
  "compilerOptions": {
    "composite": true,
    // ๊ธฐํƒ€ ์˜ต์…˜๋“ค...
  },
  "include": ["./**/*.ts"]
}

// src/backend/tsconfig.json
{
  "compilerOptions": {
    "composite": true,
    // ๊ธฐํƒ€ ์˜ต์…˜๋“ค...
  },
  "include": ["./**/*.ts"]
}

๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผํ•  ๋•Œ๋Š” ์ด๋ ‡๊ฒŒ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:

tsc --build

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "์™€! ์ด์ œ ์นœ๊ตฌ๋“ค์ด๋ž‘ ๊ฐ™์ด ์ผํ•  ์ˆ˜ ์žˆ์–ด!" ํ•˜๋ฉด์„œ ์‹ ๋‚˜๊ฒŒ ์ผํ•  ๊ฑฐ์˜ˆ์š”. ใ…‹ใ…‹ใ…‹ ๐Ÿš€

7. ํƒ€์ž… ์ฒดํ‚น ์ตœ์ ํ™”ํ•˜๊ธฐ

ํƒ€์ž… ์ฒดํ‚น์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด์ง€๋งŒ, ๋•Œ๋กœ๋Š” ์„ฑ๋Šฅ์— ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ๋ณต์žกํ•œ ํƒ€์ž…์„ ๋‹ค๋ฃฐ ๋•Œ ๊ทธ๋ ‡์ฃ .

๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆด๊ฒŒ์š”:

  • strict ๋ชจ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ: paradoxicalํ•˜๊ฒŒ ๋“ค๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, strict ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ์ •ํ™•ํ•œ ํƒ€์ž… ์ถ”๋ก ์„ ํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์–ด์š”.
  • any ํƒ€์ž… ์ตœ์†Œํ™”ํ•˜๊ธฐ: any ํƒ€์ž…์€ ํƒ€์ž… ์ฒดํ‚น์„ ๊ฑด๋„ˆ๋›ฐ๊ฒŒ ๋งŒ๋“ค์–ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ์–ด์š”. ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํƒ€์ž… ๊ฐ€๋“œ ์‚ฌ์šฉํ•˜๊ธฐ: ๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ํƒ€์ž… ๋Œ€์‹  ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ์‰ฝ๊ฒŒ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”:


// tsconfig.json
{
  "compilerOptions": {
    "strict": true,
    // ๊ธฐํƒ€ ์˜ต์…˜๋“ค...
  }
}

// Before
function processValue(value: any) {
  // value๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง
}

// After
function processValue(value: unknown) {
  if (typeof value === 'string') {
    // string ํƒ€์ž…์œผ๋กœ ์ฒ˜๋ฆฌ
  } else if (typeof value === 'number') {
    // number ํƒ€์ž…์œผ๋กœ ์ฒ˜๋ฆฌ
  } else {
    // ๊ธฐํƒ€ ํƒ€์ž… ์ฒ˜๋ฆฌ
  }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "์™€~ ์ด์ œ ํƒ€์ž…์„ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•„!" ํ•˜๊ณ  ๊ธฐ๋ปํ•  ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜Š

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ 7๊ฐ€์ง€ ์ „๋žต์„ ์•Œ์•„๋ดค์–ด์š”. ์ด ์ „๋žต๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฒˆ๊ฐœ์ฒ˜๋Ÿผ ๋น ๋ฅด๊ฒŒ ์ปดํŒŒ์ผ๋  ๊ฑฐ์˜ˆ์š”! โšก

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”! ์ด๋Ÿฐ ๊ณ ๊ธ‰ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ง€์‹์€ ์ •๋ง ๊ฐ’์ง„ ์žฌ๋Šฅ์ด์—์š”. ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ตœ์ ํ™” ๋…ธํ•˜์šฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๊ฑฐ๋ž˜ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๋ˆ„๊ตฐ๊ฐ€์—๊ฒ ์ •๋ง ํ•„์š”ํ•œ ์ง€์‹์ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ’ก

๋งˆ์ง€๋ง‰์œผ๋กœ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”๋Š” ์ง€์†์ ์ธ ๊ณผ์ •์ด์—์š”. ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ๊ณ„์†ํ•ด์„œ ์ตœ์ ํ™” ์ „๋žต์„ ์ ์šฉํ•˜๊ณ  ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€์•ผ ํ•ด์š”. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์ด ๊ธ€์—์„œ ๋ฐฐ์šด ์ „๋žต๋“ค์„ ๊ธฐ์–ตํ•˜๊ณ  ์ ์šฉํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๋‹ฌ์ธ์ด ๋˜์–ด ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ‘จโ€๐Ÿ”ง๐Ÿ‘ฉโ€๐Ÿ”ง

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‚ ๊ฐœ๋‹ฌ์•„ ๋‚ ๋ ค๋ณด๋‚ด์„ธ์š”! ํ™”์ดํŒ…! ๐Ÿš€๐ŸŒŸ