이 문서는 Google Cloud Translation API를 사용해 자동 번역되었습니다.
어떤 문서는 원문을 읽는게 나을 수도 있습니다.
Nest.js 기본 사항에 대한 시리즈의 두 번째 게시물에 오신 것을 환영합니다! 이 게시물에서는 특히 모듈, 컨트롤러 및 제공자에 중점을 두고 Nest.js의 핵심 개념에 대해 자세히 살펴보겠습니다. 이 게시물을 마치면 이러한 빌딩 블록이 잘 구조화되고 확장 가능한 Nest.js 애플리케이션을 만들기 위해 함께 작동하는 방식을 확실하게 이해하게 될 것입니다.
Nest.js는 효율적이고 확장 가능하며 유지 관리 가능한 서버 측 애플리케이션을 구축하기 위한 강력한 프레임워크입니다. Node.js 위에 구축되었으며 Angular에서 크게 영감을 받았습니다. Nest.js는 코드를 쉽게 구조화하고 종속성을 관리할 수 있는 일련의 추상화 및 규칙을 제공하므로 대규모 애플리케이션 및 팀에 탁월한 선택입니다.
이전 게시물에서는 Nest.js 애플리케이션을 설정하고 간단한 RESTful API를 만드는 기본 사항을 다뤘습니다. 이 게시물에서는 모듈, 컨트롤러 및 공급자에 중점을 두고 Nest.js의 핵심 빌딩 블록을 자세히 살펴보겠습니다.
모듈은 Nest.js 애플리케이션의 기본 빌딩 블록입니다. 이를 통해 코드를 논리 단위로 구성할 수 있으므로 애플리케이션이 성장함에 따라 관리 및 확장이 더 쉬워집니다. 모듈은 가져오기, 내보내기, 컨트롤러 및 공급자와 같은 모듈에 대한 메타데이터를 제공하는 @Module()
데코레이터로 주석이 달린 클래스입니다.
새 모듈을 만들려면 새 TypeScript 파일을 만들고 @Module()
데코레이터로 주석이 달린 클래스를 정의하기만 하면 됩니다. 예를 들어 사용자를 관리하기 위한 모듈을 만들어 보겠습니다.
import { Module } from '@nestjs/common';
@Module({
controllers: [],
providers: [],
})
export class UsersModule {}
이 예에서는 UsersModule
이라는 새 모듈을 만들었습니다. @Module()
데코레이터는 다음 속성을 가진 객체를 취합니다:
controllers
: 이 모듈에 속하는 컨트롤러의 배열입니다.providers
: 이 모듈에 속하는 공급자의 배열입니다.imports
: 이 모듈이 의존하는 다른 모듈의 배열입니다.내보내기
: 이 모듈을 가져오는 다른 모듈에서 사용할 수 있어야 하는 공급자 배열입니다.지금은 controllers
및 providers
배열을 비워 두었지만 이 게시물을 진행하면서 채워나갈 것입니다.
모듈은 내보낸 공급자에 대한 액세스 권한을 얻기 위해 다른 모듈을 가져올 수 있습니다. 이를 통해 각 모듈이 특정 기능이나 도메인을 담당하는 모듈식 분리 아키텍처를 만들 수 있습니다.
모듈을 가져오려면 모듈 @Module()
데코레이터의 imports
배열에 모듈을 추가하기만 하면 됩니다. 예를 들어 DatabaseService
공급자를 내보내는 DatabaseModule
이 있다고 가정해 보겠습니다. 다음과 같이 UsersModule
에서 이 모듈을 가져올 수 있습니다.
import { Module } from '@nestjs/common';
import { DatabaseModule } from './database.module';
@Module({
imports: [DatabaseModule],
controllers: [],
providers: [],
})
export class UsersModule {}
이제 UsersModule
내에서 DatabaseService
공급자에 액세스할 수 있습니다. 명시적으로 DatabaseService
클래스 자체를 가져올 필요는 없습니다. DatabaseModule
이 이를 처리합니다.
모듈에서 공급자를 내보내려면 모듈 @Module()
데코레이터의 exports
배열에 공급자를 추가하기만 하면 됩니다. 이렇게 하면 모듈을 가져오는 다른 모듈에서 공급자를 사용할 수 있습니다. 예를 들어 DatabaseService
를 다른 모듈에서 사용할 수 있도록 만들고 싶다고 가정해 보겠습니다.
import { Module } from '@nestjs/common';
import { DatabaseService } from './database.service';
@Module({
providers: [DatabaseService],
exports: [DatabaseService],
})
export class DatabaseModule {}
이제 DatabaseModule
을 가져오는 모든 모듈은 DatabaseService
공급자에 액세스할 수 있습니다.
컨트롤러는 들어오는 HTTP 요청을 처리하고 응답을 반환하는 역할을 합니다. 애플리케이션의 경로를 정의하고 요청을 처리하고 클라이언트에 데이터를 반환하기 위한 논리를 포함합니다.
새 컨트롤러를 만들려면 새 TypeScript 파일을 만들고 @Controller()
데코레이터로 주석이 달린 클래스를 정의하기만 하면 됩니다. @Controller()
데코레이터는 이 컨트롤러에 정의된 경로의 기본 경로인 단일 인수를 사용합니다. 예를 들어 사용자를 관리하기 위한 컨트롤러를 만들어 보겠습니다.
import { Controller } from '@nestjs/common';
@Controller('users')
export class UsersController {}
이 예에서는 기본 경로가 /users
인 UsersController
라는 새 컨트롤러를 만들었습니다. 즉, 이 컨트롤러에서 정의하는 모든 경로에는 /users
접두사가 붙습니다.
다음으로 UsersModule
에 새 컨트롤러를 등록하겠습니다. 모듈의 @Module()
데코레이터의 controllers
배열에 컨트롤러 클래스를 추가하기만 하면 됩니다.
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
@Module({
controllers: [UsersController],
providers: [],
})
export class UsersModule {}
이제 UsersController
가 Nest.js에 등록되어 들어오는 요청을 처리할 준비가 되었습니다.
컨트롤러에서 경로를 정의하려면 컨트롤러 클래스에 메서드를 만들고 다음 데코레이터 중 하나로 주석을 답니다.
@Get()
@포스트()
@Put()
@삭제()
@패치()
이러한 데코레이터는 HTTP 메서드(GET, POST, PUT, DELETE 및 PATCH)에 해당하며 경로의 경로인 단일 인수를 사용합니다. 경로는 @Controller()
데코레이터에 정의된 기본 경로에 상대적입니다.
예를 들어 모든 사용자를 가져오는 간단한 경로를 정의해 보겠습니다.
import { Controller, Get } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
findAll(): string {
return 'This action returns all users';
}
}
이 예제에서는 findAll()
이라는 새 메서드를 만들고 @Get()
데코레이터로 주석을 추가했습니다. 경로 인수를 제공하지 않았기 때문에 컨트롤러의 기본 경로(이 경우 /users
)에서 경로를 사용할 수 있습니다.
Nest.js는 메서드의 반환 값을 HTTP 응답으로 변환하는 작업을 자동으로 처리합니다. 기본적으로 응답 상태 코드를 200으로 설정하고 콘텐츠 유형을 application/json
으로 설정합니다. 메서드가 개체 또는 배열을 반환하는 경우 Nest.js는 이를 자동으로 JSON으로 직렬화합니다.
그러나 때때로 사용자 정의 헤더, 상태 코드 또는 쿠키 설정과 같이 응답에 대한 더 많은 제어가 필요할 수 있습니다. 이 경우 @Res()
데코레이터를 사용하여 기본 Express 또는 Fastify 응답 객체를 경로 핸들러에 주입할 수 있습니다.
예를 들어 모든 사용자를 가져올 때 사용자 지정 상태 코드를 반환하고 쿠키를 설정한다고 가정해 보겠습니다.
import { Controller, Get, Res } from '@nestjs/common';
import { Response } from 'express';
@Controller('users')
export class UsersController {
@Get()
findAll(@Res() res: Response): void {
res.status(201).cookie('token', '12345').json({ message: 'This action returns all users' });
}
}
이 예제에서는 @Res()
데코레이터를 사용하여 기본 Express Response
개체를 삽입했습니다. 이제 Response
개체의 메서드를 사용하여 상태 코드를 설정하고 쿠키를 설정하고 JSON 응답을 보낼 수 있습니다.
공급자는 애플리케이션 전체에서 논리를 캡슐화하고 공유하는 데 사용할 수 있는 클래스입니다. Nest.js의 내장 종속성 주입 시스템을 사용하여 컨트롤러, 다른 공급자 및 모듈에 주입할 수 있습니다. 공급자는 재사용 가능하고 테스트 가능하며 분리된 코드를 만드는 강력한 방법입니다.
새 공급자를 만들려면 새 TypeScript 파일을 만들고 클래스를 정의하기만 하면 됩니다. 제공자에게 필요한 특별한 데코레이터는 없습니다. 모든 클래스를 공급자로 사용할 수 있습니다. 예를 들어 사용자를 관리하기 위한 공급자를 생성해 보겠습니다.
export class UsersService {
findAll(): string {
return 'This action returns all users';
}
}
이 예에서는 findAll()
이라는 단일 메서드를 사용하여 UsersService
라는 새 공급자를 만들었습니다.
다음으로 UsersModule
에 새 공급자를 등록하겠습니다. 모듈의 @Module()
데코레이터의 providers
배열에 공급자 클래스를 추가하기만 하면 됩니다.
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
이제 'UsersService'가 Nest.js에 등록되었고 컨트롤러나 다른 공급자에 주입할 준비가 되었습니다.
공급자를 컨트롤러나 다른 공급자에 주입하려면 주입하려는 공급자 유형과 함께 생성자 매개 변수를 추가하기만 하면 됩니다. Nest.js는 공급자의 인스턴스 생성 및 주입을 자동으로 처리합니다.
예를 들어, UsersService
를 UsersController
에 주입해 보겠습니다.
import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
findAll(): string {
return this.usersService.findAll();
}
}
이 예에서는 UsersService
유형의 단일 매개변수를 사용하여 UsersController
에 생성자를 추가했습니다. Nest.js는 자동으로 UsersService
인스턴스를 생성하여 컨트롤러에 주입합니다. 이제 usersService
를 사용하여 findAll()
경로 핸들러의 모든 사용자를 가져올 수 있습니다.
이 게시물에서는 모듈, 컨트롤러 및 제공자와 같은 Nest.js 애플리케이션의 핵심 구성 요소를 살펴보았습니다. 이러한 구성 요소를 만들고 등록하는 방법과 경로를 정의하고 요청 및 응답을 처리하고 종속성을 주입하는 방법을 배웠습니다.
이러한 핵심 개념을 이해하면 이제 확장 가능하고 유지 관리 가능한 Nest.js 애플리케이션을 구축하기 위한 견고한 기반을 갖게 됩니다. 이 시리즈의 다음 게시물에서는 미들웨어, 가드 및 인터셉터와 같은 Nest.js 기능에 대해 자세히 살펴보겠습니다.