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 로직 흐름

  1. Client : 엔드 포인트로 리소스 요청
  2. Server : 엔드 포인트에 맞는 컨트롤러 매핑
  3. Server : 엔드 포인트와 서비스 연결
  4. Server : 서비스 로직에서 적절한 데이터 리턴
  5. 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 가 애플리케이션 구조를 구성하는데 사용하는 메타 데이터를 제공한다.
  • 각 응용 프로그램에는 하나 이상의 모듈(루트 모듈)이 있다.

nestjs.com

  • 루트 모듈은 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