[TIL] Nest.js - 기본 개념 정리

sooyoung choi·2023년 12월 21일
0

nestjs

목록 보기
3/4
post-thumbnail

1. main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  
  // AppModule이라는 모듈을 루트 모듈로 사용하는 Nest.js 어플리케이션 인스턴스를 생성해줘
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();
  • Nest.js 진입점으로 사용되는 파일
  • 파일 이름은 임의로 변경하면 절대 안됨
  • AppModule → app.module.ts 파일에 정의되어 있으며 모듈 역할을 해준다.


2. Module - 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 {}

@ - 데코레이터

  • 해당 클래스 함수가 어떤 역할 수행하는지 Nest.js에게 알려주는 역할

Nest.js에서의 모듈 - @Module

  • 애플리케이션의 특정 부분을 캡슐화
  • 관련된 컴포넌트, 서비스가 다른 모듈을 그룹화 해준다.
  • 이를 통해 구조적인 아키텍처 패턴을 효과적으로 구현, 관리한다.

1. import

  • 현재 모듈에서 사용하려는 다른 모듈들의 목록을 정의
  • 여기에 명시된 모듈들은 주로 필요한 provider(service) 제공한다. ex) HttpModule, TypeOrmModule등

2. controllers

  • 현재 모듈과 관련된 컨트롤러의 목록 정의
  • 헤당 모듈의 요청 처리 로직 담당한다.
  • 서비스를 반드시 의존해야한다.
  • @Get, @Post, @Put, @Patch, @ Delete

3. Providers

  • 현재 모듈에서 사용하거나 제공하는 서비스, 레포지토리, 팩토리 등의 목록 정의
  • 비즈니스 로직 처리, 데이터 엑세스 같은 작업 수행

4. exports

  • 현재 모듈에서 다른 모듈로 제공하려는 서비스의 목록 정의
  • 여기에 명시된 서비스는 현재 모듈 외부에서도 사용할 수 있다.
    다른 모듈에서 특정 서비스를 쓰고 싶으면 exports에 포함시키기!


🙋‍♀️ service(only) + provider VS module exports + imports

service(only) + providermodule exports + imports
사용 시점서비스가 특정 모듈 내에서만 사용되고,
다른 모듈에서 사용되지 않을 때
여러 모듈에서 공통으로 사용할 때


3. contorller - app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  
  // 의존성 주입!!!
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}


4. service = app.service.ts

import { Injectable } from '@nestjs/common';

@Injectable() // <- 난 Inject(주입)될 수 있어! 라고 선언하는 것이에요.
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

서비스의 역할

  • AppService가 나를 필요로 하면 언제든지 주입시켜서 사용할 수 있게 해준다.
  • 컨트롤러에게 서비스를 제공한다.
  • 레포지토리를 반드시 의존하며 비즈니스 로직을 담당한다


5. IoC, DI

IoC - 제어역전

  • 개발자가 사용하고 싶은 객체를 직접 생성하는 것이 아니라 객체의 생명주기 관리 자체를 외부(Nest.js IoC 컨테이너)에 위임을 한다.
  • 객체 관리를 컨테이너에게 맡겨서 제어권이 넘어갔지 때문에 제어역전 이라고 하는 것.

전통적인 방식

  • 직접 객체를 생성하므로 강하게 결합된다.
  • 의존하는 서비스가 변경되면 개발자도 그에 맞춰 코드를 수정해야한다.
this.appService = new AppService();
  • IoC 원칙을 사용하면 인터페이스나 추상 클래스에 의존하게 되니 서비스 자체가 변경되어도 관계 없이 사용할 수 있다.

Nest.js는 이 원칙을 지원한다.


IoC 원칙 구현 방법 → 의존성 주입 DI

  constructor(private readonly appService: AppService) {} 
  • constructor(private readonly appService: AppService)
    - AppService의 인스턴스는 Nest.js의 DI 컨테이너에 의해 생성되고 관리

  • 개발자는 직접 new AppService()와 같이 객체를 생성하거나 관리할 필요가 없다.

  • 코드의 결합도를 낮추고, 유연성과 테스트 용이성을 향상시킨다.

0개의 댓글