nestJS는 효율적이고 확장 가능한 Node.js 서버 애플리케이션을 구축하기 위한 프레임워크라고 공식 문서에 나와있다. 말 그대로 백엔드단의 서버 코드를 작성하는데 도움을 주는 프레임워크다. Express라고 하는 엄청난 라이브러리를 거의 기반으로 한다. 그렇지만 Typescript를 기반으로 빌드를 하고, 구상된 아키텍처를 지키면서 코드를 작성해야 한다는 차이점이 있다. 위의 두 개의 큰 차이점이 nestJS가 가지는 안정성이자 강력함이라고 할 수 있다.
그렇다면 우리가 애용하는 Express.js와의 가장 큰 차이점은 무엇이고 NestJS가 가지는 장점은 무엇일까?
기본적인 시작은 아래와 처럼 설치 이후 nest project를 cli로 만드는 것이다.
$ npm i -g @nestjs/cli
$ nest new project-name
생성된 프로젝트 파일 내부는 CRA(Create-React-App)처럼 짜여진 기본 틀을 제공하고 타입스크립트 코드로 작성되어 있다. 그래서 tsconfig.json 파일이 기본적으로 제공된다.
// main.ts
async function serverWorker() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
serverWorker();
main.ts
파일이 서버의 포트를 구성하고 루트 모듈인 AppModule을 불러와서 서버를 만들어가게 한다. 정말 구성은 Express.js와 크게 다르지 않다.
// app.module.ts
@Module({
imports: [],
controllers: [AppController],
providers: [AppService]
})
@Module
처럼 @이름
형태로 작성된 함수를 데코레이터라고 한다. 기본적으로 서버의 기본이 되는 루트 모듈이 하나 필요하다. 루트 모듈 내부에서 여러 controllers, providers를 배열 형태로 불러와서 하나의 모듈에 정의해준다.
// app.controller.ts
@Controller()
export class AppController {
@Get()
getHello('/'): string {
return this.appService.getHello();
}
}
// app.service.ts
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
컨트롤러는 Express.js에서 애용하던 라우터라고 생각하면 된다. 클래스 내부 매서드에 url을 등록하고, 해당 주소로 요청이 들어오면 연결한 서비스의 함수를 실행시키는 용도다.
서비스는 비즈니스 로직을 동작하게 하는 함수로 구성된 클래스다. 컨트롤러에 등록할 함수들을 정의해두는 파일이라고 생각하면 일단 편하다.