1. main.ts
main.ts는 Nest.js에서 진입점으로 사용하겠다고 사전에 약속된 파일이므로 임의로 파일명을 변경해서는 안된다.(중요)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
Nest.js 웹 어플리케이션의 진입점으로
NestFactory 클래스의 create라는 정적 함수를 통해 Nest.js 어플리케이션 인스턴스를 새롭게 생성한다.
const app = await NestFactory.create(AppModule);
// AppModule이라는 모듈을 루트 모듈로 사용하는 Nest.js 어플리케이션 인스턴스를 생성해줘!
2. app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {} // AppModule 클래스는 Nest 에서 모듈이라는 역할
@가 붙는 키워드를 데코레이터 라고 한다.
데코레이터 : 해당 클래스나 함수가 어떤 역할을 수행하는지에 대해 Nest.js에 알려주는 역할
데코레이터는 단독으로 사용할 수 없고 클래스나 함수와 반드시 같이 사용해야 한다.
@Module의 속성들
- imports
- 해당 모듈에서 필요한 모듈의 집합을 정의합니다.
- 여기에 들어가는 모듈은 프로바이더(서비스)를 노출하는 모듈입니다.
- 가장 흔하게 임포트를 하는 모듈 중 하나는 HttpModule(API 호출 모듈)이 있습니다.
- 또한, 나중에 배우게 되는 TypeOrmModule을 이용하여 참조할 리포지토리를 가져오기도 합니다.
- controllers
- 해당 모듈에서 사용하는 컨트롤러를 정의합니다.
- providers
- 해당 모듈에서 사용하는 서비스를 정의합니다.
- exports
- 해당 모듈에서 노출시킬 서비스를 정의합니다.
- 다른 모듈에서 해당 모듈의 서비스를 사용하기 위해서는 exports로 노출을 해야 사용할 수 있습니다.
3. app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
// 생성자에서 인자로 AppService 객체를 넘긴다.
constructor(private readonly appService: AppService) {}
// this.appService라는 멤버 변수에 AppService 객체가 주입되는데
// 이것을 의존성주입(DI) 라고 한다.
@Get()
getHello(): string {
return this.appService.getHello();
}
}
모듈와 마찬가지로 @Controller 라는 데코레이터를 통해 컨트롤러 역할을 한다는 것을 알려주고 있다.
컨트롤러는 서비스를 반드시 의존해야 하며 이는 생성자를 통한 의존성 주입(DI)으로 해결한다.
@Get ==> HTTP GET 요청이 들어올 시 이 함수를 실행한다.
GET 뿐만 아니라 @Post @Put, @Delete 도 존재한다.
4. app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
@Injectable == AppService가 필요하면 DI를 통해서 사용해라
AppService와 같은 서비스 객체는 실제로 리포지토리를 의존하며 비즈니스 로직 실행을 담당한다.
서비스는 리포지토리를 반드시 의존해야 하며 이는 생성자를 통한 의존성 주입(DI)으로 해결한다.(데이터베이스사용시)
5. app.controller.spec.ts
AppController를 Jest라는 테스트 프레임워크를 통해서 테스트하는 코드
import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';
describe('AppController', () => {
let app: TestingModule;
beforeAll(async () => {
app = await Test.createTestingModule({
controllers: [AppController],
providers: [AppService],
}).compile();
});
describe('getHello', () => {
it('should return "Hello World!"', () => {
const appController = app.get(AppController);
expect(appController.getHello()).toBe('Hello World!');
});
});
});
'내일배움캠프 노드 4기 > Today I Learned' 카테고리의 다른 글
[Nest.js] 게시판 만들기 (0) | 2023.02.15 |
---|---|
[Nest.js] IoC와 DI (0) | 2023.02.10 |
[Nest.js] 설치하기 (0) | 2023.02.10 |
레이어드 아키텍처 패턴 layered architecture (0) | 2023.02.09 |
[Nest.js] Express와 Nest.js (0) | 2023.02.09 |