본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Node.js/Nestjs (Nest.js)

Nestjs 프레임워크 서버(구조 및 컨트롤러) -2

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2022. 6. 29.

 

nest.js에서 기본적인 구조는 메인 - 모듈 - 컨트롤러의 3단계를 따르고 있습니다.  * 아..앵귤러(Angular)!

 

메인(Main)파일은 가장 먼저실행할 모듈을 정하거나 글로벌하게 사용할 기능을 추가하는 역할을 담당 합니다.

또한 포트번호를 바꾼다던지 cors관련 설정을 한다 던지 웹 어플리케이션의 전체의 기능을 관리 합니다.

 

모듈(Module)은 실제 동작을 수행하는 컨트롤러를 묶어주는 역할을 합니다.

또한 providers라는 속성을 통하여 컨트롤러에게 각종 데이터를 공유해주는, 의존성을 주입(inject) 해주는 역할을 제공 하기도 합니다.

이러한 모듈은 단위모듈로 생성이 가능하여 다른 모듈에서 사용 가능하게 export 하거나 import를 할 수 있습니다.

 

컨트롤러(Controller)는 실제 어플리케이션이 동작하는 내용을 수행하는 기능 입니다.

사용자의 요청을 받고 데이터를 저장하고 관리하는 모든 행위를 수행 합니다.

요런 느낌입니다!

 

메인이라는 파일은 Nestjs 프레임워크에서 어플리케이션의 인스턴스를 생성하는 기능 입니다.

c언어의 메인함수라 할 수 있으며 Java로 의미하면 main메소드이며, Node.js에서 제공하는 Express 프레임워크로 생각하면 명령어로 실행하는 파일(예 : npm run 파일)을 의미 합니다.

 

이러한 메인 파일에서 시작과 동시에 가장 먼저 실행하는 모듈이 있습니다.

위 그림으로 보면 "1번 모듈", 소위 루트모듈(root module)이라 불리는 대상을 의미 합니다.

가장 먼저 실행하는 모듈은 아래 메인파일에서 create 함수를 통해 정할 수 있습니다.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';  // <--- 요기에서 모듈을 가져와

async function bootstrap() {
  const app = await NestFactory.create(AppModule); // 가장 먼저 실행하는 모듈로 사용 합니다.
  await app.listen(3000);
}
bootstrap();

 

모듈(Module)에서는 컨트롤러(Controller)를 관리 합니다.

모듈에서 각각의 컨트롤러에게 서로 공유되는 자원을 제공하기도 하고, 다른모듈을 가져오기도 합니다.

그렇기 때문에 위 사진처럼 "1번 모듈"이 "2번 모듈"을 품고있는 모습으로 구성을 할 수 있습니다.

"1번 모듈"이 "2번 모듈"을 가져오는 예로는 "데이터베이스 모듈" 을 설치하여 사용하는 경우를 들 수 있습니다.

 

컨트롤러(Controller)에서는 사용자의 요청에 대해서 응답하고 결과를 돌려주고, 데이터베이스에 접속하거나 다른 API 서버에 요청하고 파일을 생성하는 모든 행동을 하는 역할을 담당 합니다.

이러한 기능을 모두 담당하기에는 비지니스 로직이 복잡하게 얽혀있어 향후 수정하기 어렵기 때문에 서비스(Service)를 만들어 사용하기도 합니다.

 

보면 볼 수록 정말 앵귤러(Angular)와 너무 닮아있습니다..ㅠ

위 관계를 이해하기 어렵다면 먼저 컨트롤러의 역할을 살펴보고, 그리고 모듈의 역할을 살펴 본 뒤에 메인파일의 역할을 살펴보는 것을 추천 드립니다.. ^^;


#컨트롤러(Controller)

 

nest.js에서 컨트롤러는 사용자의 요청에 따라 응답을 하는 역할을 수행 합니다.

먼저 컨트롤러에서 브라우저에서 요청한 파라미터를 받는 기능을 추가하여 보았습니다.

