src를 보면 main, service, module, controller 파일들이 존재한다. 그리고 main에서는 서버를 실행하는 코드가 구현되어 있으며 특별한 내용은 없다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
다음은 module이다. module 파일에는 @Module
라는 흥미로운 syntex가 보인다. @Module은 데코리에터로 불리며 클래스에 함수 기능을 추가
하기 위해 존재한다. 마치 C#의 attribute나 JAVA의 override와 비슷한 syntex이다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
그리고 controller와 service를 보면 데코레이터가 추가로 보이며, service를 보면 서버를 실행하고 출력된 hello world를 반환하는 함수가 구현되어 있는걸 확인 할 수 있다
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
nest는 main.ts에서 동작한다. main.ts에서 NestFactory에 전달된 모듈에서 어플리케이션을 생성한다. NestFactory에 전달된 app.module은 앞으로 개발할 module들의 root이다. app.module에 등록되는 모듈들은 하나의 앱 기능을 가지고 있으며 여러 모듈을 app.module로 모아서 하나의 어플리케이션을 동작 시키는 것이다.
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Module 데코레이터 요소중 controllers는 URI를 가져와 함수를 호출하는 동작
을 한다. 다른 표현으로 controllers는 express의 라우터와 같은 존재이다. 아래 예시로 Get 데코레이터에 /hello
를 입력하고 함수를 정의하였다. 그럼 사용자가 /hello로 URI를 접근하게 되면 controller는 sayHello를 호출
하게 된다.
@Get('/hello')
sayHello(): string {
return 'Hello everyone';
}
<aside> ✅ 데코레이터는 절대적으로 데코리에터를 적용할 객체와 간격이 있어서는 안된다. 아래 코드와 같이 떨어져 있다면 데코레이터는 접근할 수 있는 객체가 없게 된다.
@Get('/hello')
sayHello(): string {
return 'Hello everyone';
}
</aside>