15장: 운영 준비: 컴파일, 번들링, 린팅
프로덕션을 위한 준비: 컴파일, 번들링, 린팅
멋진 TypeScript Express 서버의 개발 과정이 끝나면, 운영 환경에 안전하게 배포하는 마지막 문턱이 기다리고 있다. 단순히 코드를 실행하는 것과 실제 트래픽을 받는 서비스로 전환하는 일은 전혀 다르다. 서버가 예측할 수 없는 요청에 흔들리지 않고, 효율성을 잃지 않으며, 오류와 버그도 신속히 감지하고 극복할 수 있어야 한다. 이를 위해 반드시 거쳐야 할 기술적 과정이 바로 컴파일, 번들링, 그리고 린팅이다.
TypeScript 코드의 컴파일
TypeScript로 작성한 서버 코드는 Node.js가 직접 실행할 수 없다. 먼저 TypeScript 컴파일러(tsc)가 소스의 타입을 검사하고, 오류가 없을 때 비로소 JavaScript로 변환한다. tsconfig.json
파일에서 소스 디렉터리(src)와 결과 디렉터리(dist), 모듈 시스템, 엄격한 타입 검사(strict option) 등을 설정한다. 엄격한 타입 체크는 기존에 놓칠 수 있었던 잠재 오류를 빌드 단계에서 차단해준다. 컴파일 명령은 npx tsc
한 줄이면 충분하지만, 실제 배포 환경에서는 자동화 스크립트나 CI 파이프라인에 포함하는 것이 좋다.
번들링: 더 빠른 배포와 가벼운 배포물
Node.js 서버는 여러 개의 자바스크립트 파일과 라이브러리로 이뤄진다. 이들을 한데 묶어 효율적으로 로드할 수 있게 해주는 것이 번들링이다. 번들링은 클라이언트 코드에만 쓰는 것이라 생각하기 쉽지만, 서버 코드에도 동일하게 적용 가능하다. 대표적으로 Webpack, esbuild, tsup 등이 많이 사용된다. 번들러를 사용하면 코드를 하나의 파일로 합쳐 의존성이 꼬이는 걸 방지하고, 비사용 코드(tree-shaking)도 자연스레 제거된다. 결과적으로 더 빠른 서비스 구동, 배포 파일의 용량 절감, 로드 성능 향상의 효과를 얻을 수 있다.
린팅: 깨끗한 코드, 예측 가능한 서버
컴파일과 번들링이 서버의 안전과 성능을 지켜준다면, 린팅은 코드의 품질과 일관성을 유지한다. ESLint, Prettier 같은 도구는 코드 스타일을 자동으로 맞춰주고 불필요한 패턴을 미리 구별해준다. TypeScript 프로젝트에서는 @typescript-eslint/eslint-plugin
과 @typescript-eslint/parser
를 활용해 타입 검사와 린팅을 동시에 적용할 수 있다. lint 스크립트(npm run lint
) 하나로 잠재적 오류와 코드 스타일 이슈를 한 번에 관리할 수 있다. 자동화된 린팅은 협업에서 특히 강점을 발휘한다. 누구나 같은 규칙을 따르므로 코드 리뷰 비용이 줄고, 운영 중 우발적 실수도 크게 줄어든다.
최적의 운영 환경을 위한 마지막 점검
프로덕션 환경에서는 빌드 결과물만 서버에 올린다. 개발용 도구(nodemon
, ts-node
)는 배포 파일에 포함하지 않는다. 환경에 따라 로그 수준, 성능 최적화 옵션, 프레임워크 버전 등을 분리 관리한다. 코드 빌드와 번들, 린트 단계는 CI/CD 파이프라인의 일부로 필수적으로 자동화하며, 모든 워크플로는 소스에 명시적으로 기록해야 예측 불가한 위험에서 자유로워질 수 있다.
컴파일, 번들링, 린팅은 그저 번거로운 절차적 작업이 아니다. 이 세 단계가 제대로 갖춰진 서버만이 예고치 못한 현실의 거친 바람 속에서도 묵묵히 자신의 역할을 다한다. 운영의 뒷받침이 확고할 때에야 비로소 TypeScript Express 서버는 진정한 프로덕션의 문을 두드릴 수 있다.