Frontend/Nest.js

NestJS : 아키텍처

wam 2023. 1. 9. 11:58

 

  1. Main에서 AppModule로 들어갔고
  2. AppModule에서 Controller로 들어갔고
  3. Controller에서는 Service로 들어갔다.
  4. Service에서는 텍스트를 변경하면 localhost:3000 이 변경되었다.

 


 

Main

NestJs는 main.ts 파일을 가지고 있고 무조건 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();
  • NestJs 애플리케이션은 main.ts 에서 시작한다.
  • 하나의 모듈에서 애플리케이션을 생성한다.
  • 앱 모듈은 모든 것의 루트 모듈 같은 것이다.
  • 모듈이란 애플리케이션의 일부분이다.
  • 예를 들어 인증을 담당하는 애플리케이션이 있다면, 그게 users 모듈이 된다.

 

 


 

Module

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  • 진행하는 모든 import 해주기

 

@Module는 데코레이터이다.
데코레이터클래스에 함수 기능을 추가할 수 있다.
클래스 위의 함수이고, 클래스 위에 움직인다 생각하면 된다.

 

export class AppModule {}

위처럼 클래스는 비어 있어 보이지만 @Module  안에 있다.

 

 


 

Controller

Controller는 URL를 가져오는 역할
nodeJs의 Controller는 express의 라우터 같은 존재
import { Controller, Get, Post } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  // [ 데코레이터랑 함수 사이에 빈칸 두지 않기 ]
  // 이렇게 데코레이터와 함수를 띄어서 작성하면 안된다.
  // 이처럼 데코레이터는 꾸며주는 함수나 클래스랑 붙어야 한다.

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

  @Get('/hello')
  sayHello(): string {
    return this.appService.getSay(); 
    // sayHello(), getSay() = Controller함수와 Service함수 이름이 같지 않아도 된다. 
  }

  @Post('/hi')
  sayHi(): string {
    return 'TEST - Hi ~';
    // 이처럼 string 값을 작성해도 브라우저에서 작동하지만 
    // NestJs는 Controller를 비즈니스 로직이랑 구분 짓고 싶어한다.
    // - Controller는 URL 를 가져오는 역할
    // - Service는 일반적으로 실제로 Function 을 가지는 부분
  }
}
  • URL을 가져오고 Function을 리턴
  • URL 매핑
  • request 받음
  • query로 넘겨주는 역할
  • Body를 넘기는 역할

 

@Get 데코레이터

이것이 express의 get 라우터와 같은 역할을 한다.
Controller는 expressJs의 controller/router 같은 것이다!
expressJs에서는 라우터에서 app.get이라고 쓰고 함수를 썼다.
@Get('/hello')라고 하는 것만 빼면 비슷하다.
URL을 가져와서 함수로 매핑하는 것!
NestJs 덕분에 라우터를 세팅하지 않아도 자동으로 된다.

 

 


 

Service

Service는 일반적으로 실제로 Function을 가지는 부분
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello Nest!';
  }

  getSay(): string {
    return 'Say Nest!';
  }
}
  • Function을 놓는 곳
  • 로직 관리
  • 비즈니스 로직을 실행하는 역할
  • 필요하다면 데이터베이스에 요청