이번에 Spring framework를 이용해 간단한 API를 몇 개 만들고 난 후, framework의 강점에 대해 알게 되었습니다.
그러다 Node.js의 백엔드 프레임워크 NestJS가 있다는 것을 알고 이를 알아보기 위해 포스팅하게 되었습니다.
1. NestJS
NestJS는 Node.js를 보완하기 위해 express 위에서 구축된 프레임워크입니다.
TypeScript 기반으로 구축되어 있지만, JavaScript로도 코딩이 가능합니다.
NestJS를 만든 개발자는 Node.js의 아키텍처의 주요한 문제( 너무 자유로운 구조 )를 해결하고자 했습니다.
자유로우면 장점이 아닌가 생각할 수 있지만, 여러 사람들이 협업하는 곳에서는 정해진 틀을 갖춘 것이 더 효율적일 수 있습니다.
그래서 Nest는 개발자와 팀이 확장·테스트 가능하며 코드의 유지 관리가 쉬운 애플리케이션 아키텍처를 제공합니다.
2. 용어
NestJS를 알아보기 전 알아두면 좋은 용어를 정리하고 넘어가겠습니다.
2-1. Decorator( @ )
Nest를 사용하면 자주보이는 글자 중 하나가 @입니다.
이를 데코레이터라고 부르며 '@'문자를 꾸미려는 글자 앞에 붙이고, 항목의 맨 위에 배치하여 적용합니다.
그로 인해 클래스, 메소드, 프로퍼티에 대해 정의할 수 있게 됩니다.
- Class : 객체를 만들어 내기 위한 틀, 설계도
- Method : 클래스나 객체에 속해 있는 함수
- Property : 객체 내에서 선언된 변수
2-2. DI ( Dependency Injection, 의존성 주입 )
Dependency는 "의존성"으로, 어떤 객체가 다른 객체를 참조할 때 의존성을 갖는다라고 합니다.
높은 의존성은 객체 간의 종속성이 높아져 독립적인 테스트가 어렵기 때문에 의존성 주입이 필요합니다.
의존성 주입이란, 객체가 필요로 하는 의존 객체를 외부에서 제공(주입)하는 방식으로 느슨한 결합이 가능합니다.
2-3. IoC( Inversion of Control, 제어의 역전 )
객체의 생성과 생명 주기 관리를 개발자가 아닌 프레임 워크가 담당합니다.
이를 통해 개발자는 비즈니스 로직 구현에 집중할 수 있어 코드의 결합도를 낮추고, 유지 보수성을 향상시킵니다.
2-4. Provider
Nest에서의 기본 개념 중 하나입니다. Nest에서 Service, Repositories, factories ... 는 모두 Provider에 해당합니다.
Provider의 주요 아이디어는 의존성 주입이 가능하다는 점입니다. 이를 통해 객체가 서로 다양한 관계를 생성할 수 있고, 이러한 객체를 연결하는 기능을 Nest 런타임 시스템에 위임합니다.
쉽게 말해 의존성 주입을 통해 다른 클래스에 서비스를 제공하는 객체로 애플리케이션 여러 부분에서 객체 생성 및 공유를 관리하는 데 사용할 수 있습니다.
2-5. Module
Nest의 모듈은 모듈 내에서 Providers를 선언하고, 이것들이 어떻게 서로 연결되고 외부에서 사용될 수 있는지 정의합니다.
IoC 컨테이너에 의해 관리되는 Provider들의 집합이라고도 볼 수 있습니다.
Nest로 만든 애플리케이션에는 Root Module이라는 하나 이상의 모듈이 있습니다. 이 모듈은 애플리케이션 그래프를 구축하는 데 사용되는 시작점입니다.
2-6. Controller
Nest에서의 컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환하는 역할을 담당합니다.
import { Controller, Get } from '@nestjs/common'
@Controller('cats')
export class CatsController {
@Get('sayhello')
hello(): string{
return 'Hello!';
}
}
@Controller( )의 괄호 안의 글자는 엔드 포인트를 나타냅니다. ( ex. localhost3000/cats )
컨트롤러에는 Routing( 어느 경로로 요청을 받을지 ) 메커니즘을 가지고 있습니다.
2-7. Middleware
HTTP 요청 처리 과정에서 가장 먼저 실행되면, Route handler 전에 호출되는 함수입니다.
주로 Req(요청), Res(응답), Next(다음 미들웨어로 넘어가는 함수) 세 가지 파라미터를 사용합니다.
2-8. Pipe
Pipe는 들어오는 요청 데이터를 Route handler에 넘기기 전에 처리·반환 ·유효성 검사하는 역할을 합니다.
Pipe를 활용해 허가되지 않은 접근을 막거나, 들어오는 값의 Type을 설정해 주는 등 여러 역할을 할 수 있습니다.
2-9. Interceptor
Interceptor는 데이터나 요청이 애플리케이션의 특정 부분을 통과할 때 가로채는 역할을 담당합니다. 주로 네트워크 요청을 처리하거나 로깅, 데이터 변환, 요청 timeout을 할 때 자주 사용됩니다.
2-10. Exception filters
Nest에는 애플리케이션 전체에서 처리되지 않은 모든 예외를 처리하는 Exception layer가 내장되어 있습니다.
코드에서 처리되지 않은 예외가 발생 시 이 계층에서 적절한 유저친화적인 응답을 자동으로 전송합니다.
이 작업은 내장된 전역 예외 필터(Global Exception filter)에 의해 수행되며, 이 필터는 HttpException 유형의 예외를 처리해 줍니다.
2-11. Guard
Guard는 들어오는 요청을 검사하고, 그 요청이 특정 조건을 충족하는지 결정하는 역할을 합니다.
예를 들어, 사용자가 로그인 없이 페이지에 접근하고자 할 때, 특정 기능은 사용할 수 없도록 막는 기능을 수행합니다.
3. 전체적인 흐름

