JavaScript 프로젝트에 TypeScript 점진적으로 도입하기
배경
팀 내에서 TypeScript 도입 논의가 있었다. 하지만 2년간 운영한 프로젝트를 한 번에 전환하기엔 리스크가 컸다. 점진적 마이그레이션 전략을 세워 진행했다.
초기 설정
tsconfig.json을 프로젝트 루트에 추가하고 allowJs 옵션을 활성화했다.
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"allowJs": true,
"checkJs": false,
"jsx": "react",
"outDir": "./dist",
"strict": false,
"esModuleInterop": true
},
"include": ["src/**/*"]
}
allowJs를 true로 설정하면 .js와 .ts 파일이 공존할 수 있다. checkJs는 false로 두어 기존 JavaScript 파일에서 타입 에러가 발생하지 않도록 했다.
마이그레이션 순서
- 유틸 함수부터 시작: 의존성이 적은 utils, helpers 폴더의 파일을 .ts로 변경
- 타입 정의 추가: 자주 사용하는 데이터 구조를 interface로 정의
- 새 기능은 TypeScript로: 신규 컴포넌트, 모듈은 무조건 .tsx/.ts로 작성
// types/user.ts
export interface User {
id: number;
email: string;
name: string;
createdAt: Date;
}
// utils/userHelper.ts
import { User } from '../types/user';
export function getFullName(user: User): string {
return user.name || user.email;
}
주의사항
- strict 모드는 나중에 활성화: 초기엔 false로 두고 점차 엄격하게
- any 타입 허용: 완벽한 타입보다는 일단 동작하는 코드 우선
- 빌드 도구 설정: webpack의 ts-loader나 awesome-typescript-loader 추가 필요
// webpack.config.js
module.exports = {
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx']
},
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
}
]
}
};
결과
3개월간 진행하여 전체 코드의 약 40%를 TypeScript로 전환했다. 런타임 에러가 눈에 띄게 줄었고, IDE 자동완성이 개선되어 개발 속도도 향상되었다. 급하게 전환하지 않은 것이 좋은 선택이었다.