TypeScript์˜ ๋ชจ๋“ˆ ํ•ด์„ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜

    ๋“ค์–ด๊ฐ€๋ฉฐ

    TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ชจ๋“ˆ ํ•ด์„ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผ์น˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. .d.ts ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๋˜๋Œ๋ ธ์„ ๋•Œ, ์ด์ „์—๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ ์ด๋Š” TypeScript์˜ ๋ชจ๋“ˆ ํ•ด์„ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ , ์‹ค์ œ ๊ฒฝํ—˜ํ–ˆ๋˜ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๊ณผ์ •์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


    ๋ชจ๋“ˆ ํ•ด์„์ด๋ž€?

    ๋ชจ๋“ˆ ํ•ด์„(Module Resolution)์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ import๊ฐ€ ๋ฌด์—‡์„ ์ฐธ์กฐํ•˜๋Š”์ง€ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

    import { a } from "moduleA";

    ์ด๋Ÿฐ import ๋ฌธ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” a์˜ ๋ชจ๋“  ์‚ฌ์šฉ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด moduleA๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์ฐธ์กฐํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.


    ๋ชจ๋“ˆ ํ•ด์„ ์ „๋žต

    TypeScript๋Š” ๋‘ ๊ฐ€์ง€ ๋ชจ๋“ˆ ํ•ด์„ ์ „๋žต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    1. Classic (ํด๋ž˜์‹)
      • TypeScript์˜ ๊ธฐ๋ณธ ํ•ด์„ ์ „๋žต
      • ์ฃผ๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ œ๊ณต๋จ
      • ์ƒ๋Œ€์  import๋Š” importํ•˜๋Š” ํŒŒ์ผ์— ์ƒ๋Œ€์ ์œผ๋กœ ํ•ด์„
      • ๋น„์ƒ๋Œ€์  import๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ํŠธ๋ฆฌ๋ฅผ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ํ•ด์„
    2. Node (๋…ธ๋“œ)
      • Node.js์˜ ๋ชจ๋“ˆ ํ•ด์„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ชจ๋ฐฉ
      • node_modules ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ชจ๋“ˆ์„ ์ฐพ์Œ
      • package.json์˜ main ํ•„๋“œ๋ฅผ ํ™•์ธ
      • index.js ํŒŒ์ผ์„ ์ฐพ์Œ

    ์‹ค์ œ ๊ฒฝํ—˜ํ•œ ๋ฌธ์ œ ์ƒํ™ฉ

    ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ TypeScript ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

    index.ts์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋“ˆ์„ ์ž„ํฌํŠธํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค (jsDoc ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค.)

    import { init, exit } from "./myPackage";
    
    init({
        url: "https://google.com",
        debug: true
    });
    
    exit(0);

     

    myPackage.js

    //@ts-check <- ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผํ•œํ…Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ™•์ธํ•˜๋ผ๊ณ  ์•Œ๋ฆฌ๋Š” ์—ญํ• 
    // JSDoc : ์ฝ”๋ฉ˜ํŠธ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ๋ฒ•
    // ์ด ํŒŒ์ผ์— ์ž‘์„ฑํ•œ ๋‚ด์šฉ์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ถˆ๋Ÿฌ์™”์„ ๋•Œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
    /**
     * Initializes the project
     * @param {Object} config
     * @param {boolean} config.debug
     * @param {string} config.url
     * @returns {boolean}
     */
    //๋ˆ„๊ตฐ๊ฐ€ ๊นƒํ—™๊ณผ npm ์— js๋กœ ํ‘ธ์‹œํ•ด๋‘” ๊ฒƒ์ด๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฑธ ์„ค์น˜ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •
    export function init(config){
        return true;
    }
    
    /**
     * Exits the project 
     * @param {number} code
     * @returns {number}
     */
    export function exit(code){
        return code+1;
    }

     

    ๊ทธ๋ฆฌ๊ณ  myPackage.d.ts๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค (์œ„์˜ ๋ฐฉ๋ฒ• ์‹œ๋„ ์ „, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค)

    interface Config {
        url: string;
        debug?: boolean;
    }
    
    declare module "myPackage" {
        function init(config: Config): boolean;
        function exit(code: number): number;
        export { init, exit };
    }

     

    ์ฒ˜์Œ์—๋Š” myPackage.d.ts ํŒŒ์ผ์„ src ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ–์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ src ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์œผ๋กœ ๊ฐ€์ ธ์™”์„ ๋•Œ, ์ด์ „์—๋Š” ๋ฐœ์ƒํ–ˆ๋˜ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์‚ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.


    ๋ฌธ์ œ์˜ ์›์ธ

    ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ ๋Š” TypeScript์˜ ๋ชจ๋“ˆ ํ•ด์„ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค:

    1. ๋ชจ๋“ˆ ํ•ด์„ ์บ์‹ฑ

    • TypeScript๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋ชจ๋“ˆ ํ•ด์„ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ
    • ํ•œ๋ฒˆ ๋ชจ๋“ˆ์„ ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด์„ํ•˜๋ฉด, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์— ์ €์žฅ
    • ์ด ์บ์‹œ๋Š” TypeScript ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์œ ์ง€

    2. ์บ์‹œ ์ดˆ๊ธฐํ™” ์กฐ๊ฑด

    • TypeScript ์„œ๋ฒ„ ์žฌ์‹œ์ž‘
    • `tsconfig.json` ๋ณ€๊ฒฝ
    • ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์˜ ํฐ ๋ณ€ํ™”
    • IDE ์žฌ์‹œ์ž‘

    3. ํ•ด์„ ๊ณผ์ •

    • ์ฒ˜์Œ์—๋Š” TypeScript๊ฐ€ `myPackage`๋ฅผ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋กœ ์ธ์‹
    • `.d.ts` ํŒŒ์ผ์„ `src` ๋ฐ–์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์—์„œ ์บ์‹œ๊ฐ€ ์ดˆ๊ธฐํ™”
    • ๋ชจ๋“ˆ ํ•ด์„์ด ์ƒˆ๋กœ ์‹œ์ž‘๋˜์–ด ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ํ•ด์„
    • ํ•œ๋ฒˆ ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด์„๋œ ํ›„์—๋Š” ์บ์‹œ์— ์ €์žฅ๋˜์–ด ๊ณ„์† ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘

    ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    ์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ ํ•ด์„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

     

    1. TypeScript ์„œ๋ฒ„ ์žฌ์‹œ์ž‘

    • IDE์—์„œ TypeScript ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์—ฌ ์บ์‹œ ์ดˆ๊ธฐํ™”

    2. tsconfig.json ์„ค์ • ๋ช…์‹œ

    { "compilerOptions": { 
    	"moduleResolution": "node", 
        "baseUrl": ".", 
        "paths": { 
        	"myPackage": ["src/myPackage"] 
        } 
    } }

     

    3. ๋ชจ๋“ˆ ํ•ด์„ ์ถ”์  ํ™œ์„ฑํ™”

    • --traceResolution ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ ํ•ด์„ ๊ณผ์ • ์ถ”์ 
      tsc --traceResolution

    ๊ฒฐ๋ก 

    TypeScript์˜ ๋ชจ๋“ˆ ํ•ด์„ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ, ๋•Œ๋กœ๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผ์ณค์„ ๋•Œ๋Š” ์บ์‹œ ์ดˆ๊ธฐํ™”๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” tsconfig.json์— ๋ช…์‹œ์ ์ธ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


    ์ฐธ๊ณ  ์ž๋ฃŒ

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€