4. NestJS 사용하기
// NestJS 다운로드
> npm i -g @nestjs/cli
// 프로젝트 생성
> nest new

NestJs를 다운받은 후 nest new를 이용해 프로젝트를 생성합니다.
프로젝트 이름을 입력 후 Package manger를 선택하면 프로젝트가 자동으로 생성됩니다.
5. NestJS 프로젝트 구조
프로젝트를 생성하면 다음과 같은 기본 구조를 생성해 줍니다.
├── README.md
├── nest-cli.json
├── node_modules
├── package-lock.json
├── package.json
├── src
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── main.ts
├── test
│ ├── app.e2e-spec.ts
│ └── jest-e2e.json
├── tsconfig.build.json
└── tsconfig.json
5-1. main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
main.ts에서는 RootModule을 NestFactory.create()메소드에 넘겨줍니다. 이를 통해 NestJS 애플리케이션 인스턴스가 생성됩니다.
그리고 app.listen()메소드를 통해 3000 포트로 서버를 실행합니다.
5-2. 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 {}
보통의 Root Module이름은 app.module로 생성이 됩니다.
imports : 모듈에서 필요로 하는 provides는 export 하는 import 모듈의 목록
controllers : 인스턴스화되어야 하는 모듈 내의 정의된 컨트롤러 집합
providers : Nest 주입자에 의해 인스턴스화 될, 그리고 최소 이 모듈 전체에서 공유될 수 있는 providers 모음
exports : 모듈에서 제공되며 이 모듈을 import 하는 다른 모듈에서 사용 가능하게 하는 providers의 부분 집합, provider 자체나 provider의 token(provider value)을 사용할 수 있다.
6. Nest 명령어
cmd창에 nest를 입력하면 다양한 명령어들에 대해 알 수 있습니다.
> nest

// 컨트롤러 생성 ( generate controller )
> nest g co
// 서비스 생성 ( generate service )
> nest g s
참고
NestJS - A progressive Node.js framework
NestJS is a framework for building efficient, scalable Node.js web applications. It uses modern JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Reactive Progr
nestjs.com
[NestJS] NestJS 시작 전에 알아야 하는 백엔드 지식
NestJS에 대해서 모든걸 샅샅이 알아보도록 합시다. 이번 포스팅은 그 대장정의 첫 발걸음으로 NestJS에 대한 간략한 소개와 백엔드 관련 용어의 의미를 정리해보는 시간이 될 것 입니다. 아무리 Nes
cdragon.tistory.com
[NestJS] NestJS와 관련된 기술 용어 정리 (DI, IoC, AOP 등...)
1. 애플리케이션 패러다임 용어 정리 1-1. DI(Dependency Injection) 의존성 주입을 알아보기 전에 먼저 Dependency, 즉 "의존성"이라는 것이 무엇을 말하는지 알아보겠습니다. 어떤 객체가 다른 객체와 직접
cdragon.tistory.com
'NestJS' 카테고리의 다른 글
| [NestJS] 간단한 CRUD 기능 만들기 (0) | 2024.07.09 |
|---|