728x90
- NestJS는 기본적으로 node.js의 Express를 기본 토대로 하여 만들어졌다.
- Express, Fastify 프레임워크를 래핑하여 동작한다.
- platform-express or platform-fastify
- 별도의 설정이 없으면 @nestjs/platform-express 이 기본적으로 사용된다.
- NestJS는 Angular로부터 영향을 많이 받았다.
- NestJS의 철학
- Express에서 부가적으로 타입스크립트, 로깅을 사용하려면 새로 설정을 해줘야하는 번거로움이 있다.
- 이를 단순히 명령어 입력을 통해 구현할 수 있다.
NestJS 시작하기
$ npm i -g @nestjs/cli
$ nest new nestjs-test
NestJS 기본 요소
nestjs-board-app
├── .eslintrc.js
├── .prettierrc
├── .gitignore
├── package.json
├── src
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── main.ts # entry Point
├── test
│ ├── app.e2e-spec.ts
│ └── jest-e2e.json
├── tsconfig.build.json
├── tsconfig.json
└── yarn.lock
- 기본적으로 Typescript로 구동되고 eslint, prettier 설정이 포함되어서 함께 설치된다.
Nest 로직 흐름
- Client : 엔드 포인트로 리소스 요청
- Server : 엔드 포인트에 맞는 컨트롤러 매핑
- Server : 엔드 포인트와 서비스 연결
- Server : 서비스 로직에서 적절한 데이터 리턴
- Server : 컨트롤러 → 서비스 로직에서 받은 데이터를 Response 데이터로 보냄
1. 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 {}
- app.module.ts 에 컨트롤러, 서비스 로직 등록
2. app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get() // =@Get('/')
getHello(): string {
return this.appService.getHello();
}
}
- 요청된 엔드 포인트에 맞춰서 컨트롤러 매핑
- 컨트롤러는 서비스 로직과 연결
3. app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
- string을 응답 데이터로 뿌려줌
모듈
- @Module 데코레이터로 주석이 달린 클래스이다.
- Nest 가 애플리케이션 구조를 구성하는데 사용하는 메타 데이터를 제공한다.
- 각 응용 프로그램에는 하나 이상의 모듈(루트 모듈)이 있다.
- 루트 모듈은 Nest가 사용하는 시작점이다.
- 모듈은 밀접하게 관련된 기능 집합이다.
- 모듈은 싱글톤이므로 여러 모듈간에 쉽게 프로바이더의 동일한 인스턴스를 공유할 수 있다.
Board Module
>> nest g module boards # module 자동 생성 명령어
- nest: using nestcli
- g: generate
- module: schematic that i want
- boards: module name
Controller
- 컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환한다.
@Controller('name') // 'name'에 관한 컨트롤러임을 나타냄
- Handler
- @Get , @Post , @Delete 등과 같은 데코레이터로 장식된 컨트롤러 클래스 내부 메소드
- nest cli 명령어
>> nest g contoller boards --no-spec # controller 자동 생성 명령어
- --no-spec : 테스트를 위한 코드 생성 x
- CLI로 명령어 입력시, board 디렉토리 찾음
- board 컨트롤러 파일 생성
- module에 추가
Providers
- Nest의 기본 개념
- 대부분의 기본 Nest 클래스는 프로바이더로 취급 가능
- 서비스, 리포지토리, 팩토리, 헬퍼
- 주요 아이디어 : 종속성 주입 가능
- 객체간 연결은 Nest 런타임 시스템에 위임
Service
- @injectable 데코레이터로 감싸서 의존성이 있는 객체임을 명시한다.
- 데이터의 유효성 체크, 아이템을 관리하는 등 로직 관련한 부분을 담당한다.
>> nest g service boards --no-spec
- Service를 Controller에서 이용하려면 DI(Dependency Injection)을 해줘야한다.
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService){} // 다음과 같이 의존성 주입이 가능하다.
...
}
- 다음의 컨트롤러 코드를 private 접근 제한자를 사용해 간결하게 표현이 가능하다.
- before
@Controller('boards')
export class BoardsController {
boardsService: BoardsService; // class properties
constructor(boardsService: BoardsService) {
this.boardsService = boardsService;
}
...
}
- after
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
...
}
- 생성자 파라미터로 private 로 service를 넘겨주면 해당 접근 제한자가 사용된 생성자 파라미터는 암묵적으로 클래스 프로퍼티로 선언된다.
Provider 등록하기
Provider를 사용하기 위해서는 등록을 해줘야하는데, 이는 module 파일의 providers 항목안에 해당 모듈에서 사용하려는 Provider를 넣는다.
@Module({
controllers: [BoardsController],
providers: [BoardsService],
})
export class BoardsModule {}
728x90
'🏠 Framework > NestJS' 카테고리의 다른 글
[NestJS] TypeORM (21) | 2024.01.15 |
---|---|
[NestJS] Pipe 이용 (0) | 2024.01.15 |
[NestJS] CRUD 구현 (0) | 2024.01.15 |
[NestJS] Overview (0) | 2023.06.28 |