thumbnail

TypeScript 설정 및 ts-node vs tsx 비교

생성일2024. 12. 3.
태그
작성자지한솔

notion image
들어가기 전에, 프론트엔드 개발에 도움이 될 보일러플레이트를 만들어볼 계획입니다. 이를 위해 보일러플레이트를 제작하기 전 설정해야 할 주요 항목들을 정리했습니다.
  1. TypeScript 설정 (TSConfig)
  1. 번들러 설정 (ESBuild, Rollup, Webpack, Vite 등)
  1. ESLint 및 Prettier 설정
이 세 가지 주제를 각각 학습하고, 포스팅을 진행하며 이를 바탕으로 하나의 완성된 보일러플레이트를 만들어볼 예정입니다.
이번 포스팅은 Typescrip설정 (tsConfig)설정하는 방법, 그리고 그 안에 옵션들이 어떤것이 있는지 하나하나 파악해보도록 하겠습니다.

Typescript로 프로젝트 만들기

이번에는 TypeScript로 라이브러리를 만든다고 가정해보겠습니다.
먼저, 프로젝트 디렉토리를 생성하고 초기 설정을 진행합니다.
mkdir typescript-lib cd ./typescript-lib pnpm init
이 명령어를 실행하면 아래와 같이 package.json 파일이 생성됩니다.
notion image
이 상태에서 JavaScript 파일을 작성하고 node <파일명>.js를 실행하면 우리가 만든 파일을 바로 실행할 수 있습니다. 하지만 이번 프로젝트에서는 런타임에서 발생할 수 있는 잠재적 문제를 줄이기 위해 TypeScript를 도입할 예정입니다.

TypeScript 설치

TypeScript를 설치하려면 아래 명령어를 사용합니다.
pnpm install -D typescript
이 명령어를 통해 TypeScript를 개발 의존성으로 추가했습니다. 이제 프로젝트에서 TypeScript를 사용할 준비가 완료되었습니다.

Config를 만들어보자

TypeScript를 사용하기 전에, tsconfig.json 파일을 생성하여 프로젝트 설정을 구성해야 합니다. 이를 간단하게 생성하려면 아래 명령어를 사용합니다:
tsc --init
이 명령어를 실행하면 주석이 포함된 기본 tsconfig.json 파일이 생성됩니다. 이 파일은 TypeScript 컴파일러의 동작 방식을 설정하는데 사용됩니다.
우선, 생성된 파일에서 필수적으로 포함된 옵션들을 먼저 살펴보겠습니다.
{ "compilerOptions": { "target": "es2016", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true } }
이 옵션들은 컴파일러의 기본 동작을 정의하며, 각각 다음과 같은 의미를 갖습니다.
옵션
설명
target
컴파일된 JavaScript의 버전을 설정합니다. (ES5, ES6, ES2016, ESNext 등)
module
사용할 모듈 시스템을 정의합니다. (CommonJS, ESNext, AMD 등)
strict
모든 엄격한 타입 검사 옵션을 활성화합니다.
esModuleInterop
CommonJS와 ES 모듈 간의 호환성을 설정합니다.
skipLibCheck
외부 의존성의 타입 검사를 생략합니다.
forceConsistentCasingInFileNames
파일 이름의 대소문자 일관성을 강제합니다.

왜 기본값이 module: "commonjs"인가?

module: "commonjs"는 TypeScript 컴파일러가 JavaScript의 CommonJS 모듈 시스템을 기반으로 컴파일된 코드를 생성하도록 설정합니다. CommonJS는 Node.js의 기본 모듈 시스템으로, 대부분의 Node.js 프로젝트에서 TypeScript와 함께 사용됩니다.

CommonJS 스타일 컴파일 결과 예시:

TypeScript 코드 (example.ts)
export const greet = (name: string) => `Hello, ${name}!`;
CommonJS로 컴파일된 JavaScript
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.greet = void 0; const greet = (name) => `Hello, ${name}!`; exports.greet = greet;

CommonJS가 기본값인 이유

  1. Node.js와의 호환성: CommonJS는 Node.js 환경에서 기본 모듈 시스템입니다.
  1. 기존 프로젝트: 대부분의 Node.js 프로젝트는 CommonJS를 사용하고 있어 호환성을 유지하기 위해 기본값으로 설정됩니다.
하지만, 최신 Node.js에서는 ESM(ES Modules)을 지원하므로, module: "esnext"로 변경해도 무방합니다. 특히, ESM이 필요한 환경에서는 해당 옵션을 사용하는 것이 좋습니다.

