devlog_zz

[NestJS] #1 Architecture of NestJS 본문

Back End/NestJS

[NestJS] #1 Architecture of NestJS

YJ_SW 2022. 9. 15. 17:05
728x90

1.0 Overview

이와 같은 파일 구조가 자동으로 만들어진다.

app.controller.ts : 단일 경로가 있는 기본 컨트롤러입니다.

app.controller.spec.ts : 컨트롤러에 대한 단위 테스트입니다.

app.module.ts : 애플리케이션의 루트 모듈입니다.

app.service.ts : 하나의 방법으로 기본 서비스를 제공합니다.

main.ts : 핵심 기능 NestFactory 을 사용하여 Nest 애플리케이션 인스턴스를 생성하는 애플리케이션의 항목 파일입니다.


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

Nest 애플리케이션 인스턴스를 생성하기 위해 코어 NestFactory 클래스를 사용한다. Nest Factory 애플리케이션 인스턴스를 생성할 수 있는 몇 가지 정적 메소드를 노출한다. 이 메소드는 인터페이스 create()를 수행하는 응용프로그램 개체를 반환한다.

await NestFactory.create(AppModule) 호출하고

3000 포트를 리슨하겠다.

npm run start

파일에 정의된 포트에서 수신 대기하는 HTTP 서버로 앱을 시작한다.src/main.ts 애플리케이션이 실행되면 브라우저를 열고 http://localhost:3000 으로 이동한다.

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

**@Module**({ // 여기를 봐야 한다.
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {} // AppModule은 비어있는데 위의 데코레이터 모듈부분을 봐야한다.

데코레이터 : 클래스에 함수 기능을 추가할 수 있다.

클래스 위의 함수이고, 클래스를 위해 움직인다고 생각하면 된다.

데코레이터는 클래스를 필수 메타데이터와 연결하고 Nest가 라우팅 맵을 생성할 수 있도록 한다. ( 요청을 해당 컨트롤러에 연결 )

Module , Controller, Service

서비스 : 기본적으로 클래스이고, 함수를 가지고 있다.

app.controller.ts

import { Controller, Get } 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(); // getHello()를 리턴한다.
  }
}

app.service.ts

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

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

서비스는 기본적으로 클래스이고 함수를 가지고 있다.


파일의 변경 사항을 감시하려면 다음 명령을 실행하여 애플리케이션을 시작할 수 있습니다.

$ npm run start:dev

이 명령은 파일을 감시하여 자동으로 서버를 다시 컴파일하고 다시 로드합니다.

package.json

localhost:3000 으로 이동하면 Hello World 볼 수 있다.

1.1 Controllers

NestJS 애플리케이션은 main.ts에서 시작한다.

AppModule은 루트 모듈 같은 것이다. 모듈은 어플리케이션의 일부분이다. 한 가지 역할을 하는 앱이다.

예를 들어 인증을 담당하는 어플리케이션이 있다면 그게 users 모듈이 될 것이다.

다른 예로 인스타그램을 만든다면 photos 모듈, videos 모듈 필요할 것이다.

컨트롤러

컨트롤러는 들어오는 요청 을 처리하고 클라이언트에 응답 을 반환하는 역할을 한다.

컨트롤러가 하는 일은 기본적으로 url을 가져오고 함수를 실행하는 것이다.

컨트롤러는 express의 라우터 같은 존재이다.

컨트롤러의 @Get 데코레이터는 express의 get라우터와 같은 역할을 한다.

컨트롤러는 애플리케이션에 대한 특정 요청을 수신한다. 라우팅 매커니즘은 어떤 컨트롤러가 어떤 요청을 수신하는지 제어한다.

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

  @Get('/hello')
  sayHello(): string {
    return 'Hello Hello Say Hello';
  }
}

컨트롤러는 url로의 요청을 받는다. 여기서 url은 /hello가 될 것이다. @Get 데코레이터 덕분에 NestJS는 사용자가 /hello url 로 들어왔을 때 sayHello() 함수를 실행시켜줘야한다는 사실을 알 수 있다.

