NestJS 2부 시도: REST 엔드포인트 생성
소개
내 , 나는 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);
}
}
Tasks
은 TypeScript 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 {}
Tasks
은 TypeScript 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는 중대형 프로젝트를 다룰 때 가장 빛을 발한다는 점을 명심하십시오.
Reference
이 문제에 관하여(NestJS 2부 시도: REST 엔드포인트 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/arnaudcortisse/trying-out-nestjs-part-2-creating-rest-endpoints-1cc8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)