2. nest 구조 - controller, provider

9733 단어 nestnest

nest의 구조는 express와 비슷하다.

  • controller
  • service(provider)
  • dto
  • ...

controller - HTTP 요청을 처리해서 응답하는 역할을 하는 클래스, service에서 실제 로직을 처리한다.

// hello.controller.ts
import { Controller, Get, Param, Logger } from '@nestjs/common';
import { HelloService } from './hello.service';

@Controller('hello')
export class HelloController {
  constructor(private readonly helloService: HelloService) {}
  logger: Logger = new Logger(HelloController.name);

  @Get()
  async showing(): Promise<string> {
    try {
      return this.helloService.showing();
    } catch (error) {
      this.logger.error(error?.message ?? '');
      throw error;
    }
  }

  @Get('/:content')
  async reShowing(@Param('content') content: string): Promise<string> {
    try {
      return this.helloService.reShowing(content);
    } catch (error) {
      this.logger.error(error?.message ?? '');
    }
  }
}

controller임을 명시해주는 @Controller() annotation.
이 안에 있는 'hello' 는 라우팅을 뜻한다.
즉, localhost:30000/hello 이다.
생성자로 helloService를 주입받는다. 이를 DI라고 하는데, 나중에 다시 확인하자.
또한 에러 처리를 위해 nest안의 logger를 가져와서 사용할 수 있다.
이 처럼 express 와는 다르게, 정해진 룰들이 있는 것 같다.

@Get() annotation 을 통해 http method get 함수를 사용함을 알 수 있고, 파라미터 값을 함께 추가할 수 있다.

이처럼 controller는 실제 로직을 구현하지 않고, 클라이언트로 부터 받은 요청을 service에서 처리해서 응답하는 기능을 가지고 있다.


service - controller의 응답의 구체적인 로직

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

@Injectable()
export class HelloService {
  async showing(): Promise<string> {
    return 'here is for hello page';
  }
  async reShowing(content: string): Promise<string> {
    return `${content} is re showing !!!`;
  }
}

service(provider)임을 알 수 있게, @Injectable annotation 를 명시해준다.
이는 종속성을 주입할 수 있는 클래스 입니다 - provider 라는 의미를 가진다.
promise 객체를 반환하는 비동기 처리를 통하여 실제로 클라이언트에게 보내는 값을 반환한다.

provider

provider은 대부분의 로직을 처리한다.

  • 사용자 인증: Guards
  • 클라이언트가 보내는 데이터 필터링: Pipes
  • 비즈니스 로직: Service or Handler
  • 예외처리: Exception Filters
  • Porvider 처리 과정 중 위에 해당하지 않는 무언가를 하고 싶을 때: Interceptor
  • 미들웨어: Express의 Middleware와 동일

미들웨어를 거친 후, 사용자가 접근가능한 사용자인지 확인한다.(Guards)
이후 Pipes에서 클라이언트가 보낸 데이터를 가공한다. 예를 들어, string -> number (Pipes)
이후 해당 데이터에 대한 비즈니스 로직을 실행한다. (Handler, serivce)
예외 처리를 한다. (Exception Filters)

좋은 웹페이지 즐겨찾기