본문 바로가기

Backend/NestJS

controller의 역할

※ 본 영상은 Nomad Coder의 'NestJS로 API 만들기' 영상을 보고 작성한 내용입니다.

 

1. NestJS의 Controller와 다른 프레임워크와의 유사성 

Java-Spring의 Controller, Express의 controller/router의 기능과 같다. 

 

저번 포스팅에서도 언급했던 것처럼, 

main.ts+Controller+Service 이 셋은 뗄레야 뗄 수 없는 관계이다. 

 

2. @Module의 역할 

Module 모듈은 하나의 기능을 하는 앱이라고 생각하면 된다. 

ex) 유튜브에서는 video 모듈, photo 모듈이 필요할 것이다. 

인증에 관한 모듈은 auth 모듈이 될 것이다. 

 

3. Controller와 main.ts 그리고 Service와의 관계 

 

[ 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();

1) 저번 포스팅에서도 언급했듯이, bootstrap()은 함수 이름이고 다른 이름으로 바꿔서 쓸 수 있다. 

2) NestFactory를 통해 app이 create되어 app이 만들어진다. 

 

* NestFactory : Nest 애플리케이션 인스턴스를 생성하기 위한 클래스

NestFactory에서 응용프로그램을 만들 수 있는 몇 가지 정적 메서드를 제공하는데 그 중 하나가 create()이다. 

위의 main.ts에서 HTTP 리스너를 시작하면 애플리케이션이 인바운드 HTTP 요청을 기다릴 수 있다. (이건 다음 포스팅에 정리할 예정) 

 


[ app.controller.ts ] 

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

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

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

1) Controller 데커레이터 

Controller의 역할은 url을 가져오고 함수(function)을 실행하는 역할이다. 

2) @Get('/hello') 라는 url이 삽입

여기서 @Get은 express의 Get 라우터, Java spring의 @Get과 같은 역할을 한다. 

그래서 /hello 라는 url을 요청하면 그에 맞는 값을 아래에서 return~으로 응답한다. 

 


[ app.service.ts ] 

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

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

1) Controller 단에서 /hello 라는 url 요청이 들어왔을 시 return this.appService.getHello()를 반환한다고 했다. 

그래서 appService로 이동되었다. AppService 클래스를 살펴보니 내부에 getHello()메소드가 있고, 'Hello Errrrbody!';라는 string 형태의 문자열을 return 해준다고 한다. 

2) 그래서 결론적으로, Controller단에서 /hello에 대한 Get 요청에 대한 응답은 ---> 

Service(여기서는 appService)의 클래스 부분 - 메소드(getHello())를 통한 응답으로 브라우저에 보여준다(반환해준다) 

url - localhost:3000/hello 

브라우저에 보이는 화면 - Hello Errrrrbody!