import { Request, Response } from 'express';
import { Controller, Get, All, Res, Req, HttpStatus } from '@nestjs/common';
import { AppService } from './app.service';

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

  @Get() //get방식 요청에 응답 합니다. 값이 비어있으면 기본 루트를 의미 합니다.
  getHello(): string {
    return this.appService.getHello();
  }

  @All('hello') // http:x.x.x.x:3000/hello 요청에 응답합니다.(get, post 방식 등)
  모든요청(@Req() req: Request, @Res() res: Response): void {
    //post 방식 파라미터 받는 방법 : req.body
    //get 방식 파라미터 받는 방법 : req.query
    const param = req?.body?.length ? req.body : req.query;
    res.status(HttpStatus.OK).send({ yourData: param });
  }
}

 

nestjs 프레임워크는 express프레임워크가 포함되어 있습니다.

그렇기 때 문에 요청받은 Request객체나 응답에 사용하는 Response 객체를 express 프레임워크의 객체로 타입을 지정 해 줄 수 있습니다.

새롭게 추가한 코드는 hello 라는 get, post 방식 등의 요청을 받게 되면 해당 받은 요청에서의 파라미터를 가져오게 한 뒤 해당 값을 그대로 다시 리턴하는 컨트롤러 입니다.

데이터 파싱이 매우 쉽습니다. Express에서는 post방식 파라미터를 파싱하려면 추가 모듈을 직접 설치했었죠..

 

또한 사용자가 지정한 타입으로도 데이터를 반환 할 수 있습니다.

데이터가 Object 형식으로 되어있는 경우에는 기본적으로 Content-type json으로 되어 있습니다.

import { Request, Response } from 'express';
import { Controller, Get, All, Res, Req, HttpStatus } from '@nestjs/common';
import { AppService } from './app.service';

type MyDataType = {
  name: string;
  phone: number;
  day: Date;
  yourData?: any;
};

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

  @Get() //get방식 요청에 응답 합니다. 값이 비어있으면 기본 루트를 의미 합니다.
  getHello(): string {
    return this.appService.getHello();
  }

  @All('hello') // http:x.x.x.x:3000/hello 요청에 응답합니다.(get, post 방식 등)
  모든요청(@Req() req: Request, @Res() res: Response): void {
    //post 방식 파라미터 받는 방법 : req.body
    //get 방식 파라미터 받는 방법 : req.query
    const param = req?.body?.length ? req.body : req.query;
    res.status(HttpStatus.OK).send({ yourData: param });
  }

  @All('json') // 지정된 형식으로 반환
  Json으로리턴(@Req() req: Request): MyDataType {
    const param = req?.body?.length ? req.body : req.query;
    return { name: 'name', phone: 1234, day: new Date(), yourData: param };
  }

  @All('array') // 배열로 반환
  Array으로리턴(): Array<any> {
    return [1, 2, 3, 4, 5];
  }
}

 

위 코드는 MyDataType이라는 타입을 만들어 준 후에 해당 타입으로 데이터를 만들어 리턴한 모습 입니다.

헤더에 응답형식을 지정하지 않더라도 nest.js에서는 express와 비슷하게 해당 데이터가 Object 형식 이라면json 형식으로 반환합니다.

 * type이라는 키워드는 컴파일을 하게되면 사라지면서 Object만 남게되는 개발간 필요한 제한요소 기능입니다.

물론 마지막에 보이는 array 라는 요청은 배열이라는 형태로 값을 반환하기 때 문에 일반 문자열로 반환합니다.

json 형식으로 반환

 

여기까지가 컨트롤러에 대한 기본사용 방법 이였습니다.

위 내용에 사용된 샘플 코드는 제 깃허브에 올려두었습니다.

https://github.com/TaeSeungRyu/NestProject/tree/main/step1

 

GitHub - TaeSeungRyu/NestProject: Nestjs 프로젝트

Nestjs 프로젝트. Contribute to TaeSeungRyu/NestProject development by creating an account on GitHub.

github.com

 

다음 포스팅에서는 컨트롤러에서 사용하는 서비스, 생성자와 의존성 주입에 대해서 살펴보겠습니다.

궁금한점 또는 틀린부분은 언제든 연락 주세요!

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글