타입스크립트의 모듈 시스템 이해하기

2021. 10. 12. 08:47·Front-End/Typescript
반응형

타입스크립트의 모듈 시스템 이해하기

모듈의 기본 개념과 중요성

모듈은 독립적인 기능 단위로, 코드를 체계적으로 구성하는 핵심 요소입니다. 모듈 시스템을 사용함으로써 얻을 수 있는 주요 이점들은 다음과 같습니다:

  1. 유지 보수성 향상
    • 코드 중복을 최소화하여 버그 발생 가능성 감소
    • 기능별로 분리된 코드로 수정이 용이
  2. 전역 스코프 오염 방지
    • 각 파일이 독립적인 스코프를 가짐
    • 변수명 충돌 문제 해결
  3. 재사용성 증가
    • 모듈을 여러 프로젝트에서 재사용 가능
    • 코드의 재사용성과 이식성 향상

TypeScript의 두 가지 모듈 시스템

1. 외부 모듈 (External Modules)

ES6의 모듈 시스템을 기반으로 하며, import와 export 키워드를 사용합니다.

// math.ts
export function add(x: number, y: number): number {
    return x + y;
}

export function multiply(x: number, y: number): number {
    return x * y;
}

// main.ts
import { add, multiply } from './math';

console.log(add(2, 3));      // 5
console.log(multiply(2, 3)); // 6

2. 내부 모듈 (Internal Modules / Namespace)

네임스페이스를 사용한 TypeScript 고유의 모듈화 방식입니다.

// validation.ts
namespace Validation {
    export interface StringValidator {
        isValid(s: string): boolean;
    }

    export class EmailValidator implements StringValidator {
        isValid(s: string): boolean {
            const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
            return emailRegex.test(s);
        }
    }
}

// 사용하기
let emailChecker = new Validation.EmailValidator();

모듈 시스템의 특징 비교

ES Modules (외부 모듈)의 장점

  1. 현대적인 접근방식
    • ES6 표준을 따르는 방식
    • 대부분의 모던 도구들과 호환성이 좋음
  2. 트리 쉐이킹 지원
    • 사용하지 않는 코드를 제거하여 번들 크기 최적화
    • 더 효율적인 코드 관리 가능
  3. 명확한 의존성 관리
    • 의존성을 명시적으로 선언
    • 컴파일 시점에 의존성 체크 가능
// 명시적인 의존성 선언
import { Component } from './component';
import { Utils } from './utils';

export class MyComponent extends Component {
    constructor() {
        super();
        Utils.doSomething();
    }
}

Namespace (내부 모듈)의 특징

  1. 레거시 지원
    • 오래된 TypeScript 프로젝트와의 호환성
    • AMD/CommonJS 이전의 모듈화 방식
  2. 단일 파일 번들링
    • --outFile 컴파일러 옵션으로 단일 파일 생성
    • 간단한 프로젝트에서 유용
/// <reference path="validations.ts" />
namespace App {
    export class Main {
        start() {
            let validator = new Validation.EmailValidator();
            console.log(validator.isValid("test@email.com"));
        }
    }
}

현대적인 개발에서의 권장사항

  1. ES Modules 사용 권장
    • 새로운 프로젝트는 ES Modules 사용
    • 더 나은 도구 지원과 생태계 통합
  2. 점진적 마이그레이션
    • 기존 네임스페이스 기반 코드는 점진적으로 ES Modules로 전환
    • 호환성을 고려한 전환 계획 수립
  3. 모듈 시스템 일관성
    • 한 프로젝트 내에서 일관된 모듈 시스템 사용
    • 혼합 사용은 가급적 피하기

컴파일 설정과 모듈 시스템

Namespace

{
    "compilerOptions": {
        "target": "es5",
        "module": "amd",
        "outFile": "./dist/bundle.js",
        "rootDir": "./src",
        "strict": true
    }
}

ES Modules

{
    "compilerOptions": {
        "module": "es2015",        // ES Modules 사용
        "moduleResolution": "node", // 모듈 해석 방식
        "target": "es5",           // 출력 JS 버전
        "sourceMap": true,         // 소스맵 생성
        "outDir": "./dist"         // 출력 디렉토리
    }
}

이러한 현대적인 접근 방식을 통해 더 안정적이고 유지보수가 용이한 TypeScript 프로젝트를 구축할 수 있습니다.

반응형

'Front-End > Typescript' 카테고리의 다른 글

2.03 부터 변화된 타입스크립트 선언 파일(typings)  (0) 2016.10.11
Window 에 Typescript로 객체 추가하기  (0) 2016.09.21
'Front-End/Typescript' 카테고리의 다른 글
  • 2.03 부터 변화된 타입스크립트 선언 파일(typings)
  • Window 에 Typescript로 객체 추가하기
Ethan Kang
Ethan Kang
Digital nomad + Software Engineer
    반응형
  • Ethan Kang
    Software Engineer Ethan
    Ethan Kang
  • 전체
    오늘
    어제
    • Programming (105)
      • Java (22)
        • Spring Framework (6)
        • Spring (8)
        • Spring Security (0)
        • JPA (3)
        • MyBatis (1)
        • Servlet, JSP (2)
      • DevOps (4)
        • Kubernetes (2)
        • Docker (1)
        • Terraform (0)
        • Jenkins (0)
        • Bazel (1)
      • Front-End (18)
        • ReactJS (0)
        • Typescript (3)
        • JQuery (1)
        • Java Script (13)
        • RxJS (0)
        • CSS (1)
      • Messaging Queue (1)
        • Kafka (1)
      • Linux (Ubuntu based) (8)
        • Ubuntu (0)
        • CentOS (2)
        • Shell Scripting (2)
      • PHP (5)
        • Laravel (2)
        • PHP 문법 (3)
      • Go (1)
        • Basics (1)
      • Python (16)
        • Flask (1)
        • Django (4)
      • App Development (4)
        • Android (1)
        • Cordova (0)
        • React Native (0)
        • Hybrid Programming (2)
        • IOS (1)
      • Database (4)
        • SQL (0)
        • My SQL (4)
        • MongoDB (0)
      • Shader Programming (0)
      • Tools (5)
        • GIT (2)
      • C# (3)
        • ASP.NET MVC (2)
        • CSharp 파헤치기 (1)
      • 서평 (1)
      • ETC (4)
        • C++ (0)
        • Geo Server (0)
        • NodeJS2 (0)
        • Ruby (2)
        • Elastic Search (0)
        • Camera (0)
        • Open Source (2)
        • WebVR (0)
      • 소프트웨어 이론 (2)
        • TDD (1)
        • Architecture (1)
        • WEB DEV (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 컬러스크립터
  • 공지사항

    • 좋은 프로그래머가 되는 24가지 방법
  • 인기 글

  • 태그

    데이터베이스캐쉬
    이미지 #jsp
    Python
    데이터베이스
    N+1
    django #장고
    spring
    java
    VersionControl
    db
    자바
    JPA
    스프링
    스프링데이타
    autoloading
    Kotlin
    mybatis
    mysql
    mysql데이터복구
    psr-4
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Ethan Kang
타입스크립트의 모듈 시스템 이해하기
상단으로

티스토리툴바