Building a node.js app with typescript
개요
In this post, you will learn how to deploy a node.js server in a typescript environment.
기본적인 서버 및 데이터베이스의 구축에서 부터 실제 배포 및 개발환경 세팅에 이르는 실제 운영을 위한 여러 고려사항들을 검토하고 논의하며 ubuntu 운영체제를 기본 환경으로 사용한다.
Installation
Node.js를 설치할 때는 nvm(Node Version Manager)을 사용하는 것을 권장한다. 공식 홈페이지에서 직접 설치하거나 패키지 매니저로 설치하면 버전 관리가 불편하고, 프로젝트마다 다른 Node.js 버전이 필요할 때 대응하기 어렵다. 자세한 설치 방법은 nvm으로 Node.js 설치하기 포스트를 참고한다.
Compile Typescript
typescript 컴파일러인 tsc 를 통해 다음과 같이 컴파일 할 수 있다.
tsc
typescript compile 할 때에 필요한 다양한 옵션을 tsconfig.json 파일에 명실 할 수 있다. 필자의 경우는 file import 시에 다음과 같이 alias 를 사용하였기 때문에 해당 alias 의 위치를 tsc 가 찾을 수 있도록 tsconfig.json 에 paths를 등록해 준다.
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"sourceMap": true,
"allowSyntheticDefaultImports": true,
"allowJs": true,
"outDir": "./dist/",
"noImplicitAny": false,
"lib": ["es2015"],
"esModuleInterop": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"baseUrl": "./src",
"paths": {
"@domain/*": ["server/domain/*"],
"@common/*": ["server/common/*"],
"@utils/*": ["server/utils/*"],
"@infra/*": ["server/infra/*"],
"@api/*": ["server/api/*"],
"@interfaces/*": ["server/interfaces/*"]
}
},
"include": ["./src/**/*"],
"exclude": ["node_modules", "**/*.spec.ts"]
}
이처럼 path의 경우 단지 컴파일러에게 해당 파일이 어디에 있는지에 대한 위치정보만을 가르쳐줄 뿐이며, 이는 컴파일되어도 alias의 값이 그대로 들어가게 된다.
이러한 module-alias 를 실행하기 위해서는 다음과 같이 module-alias 를 설치하고 메인 파일에서 이를 등록해 주어야 한다.
npm install --save module-alias
index.ts
require('module-alias/register');
이러한 alias의 위치를 실행시점에서 지정해 주어야 하며, 그는 package.json 파일에 다음과 같이 지정해 주어야 node 엔진이 해당 파일을 찾아서 실행이 가능하다.
package.json
{
"_moduleAliases": {
"@domain": "dist/domain",
"@infra": "dist/infra",
"@util": "dist/util",
"@common": "dist/common",
"@interfaces": "dist/interfaces",
"@utils": "dist/utils",
"@api": "dist/api",
"@root": "dist"
}
}
Paths 뿐만 아니라 컴파일 시에 타겟 언어를 지정하고, 모듈관리, 소스맵 등의 다양한 옵션을 설정해 준다.
How to manage environment variables
서버를 운용함에 있어 개발 환경과 실제 운영서버에 따라 달라지는 다양한 환경변수들을 관리하는 것은 보안 및 시스템의 관리 측면에서 매우 중요하다.
본 프로젝트에서는 docker container 기술을 사용하여 운영서버를 배포하며, 개발 서버의 경우 로컬 머신을 사용한다.
여기서 운영서버의 경우 docker image 를 생성하는 시점에서 사용되는 Dockerfile 에 운영시에 사용되는 environment variable 을 저장
서버를 여러 배포환경에서 배포하기 위해 dotenv 라이브러리를 사용하여 .env 파일 내의 환경 변수를 프로세스 환경변수로 사용할 수 있다.
여기서 만약 .env 파일 내의 변수가 기존의 환경 변수와 충돌이 난다면 .env 파일에서 설정한 변수는 무시된다.