⇒ 컨트롤러는 express.js의 controller/router 같은 거다.

( express.js에서는 라우터에서 app.get이라고 쓰고 함수를 썼다. )

⇒ url을 가져와서 함수로 매핑 ( /hello 가 sayHello 함수를 실행 )

라우팅

@Controller() 데코레이터를 사용해 basic controller정의한다. ‘cats’로 시작하는 optional route를 정의한다. 경로 세트를 쉽게 그룹화하고 반복적인 코드를 최소화해준다.

import { Controller, Get } from '@nestjs/common';

@Controller(**'cats'**)
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

메소드 앞의 @Get() HTTP 요청 메소드 테코레이터는 Nest가 HTTP request의 특정 엔드포인트를 핸들링하게 해준다. 엔드포인트는 HTTP 요청 방법 ( 이 경우 GET ) 및 route path에 해당된다. route path란 핸들러의 route path는 컨트롤러에 대해 선언된 접두사와 메소드 데코레이터에 지정된 경로를 연결하여 결정된다.

엔드포인트에 GET 요청이 발생하면 Nest는 요청을 사용자 정의 findAll() 메소드로 라우팅한다. 여기서 선택하는 메소드 이름은 완전히 임의적이다.

위의 예제에서 @Controller(’cats’) 를 통해 모든 경로에 대해 접두사를 ‘cats’로 선언했고 @Get() 와 같이 데코레이터에 경로정보를 추가하지 않았기 때문에 Nest는 GET /cats 요청을 이 핸들러에 매핑한다. 다른 예로 @Get(’profile’)는 GET /cats/profile 이 매핑될 것이다.

헤더

사용자 정의 응답 헤더를 지정하려면 @Header()데코레이터 또는 라이브러리별 응답 객체를 사용하고 res.header()직접 호출할 수 있습니다.

@Post()
@Header('Cache-Control', 'none')
create() {
  return 'This action adds a new cat';
}

1.2 Services

Provider

기본 Nest 클래스는 서비스, 레파지토리, 팩토리, 헬퍼 등등의 프로바이더로 취급 될 수 있다. Provider의 주요 아이디어는 의존성을 주입 할 수 있다는 점이다. 이 뜻은 객체가 서로 다양한 관계를 만들 수 있다는 것을 의미한다.

sayHello와 같이 바로 return 하면 되는데 왜 getHello는 return 에 service를 사용하지 ? ⇒ Services

NestJS는 Controller와 비즈니스 로직을 구분 짓고 싶어한다. 컨트롤러는 그냥 url을 가져오는 역할일 뿐이다. 그리고 function을 실행하는 정도이다. 하지만 나머지 비즈니스 로직은 서비스로 간다.

서비스는 일반적으로 실제로 function을 가지는 부분 이다.

app.service.ts

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

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello NestJS!';
  }
  **getHi**(): string {
    return 'Hi Hi Hi';
  }
}

컨트롤러 이름과 서비스이름이 동일할 필요는 없다.

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

NestJS에는 모듈이 존재

루트 모듈같은 AppModule 존재, 오직 하나의 모듈만 존재할 수 있다.

AppModule에서는 우리가 하는 모든 걸 import 한다.

  • Controller는 url을 가져오고 function을 리턴
  • Service는 비즈니스 로직을 실행하는 역할, function을 정의

@Injectable()데코레이터는 메타 데이터를 첨부하여 CatsService가 Nest IoC 컨테이너에서 관리할 수 있는 클래스임을 선언합니다.

 

 

출처

https://nomadcoders.co/nestjs-fundamentals

https://docs.nestjs.com/

728x90

'Back End > NestJS' 카테고리의 다른 글

[NestJS] #4 E2E Testing  (0) 2022.09.15
[NestJS] #3 Unit Testing  (0) 2022.09.15
[NestJS] #2 Rest API  (0) 2022.09.15
[NestJS] #0 INTRODUCTION  (0) 2022.09.15
Comments