๐ ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ ์ฑ๋ฅ ์ต์ ํ ์ ๋ต ๋์์ ! ๐

์๋ ํ์ธ์, ํ์ ์คํฌ๋ฆฝํธ ๋ํ ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ๊น~์ ๋ํ์ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋ ค๊ณ ํด์. ๋ฐ๋ก "ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ ์ฑ๋ฅ ์ต์ ํ ์ ๋ต"์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ์ด๊ฑฐ ์ง์ง ๋๋ฐ ์ฃผ์ ์๋์์? ใ ใ ใ
์ฌ๋ฌ๋ถ, ํน์ ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ ํ ๋๋ง๋ค ์ปดํจํฐ๊ฐ ๋๋๋๋ ์๋ฆฌ ๋ค์ด๋ณด์ จ๋์? ์๋๋ฉด ์ปคํผ ํ ์ ๋ง์๊ณ ์ฌ ์ ๋๋ก ์ค๋ ๊ฑธ๋ฆฌ๋ ๋น๋ ์๊ฐ ๋๋ฌธ์ ์คํธ๋ ์ค ๋ฐ์๋ณด์ ์ ์์ผ์ ๊ฐ์? ๊ทธ๋ ๋ค๋ฉด ์ด ๊ธ์ ์ฌ๋ฌ๋ถ์ ์ํ ๊ฑฐ์์! ๐
์ฐ๋ฆฌ๋ ์ด ๊ธ์ ํตํด ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ์ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ๋ฐฉ๋ฒ๋ค์ ์์๋ณผ ๊ฑฐ์์. ๋ง์น 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๋ก ๋ณํ๋ผ์:
์ด๋ฐ ์์ผ๋ก ์ฝ๋๊ฐ ๊ตฌ์กฐํ๋๋ฉด, ์ปดํ์ผ๋ฌ๊ฐ ์ดํดํ๊ธฐ ์ฌ์์ง๊ณ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ ์ ์์ด์.
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)์์ ์ฌ๋ฌ๋ถ์ ํ์ ์คํฌ๋ฆฝํธ ์ต์ ํ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํ๊ณ ๊ฑฐ๋ํด๋ณด๋ ๊ฑด ์ด๋จ๊น์? ๋๊ตฐ๊ฐ์๊ฒ ์ ๋ง ํ์ํ ์ง์์ผ ์ ์๋ต๋๋ค! ๐ก
๋ง์ง๋ง์ผ๋ก, ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ ์ต์ ํ๋ ์ง์์ ์ธ ๊ณผ์ ์ด์์. ํ๋ก์ ํธ๊ฐ ์ปค์ง๊ณ ๋ณต์กํด์ง์๋ก ๊ณ์ํด์ ์ต์ ํ ์ ๋ต์ ์ ์ฉํ๊ณ ๊ฐ์ ํด ๋๊ฐ์ผ ํด์. ํ์ง๋ง ๊ฑฑ์ ๋ง์ธ์! ์ด ๊ธ์์ ๋ฐฐ์ด ์ ๋ต๋ค์ ๊ธฐ์ตํ๊ณ ์ ์ฉํ๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ ์ด๋ฏธ ํ์ ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ์ต์ ํ์ ๋ฌ์ธ์ด ๋์ด ์์ ๊ฑฐ์์! ๐จโ๐ง๐ฉโ๐ง
์, ์ด์ ์ฌ๋ฌ๋ถ์ ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ๋ฅผ ๋ ๊ฐ๋ฌ์ ๋ ๋ ค๋ณด๋ด์ธ์! ํ์ดํ ! ๐๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