Nest.js와 친해지기

Created
Jun 9, 2024 09:13 AM
설명
Status
Tag
Tags
Select

Nest.js

Nest.js는 Node.js 런타임 위에서 동작하는 typescript를 사용한 백엔드 프레임워크라고 합니다.
Nest.js 는 Express, Fastify와 같은 HTTP 프레임워크를 래핑하고 하위 프레임워크 위에 추가적인 구조화된 아키텍쳐와 기능을 제공합니다.
제가 가장 먼저 느낀건 Angular가 생각이 났는데요.
어노테이션이나 CLI, 구조가 상당히 유사해 보였고 실제로도 영감을 받았다고 합니다.

주요 컨셉

컨트롤러(Controllers)

컨트롤러는 HTTP 요청을 처리하고 응답을 반환하는 역할을 합니다.
Express의 router라고 보면 될 것 같네요.
import { Controller, Get } from '@nestjs/common'; import { CatsService } from './cats.service'; @Controller('cats') export class CatsController { constructor(private readonly catsService: CatsService) {} @Get() findAll(): string { return this.catsService.findAll(); } }

서비스(Services)

서비스는 비즈니스 로직을 캡슐화 하고 컨트롤러에서 호출됩니다.
@Injectable 데코레이터를 사용해 의존성 주입 시스템에 등록됩니다.
import { Injectable } from '@nestjs/common'; @Injectable() export class CatsService { findAll(): string { return 'This action returns all cats'; } }

모듈(Modules)

관련 기능을 그룹화 하는 단위로, 어플리케이션의 구성 요소를 캡슐화 하고 서로의 의존성을 관리하는 데 사용합니다.
import { Module } from '@nestjs/common'; import { CatsController } from './cats.controller'; import { CatsService } from './cats.service'; @Module({ controllers: [CatsController], providers: [CatsService], }) export class CatsModule {}

IoC 제어의 역전, DI 의존성 주입

제어의 역전(IoC, Inversion of Control)

쉽게 이야기 하자면 Nest.js IoC 컨테이너에게 제어를 위임한다는 말이라고 합니다.
기존 Express.js로 어플리케이션을 작성한다면 객체 인스턴스의 생성과 제거의 생명 주기를 직접 관리해야 했지만,
이를 Nest.js의 IoC 컨테이너에게 위임 즉, 제어를 Nest.js에게 넘겨 관리하게 됩니다.
import { Controller, Get } from '@nestjs/common'; import { CatsService } from './cats.service'; @Controller('cats') export class CatsController { // 사용할 서비스를 미리 선언 private catService: CatService; constructor() { this.catService = new CatService; // 생성자에서 직접 생성 } }
직접 선언하고 관리
import { Controller, Get } from '@nestjs/common'; import { CatsService } from './cats.service'; @Controller('cats') export class CatsController { constructor(private readonly catsService: CatsService) {} ... }
객체의 생명 주기를 nest.js IoC에 위임

의존성 주입(DI, Dependency Injection)

DI는 IoC를 구현하는 방법 중 하나로, 객체의 의존성을 외부에서 주입하는 방법입니다.
import { Controller, Get } from '@nestjs/common'; import { CatsService } from './cats.service'; @Controller('cats') export class CatsController { // CatsController 에게 CatsService를 주입 constructor(private readonly catsService: CatsService) {} ... }
 

싱글 스레드

 

1. 비동기 프로그래밍 모델

싱글 스레드 환경에서는 I/O 작업(네트워크, 파일 시스템 접근 등)을 비동기적으로 처리해 블로킹을 피하는게 중요합니다.

2. 작업 분할

싱글 스레드 환경에서는 CPU 집약적인 작업을 분할해 메인 이벤트 루프를 블로킹하지 않도록 주의해야 합니다.