NestJS 2부 시도: REST 엔드포인트 생성

7607 단어
이 기사는 원래 내 personal blog에 게시되었습니다.

소개



내 , 나는 NestJS를 시도해보고 싶은 이유와 그것을 평가하기 위해 어떤 프로젝트를 만들 것인지에 대해 이야기했습니다.

이 블로그 게시물에서는 Tasks 개념에 대한 CRUD 끝점을 설정하고 싶습니다.

계속하기 전에



NestJS 사용의 주요 이점 중 하나는 애플리케이션을 구성하는 방식에 대해 매우 독단적이라는 것입니다. 결과적으로, 느슨하게 결합되고 생각조차 하지 않고도 테스트 가능성이 높은 응용 프로그램을 갖게 됩니다.

그러나 NestJS는 이해하기 어려울 수 있습니다(특히 주니어 개발자인 경우). 제 생각에는 NestJS가 이러한 개념에 크게 의존하기 때문에 Dependency Injection(및 대체로 SOLID 원칙) 및 DI 컨테이너가 무엇인지 이해하는 것이 매우 중요합니다.

새 엔드포인트 설정



프로젝트의 이 부분에 대한 소스 코드는 https://github.com/arnaud-cortisse/trying-out-nestjs-part-2에서 사용할 수 있습니다.

CRUD 끝점을 만드는 것은 그다지 흥미롭지 않습니다. 코드가 항상 똑같아 보이기 때문에 실제로는 매우 지루합니다.
다행히 NestJS는 REST 엔드포인트를 설정하는 데 필요한 모든 상용구를 생성하기 위해 a sweet tool을 제공합니다.

CRUD 생성기 사용



CRUD 생성기를 사용하기 전에 다음 패키지를 설치하십시오.

npm install @nestjs/mapped-types


프로젝트의 루트에 다음을 입력하십시오.

nest g resource tasks


몇 가지 선택 사항이 표시됩니다. 이 경우 REST API 개발에 관심이 있습니다.

? What transport layer do you use? (Use arrow keys)
❯ REST API
  GraphQL (code first)
  GraphQL (schema first)
  Microservice (non-HTTP)
  WebSockets


그런 다음 예를 선택합니다.

? Would you like to generate CRUD entry points? (Y/n)


다음 출력이 있어야 합니다.

CREATE src/tasks/tasks.controller.spec.ts (566 bytes)
CREATE src/tasks/tasks.controller.ts (890 bytes)
CREATE src/tasks/tasks.module.ts (247 bytes)
CREATE src/tasks/tasks.service.spec.ts (453 bytes)
CREATE src/tasks/tasks.service.ts (609 bytes)
CREATE src/tasks/dto/create-task.dto.ts (30 bytes)
CREATE src/tasks/dto/update-task.dto.ts (169 bytes)
CREATE src/tasks/entities/task.entity.ts (21 bytes)
UPDATE src/app.module.ts (312 bytes)


NestJS CLI는 많은 상용구 코드를 생성했습니다.

생성된 파일 중 일부를 자세히 살펴보겠습니다.

task.service.ts



데이터 저장 및 검색을 처리할 service입니다.

import { Injectable } from '@nestjs/common';
import { CreateTaskDto } from './dto/create-task.dto';
import { UpdateTaskDto } from './dto/update-task.dto';

@Injectable()
export class TasksService {
  create(createTaskDto: CreateTaskDto) {
    return 'This action adds a new task';
  }

  findAll() {
    return `This action returns all tasks`;
  }

  findOne(id: number) {
    return `This action returns a #${id} task`;
  }

  update(id: number, updateTaskDto: UpdateTaskDto) {
    return `This action updates a #${id} task`;
  }

  remove(id: number) {
    return `This action removes a #${id} task`;
  }
}

@Injectable()TypeScript decorator이다.@Injectable 으로 클래스를 장식하면 providers 으로 작동할 수 있습니다.

의존성 주입 task.controller.ts



과 관련된 들어오는 요청을 처리할 controller 입니다.

import { Controller, Get, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { TasksService } from './tasks.service';
import { CreateTaskDto } from './dto/create-task.dto';
import { UpdateTaskDto } from './dto/update-task.dto';

@Controller('tasks')
export class TasksController {
  constructor(private readonly tasksService: TasksService) {}

  @Post()
  create(@Body() createTaskDto: CreateTaskDto) {
    return this.tasksService.create(createTaskDto);
  }

  @Get()
  findAll() {
    return this.tasksService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.tasksService.findOne(+id);
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() updateTaskDto: UpdateTaskDto) {
    return this.tasksService.update(+id, updateTaskDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.tasksService.remove(+id);
  }
}

TasksTypeScript decorator이다.
HTTP 동사( @Controller() , @Controller 등)로 장식된 메서드와 함께 @Get() 으로 클래스를 장식하면 앱의 라우팅을 선언할 수 있습니다.

또한 생성자는 @Post()(이전에 이야기한 클래스)의 인스턴스를 기대한다는 것을 알 수 있습니다. 배후에서 TaskService의 인스턴스는 DI 컨테이너(NestJS 런타임에 빌드됨, custom-providers 참조)에 의해 주입됩니다.

task.module.ts


TaskService 과 관련된 클래스의 모든 인스턴스를 보유할 module 입니다.

import { Module } from '@nestjs/common';
import { TasksService } from './tasks.service';
import { TasksController } from './tasks.controller';

@Module({
  controllers: [TasksController],
  providers: [TasksService]
})
export class TasksModule {}

TasksTypeScript decorator이다.@Module()으로 클래스를 장식하면 밀접하게 관련된 코드를 재그룹화하고 캡슐화할 수 있습니다.

또한 DI 컨테이너가 작동하는 방식에도 영향을 미칩니다.

app.module.ts



앱 모듈은 루트 모듈입니다( modules 참조). 시작 시 @Module 내부에 생성됩니다.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TasksModule } from './tasks/tasks.module';

@Module({
  imports: [TasksModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}


CRUD 생성기가 main.ts으로 업데이트되었고 이제 imports을 참조하는 것을 볼 수 있습니다. 이는 우리 앱이 TasksModule 내부에 선언된 모든 경로를 노출하는 데 필요합니다. TasksController은 애플리케이션 그래프의 TasksModule에 직접 연결될 예정입니다.

import 배열 안에 AppModule을 넣지 않으면 작업 경로를 사용할 수 없게 됩니다.

현재 설정 테스트



프로젝트의 루트로 이동하여 다음을 입력하십시오.

docker-compose up --build


모든 것이 실행되고 실행되면 TasksModule으로 이동하여 "http://localhost:3001/tasks "메시지가 표시되는지 확인합니다.

마지막 단어



보시다시피 NestJS로 새로운 REST 엔드포인트를 설정하는 것은 매우 쉽습니다.

그러나 너무 많은 파일과 개념이 관련되어 있다고 생각할 수 있습니다. 그런 작은 프로젝트에 대해서는 그것이 사실이라고 생각하지만, NestJS는 중대형 프로젝트를 다룰 때 가장 빛을 발한다는 점을 명심하십시오.

좋은 웹페이지 즐겨찾기