추가 옵션 살펴보기

tsconfig.json에는 위 기본 옵션 외에도 다양한 설정이 주석 형태로 제공됩니다. 이를 통해 프로젝트에 필요한 세부 설정을 구성할 수 있습니다.
아래는 주요 옵션의 예와 그에 대한 간략한 설명입니다
{ "compilerOptions": { /* https://aka.ms/tsconfig 를 방문하여 이 파일에 대해 더 알아볼 수 있습니다 */ /* 프로젝트 관련 설정 */ // "incremental": true, /* .tsbuildinfo 파일을 저장하여 프로젝트의 증분 컴파일을 허용합니다. */ // "composite": true, /* 프로젝트 참조를 사용할 수 있도록 제약 조건을 활성화합니다. */ // "tsBuildInfoFile": "./.tsbuildinfo", /* 증분 컴파일 정보 파일(.tsbuildinfo)의 경로를 지정합니다. */ // "disableSourceOfProjectReferenceRedirect": true, /* 프로젝트 참조 시 선언 파일 대신 소스 파일을 사용하는 것을 비활성화합니다. */ // "disableSolutionSearching": true, /* 편집 중 다중 프로젝트 참조 검사를 비활성화합니다. */ // "disableReferencedProjectLoad": true, /* TypeScript가 자동으로 로드하는 프로젝트 수를 줄입니다. */ /* 언어 및 환경 */ "target": "es2016", /* 생성되는 JavaScript의 언어 버전 및 관련 라이브러리 선언을 설정합니다. */ // "lib": [], /* 대상 런타임 환경을 설명하는 라이브러리 선언 파일 집합을 지정합니다. */ // "jsx": "preserve", /* 생성되는 JSX 코드의 형태를 지정합니다. */ // "experimentalDecorators": true, /* 실험적 데코레이터 지원을 활성화합니다. */ // "emitDecoratorMetadata": true, /* 소스 파일에 대해 데코레이터 메타데이터를 생성합니다. */ // "jsxFactory": "", /* React JSX를 대상으로 할 때 사용할 JSX 팩토리 함수를 지정합니다. 예: 'React.createElement' 또는 'h'. */ // "jsxFragmentFactory": "", /* React JSX를 대상으로 할 때 사용할 JSX Fragment 참조를 지정합니다. 예: 'React.Fragment' 또는 'Fragment'. */ // "jsxImportSource": "", /* 'jsx: react-jsx*'를 사용할 때 JSX 팩토리 함수의 모듈 경로를 지정합니다. */ // "reactNamespace": "", /* 'createElement'를 호출할 객체를 지정합니다. 이는 'react' JSX를 대상으로 할 때만 적용됩니다. */ // "noLib": true, /* 기본 라이브러리 파일(lib.d.ts 포함)을 비활성화합니다. */ // "useDefineForClassFields": true, /* ECMAScript 표준 클래스 필드를 사용하도록 설정합니다. */ // "moduleDetection": "auto", /* JS 파일의 모듈 형식을 감지하는 방법을 제어합니다. */ /* 모듈 */ "module": "commonjs", /* 생성되는 모듈 코드 형식을 지정합니다. */ // "rootDir": "./", /* 소스 파일의 루트 폴더를 지정합니다. */ // "moduleResolution": "node10", /* TypeScript가 모듈 경로를 찾는 방식을 지정합니다. */ // "baseUrl": "./", /* 상대적이지 않은 모듈 이름을 해결하기 위한 기준 디렉터리를 지정합니다. */ // "paths": {}, /* 추가적인 조회 위치로 리맵할 가져오기 경로를 지정합니다. */ // "rootDirs": [], /* 모듈 경로를 해결할 때 하나로 취급할 여러 폴더를 허용합니다. */ // "typeRoots": [], /* './node_modules/@types'와 같은 타입 정의가 포함된 폴더를 지정합니다. */ // "types": [], /* 소스 파일에서 참조하지 않고 포함할 타입 패키지 이름을 지정합니다. */ // "allowUmdGlobalAccess": true, /* UMD 글로벌 모듈에 접근을 허용합니다. */ // "moduleSuffixes": [], /* 모듈을 해결할 때 검색할 파일 이름 접미사 목록을 지정합니다. */ // "allowImportingTsExtensions": true, /* TypeScript 파일 확장자를 포함하여 가져오기를 허용합니다. */ // "rewriteRelativeImportExtensions": true, /* 출력 파일에서 '.ts', '.tsx', '.mts', '.cts' 확장자를 해당 JavaScript로 변경합니다. */ // "resolvePackageJsonExports": true, /* 패키지 가져오기를 해결할 때 package.json의 'exports' 필드를 사용합니다. */ // "resolvePackageJsonImports": true, /* package.json의 'imports' 필드를 가져오기 시 해결에 사용합니다. */ // "customConditions": [], /* 가져오기를 해결할 때 기본 조건에 추가로 설정할 조건을 지정합니다. */ // "noUncheckedSideEffectImports": true, /* 사이드 이펙트 가져오기를 검사합니다. */ // "resolveJsonModule": true, /* .json 파일 가져오기를 활성화합니다. */ // "allowArbitraryExtensions": true, /* 선언 파일이 있는 경우 임의의 파일 확장자를 가져오는 것을 허용합니다. */ // "noResolve": true, /* 가져오기, require 또는 <reference>가 프로젝트에 포함되는 파일 수를 확장하지 못하도록 금지합니다. */ /* JavaScript 지원 */ // "allowJs": true, /* JavaScript 파일을 프로그램의 일부로 포함할 수 있도록 허용합니다. 'checkJs' 옵션을 사용하여 이러한 파일에서 오류를 보고받습니다. */ // "checkJs": true, /* 타입이 체크된 JavaScript 파일에서 오류를 보고받습니다. */ // "maxNodeModuleJsDepth": 1, /* 'node_modules'에서 JavaScript 파일을 체크할 최대 폴더 깊이를 지정합니다. 'allowJs'에만 적용됩니다. */ /* 출력 */ // "declaration": true, /* 프로젝트의 TypeScript와 JavaScript 파일에서 .d.ts 파일을 생성합니다. */ // "declarationMap": true, /* .d.ts 파일의 소스 맵을 생성합니다. */ // "emitDeclarationOnly": true, /* JavaScript 파일이 아닌 .d.ts 파일만 출력합니다. */ // "sourceMap": true, /* 생성된 JavaScript 파일에 대한 소스 맵 파일을 생성합니다. */ // "inlineSourceMap": true, /* 생성된 JavaScript 내부에 소스 맵 파일을 포함합니다. */ // "noEmit": true, /* 컴파일에서 파일 출력을 비활성화합니다. */ // "outFile": "./", /* 출력된 모든 JavaScript 파일을 하나의 파일로 번들링합니다. */ // "outDir": "./", /* 모든 출력 파일의 폴더를 지정합니다. */ // "removeComments": true, /* 주석을 제거하여 파일을 출력합니다. */ // "importHelpers": true, /* 프로젝트당 한 번씩 tslib에서 헬퍼 함수를 가져오는 것을 허용합니다. */ // "downlevelIteration": true, /* 반복문에 대해 더 호환성이 높지만 장황한 JavaScript를 출력합니다. */ // "sourceRoot": "", /* 디버거가 참조 소스 코드를 찾는 기본 경로를 지정합니다. */ // "mapRoot": "", /* 디버거가 맵 파일을 찾을 위치를 지정합니다. */ // "inlineSources": true, /* 소스 맵 내부에 소스 코드를 포함합니다. */ // "emitBOM": true, /* 출력 파일의 시작 부분에 UTF-8 BOM을 출력합니다. */ // "newLine": "crlf", /* 파일 출력을 위한 줄 바꿈 문자를 설정합니다. */ // "stripInternal": true, /* JSDoc 주석에 '@internal'이 포함된 선언을 출력하지 않습니다. */ // "noEmitHelpers": true, /* '__extends'와 같은 헬퍼 함수 생성을 비활성화합니다. */ // "noEmitOnError": true, /* 타입 체크 오류가 발생하면 파일을 출력하지 않습니다. */ // "preserveConstEnums": true, /* 'const enum' 선언을 삭제하지 않고 유지합니다. */ // "declarationDir": "./", /* 생성된 선언 파일의 출력 디렉터리를 지정합니다. */ /* 상호 운용성 제약 */ // "isolatedModules": true, /* 각 파일이 다른 파일의 의존 없이 안전하게 트랜스파일될 수 있도록 보장합니다. */ // "verbatimModuleSyntax": true, /* 타입 전용으로 표시되지 않은 모든 가져오기 및 내보내기를 변환하지 않고 유지합니다. */ // "isolatedDeclarations": true, /* 다른 도구가 선언 파일을 쉽게 생성할 수 있도록 수출을 충분히 주석 처리해야 합니다. */ // "allowSyntheticDefaultImports": true, /* 모듈에 기본 내보내기가 없을 때도 'import x from y'를 허용합니다. */ "esModuleInterop": true, /* CommonJS 모듈을 가져올 때 추가적인 JavaScript를 출력하여 호환성을 향상합니다. 이 설정은 타입 호환성을 위해 'allowSyntheticDefaultImports'를 활성화합니다. */ // "preserveSymlinks": true, /* 심볼릭 링크를 실제 경로로 해석하지 않습니다. 이는 Node의 동일한 플래그와 관련이 있습니다. */ "forceConsistentCasingInFileNames": true, /* 가져오기에 대한 대소문자 일관성을 보장합니다. */ /* 타입 검사 */ "strict": true, /* 모든 엄격한 타입 검사 옵션을 활성화합니다. */ // "noImplicitAny": true, /* 암시적으로 'any' 타입이 되는 표현식 및 선언에 대한 오류 보고를 활성화합니다. */ // "strictNullChecks": true, /* 'null' 및 'undefined'를 타입 검사에 포함합니다. */ // "strictFunctionTypes": true, /* 함수 할당 시 매개변수와 반환값이 하위 타입인지 검사합니다. */ // "strictBindCallApply": true, /* 'bind', 'call', 'apply' 메서드의 인수가 원래 함수와 일치하는지 확인합니다. */ // "strictPropertyInitialization": true, /* 생성자에서 설정되지 않은 클래스 속성을 검사합니다. */ // "strictBuiltinIteratorReturn": true, /* 내장 반복자가 'TReturn' 타입으로 'undefined' 대신 'any'를 사용하지 않도록 설정합니다. */ // "noImplicitThis": true, /* 'this'가 'any' 타입으로 추론되는 경우 오류를 보고합니다. */ // "useUnknownInCatchVariables": true, /* catch 절의 변수 타입을 'any' 대신 'unknown'으로 설정합니다. */ // "alwaysStrict": true, /* 항상 'use strict'를 출력하도록 설정합니다. */ // "noUnusedLocals": true, /* 읽히지 않은 로컬 변수에 대해 오류를 보고합니다. */ // "noUnusedParameters": true, /* 읽히지 않은 함수 매개변수에 대해 오류를 보고합니다. */ // "exactOptionalPropertyTypes": true, /* 선택적 속성 타입을 작성된 그대로 해석합니다. */ // "noImplicitReturns": true, /* 명시적으로 반환되지 않은 함수 경로에 대해 오류를 보고합니다. */ // "noFallthroughCasesInSwitch": true, /* switch 문의 넘어가는 경우에 대해 오류를 보고합니다. */ // "noUncheckedIndexedAccess": true, /* 인덱스 사용 시 타입에 'undefined'를 추가합니다. */ // "noImplicitOverride": true, /* 파생 클래스에서 재정의된 멤버에 'override' 수정자를 요구합니다. */ // "noPropertyAccessFromIndexSignature": true, /* 인덱스 타입으로 선언된 키에 대해 인덱스 접근자를 요구합니다. */ // "allowUnusedLabels": true, /* 사용되지 않는 레이블에 대한 오류 보고를 비활성화합니다. */ // "allowUnreachableCode": true, /* 도달할 수 없는 코드에 대한 오류 보고를 비활성화합니다. */ /* 완전성 */ // "skipDefaultLibCheck": true, /* 기본 포함된 .d.ts 파일에 대한 타입 검사를 생략합니다. */ "skipLibCheck": true /* 모든 .d.ts 파일에 대한 타입 검사를 생략합니다. */ } }
이처럼 tsconfig.json은 프로젝트 환경에 맞게 유연하게 설정할 수 있으며, 기본값을 사용하거나 필요에 따라 옵션을 추가하면 됩니다.
Tip: 주석을 읽으며 필요 없는 옵션은 비활성화하거나 제거하여 설정 파일을 간결하게 유지하세요.

필요한 옵션만 추리기

TypeScript에는 많은 설정 옵션이 있지만, 모든 옵션을 알 필요는 없습니다. 프로젝트 목적에 맞는 필수적인 옵션만 선택해서 사용하는 것이 가장 효율적입니다. 특히, 보일러플레이트를 만들 때는 이러한 선택과 집중이 중요합니다.
아래는 제가 라이브러리 개발에 적합하다고 생각하는 tsconfig.json의 예시입니다.
{ "compilerOptions": { "target": "ESNext", /* 최신 JavaScript 문법으로 컴파일합니다. */ "module": "ESNext", /* ES Module 방식을 사용합니다. */ "lib": ["DOM", "ESNext"], /* DOM 관련 API와 최신 ECMAScript 기능을 포함합니다. */ "declaration": true, /* .d.ts 타입 선언 파일을 생성합니다. */ "declarationDir": "./dist", /* 타입 선언 파일의 출력 경로를 설정합니다. */ "outDir": "./dist", /* 컴파일된 JavaScript 파일의 출력 경로를 설정합니다. */ "rootDir": "./src", /* 소스 파일의 루트 디렉토리를 설정합니다. */ "strict": true, /* 엄격한 타입 검사를 활성화합니다. */ "esModuleInterop": true, /* CommonJS와 ES Module 간의 호환성을 설정합니다. */ "skipLibCheck": true /* 외부 라이브러리 타입 검사를 생략합니다. */ }, "include": ["src/**/*"], /* 컴파일할 파일의 경로를 지정합니다. */ "exclude": ["node_modules", "dist"] /* 제외할 파일 또는 디렉토리를 지정합니다. */ }

이 설정이 적합한 이유

  1. 최신 문법을 지원
      • target: "ESNext"module: "ESNext"를 통해 최신 ECMAScript 기능을 사용할 수 있습니다.
      • lib: ["DOM", "ESNext"]를 추가하여 브라우저 API(DOM)와 최신 ECMAScript 기능을 모두 포함합니다.
  1. 타입 선언 파일 생성
      • declaration: truedeclarationDir 설정으로 .d.ts 타입 선언 파일을 자동으로 생성합니다.이는 라이브러리를 사용하는 다른 개발자가 타입 정보를 활용할 수 있도록 합니다.
  1. 디렉토리 구조 관리
      • rootDir은 소스 코드의 루트 디렉토리를 지정하며, outDir은 컴파일된 파일의 출력 디렉토리를 설정합니다.이를 통해 빌드 과정에서 소스 코드와 결과물을 분리해 관리할 수 있습니다.
  1. 엄격한 타입 검사
      • strict: true를 활성화하여 모든 엄격한 타입 검사를 사용합니다.이는 타입 안정성을 높이고, 런타임 에러를 최소화하는 데 도움이 됩니다.
  1. 빠른 빌드 환경
      • skipLibCheck: true는 외부 라이브러리의 타입 검사를 생략하여 컴파일 속도를 높입니다.개발 중에는 이 옵션을 사용하고, 배포 전에 필요한 경우 타입 검사를 추가로 실행하면 됩니다.
  1. 포함 및 제외 파일 설정
      • includeexclude를 통해 컴파일 대상과 제외 대상을 명확히 설정해 불필요한 파일을 배제합니다.

최적화된 환경으로 라이브러리 개발

위 설정은 라이브러리 개발 및 유지보수를 염두에 둔 구성입니다. 최신 문법을 사용하면서도 타입 안정성과 효율적인 빌드 과정을 유지할 수 있습니다. 지속적인 개발과 유지보수가 필요한 프로젝트에 적합하며, 이러한 설정을 기반으로 꾸준히 라이브러리를 디벨롭하는 것이 가장 이상적이라고 생각합니다.

TS를 JS로 변환하기

이제 모든 기본 설정이 끝났으니, TypeScript 파일을 작성하고 실행해보겠습니다.
우선, 간단한 TypeScript 파일을 하나 작성해봅시다.
// src/index.ts const sayHello = (name: string) => `hello my name is ${name}` console.log(sayHello('hansol'))
위 파일은 타입을 명시한 TypeScript 함수로, 콘솔에 메시지를 출력합니다.
그럼 이 파일을 JavaScript처럼 실행해보겠습니다.
node src/index.ts # output # const sayHello = (name: string) => `hello my name is ${name}` # ^ # SyntaxError: Unexpected token ':'
결과는 SyntaxError입니다. Node.js는 TypeScript 구문(예: 타입 선언 : string)을 이해하지 못하기 때문입니다. 따라서 TypeScript를 JavaScript로 변환(컴파일)해야 합니다. 또는, TypeScript를 직접 실행할 수 있는 도구를 사용해야 합니다.

TypeScript 실행 방법

TypeScript 파일을 실행하기 위해 두 가지 도구를 고려할 수 있습니다:
  1. ts-node
      • TypeScript 파일을 실시간으로 컴파일하고 실행할 수 있는 도구.
      • 간단한 테스트나 개발 환경에서 유용.
  1. tsx
      • esbuild를 기반으로 한 빠르고 현대적인 TypeScript 실행 도구.
      • 실행 속도가 매우 빠르며, 점점 더 많은 개발자가 선호.
 

벤치마크 결과 비교

ts-nodetsx의 실제 성능 차이를 확인하기 위해 벤치마크를 진행했습니다. 아래는 pnpm을 사용한 실행 결과입니다.
Benchmark 1: pnpm ts-node src/index.ts Time (mean ± σ): 570.1 ms ± 157.9 ms [User: 870.7 ms, System: 55.2 ms] Range (min … max): 508.4 ms … 1018.6 ms 10 runs Warning: The first benchmarking run for this command was significantly slower than the rest (1.019 s). This could be caused by (filesystem) caches that were not filled until after the first run. You should consider using the '--warmup' option to fill those caches before the actual benchmark. Alternatively, use the '--prepare' option to clear the caches before each timing run. Benchmark 2: pnpm tsx src/index.ts Time (mean ± σ): 440.1 ms ± 211.1 ms [User: 350.2 ms, System: 40.9 ms] Range (min … max): 346.2 ms … 1035.6 ms 10 runs Warning: The first benchmarking run for this command was significantly slower than the rest (1.036 s). This could be caused by (filesystem) caches that were not filled until after the first run. You should consider using the '--warmup' option to fill those caches before the actual benchmark. Alternatively, use the '--prepare' option to clear the caches before each timing run. Summary pnpm tsx src/index.ts ran 1.30 ± 0.72 times faster than pnpm ts-node src/index.ts

벤치마크 결과 분석:

  • tsx가 평균적으로 약 23% 더 빠릅니다.
  • tsx는 내부적으로 esbuild를 사용하여 컴파일 속도가 더 빠르고, 리소스를 효율적으로 사용합니다.
  • 두 도구 모두 첫 번째 실행에서 파일 시스템 캐시가 비워져 있어 시간이 더 걸렸습니다. 이를 방지하려면 -warmup 옵션을 사용하거나, 명령 실행 전에 캐시를 준비하는 것이 좋습니다.

성능 요약:

도구
평균 실행 시간
특징
ts-node
570.1ms
안정적이지만, 속도가 느림.
tsx
440.1ms
속도가 빠르고 최신 프로젝트에 적합.

결론: 어떤 도구를 선택할까?

  • 간단한 테스트나 기존 프로젝트: ts-node는 여전히 유용하며, 간단한 실행 환경에서 충분히 활용 가능합니다.
  • 속도가 중요한 프로젝트: tsx는 더 빠르고 효율적이며, 특히 보일러플레이트나 현대적인 개발 환경에 적합합니다.
저의 선택:
라이브러리 개발 중 TypeScript를 즉시 실행해야 하는 상황이라면 **tsx**를 선택할 것입니다. 벤치마크 결과에서 tsxts-node보다 평균적으로 더 빠르다는 점이 입증되었으니, 보일러플레이트를 구성할 때도 tsx를 기본 도구로 사용하는 것이 더 적합하다고 생각합니다.

정리

이번 포스팅에서는 보일러플레이트를 만들기 전에 필수적으로 알아야 할 TypeScript 기본 설정 방법에 대해 알아보았습니다.
간단한 설정처럼 보이지만, 다양한 옵션들이 존재하며 프로젝트 요구사항에 따라 세팅 방식이 달라질 수 있다는 점을 확인할 수 있었습니다.
특히, tsconfig.jsoncompilerOptions에서 핵심 옵션들에 대해 집중적으로 다뤘습니다. 이외에도 include, exclude와 같은 파일 지정 옵션을 활용하면 더 나은 설정을 구성할 수 있습니다.
Tip: 프로젝트를 진행하면서 필요한 옵션들을 점진적으로 추가하고 조정하며, 자신만의 최적화된 tsconfig.json을 만들어보세요. 이를 통해 개발 생산성을 높이고 유지보수성을 강화할 수 있습니다.
더 자세한 내용은 [깃허브]에서 확인 가능합니다. 많은 피드백 부탁드립니다.