[NestJS] 기초 개념

김형주·2021년 9월 16일
0

Backend Study

목록 보기
14/19

NestJS는 효율적이고 확장가능한 NodeJS Server-Side 어플리케이션을 만들기 위한 프레임워크이다. 내부적으로 ExpressJS를 사용하며, 초기 설정을 통해서 Fastify를 사용할 수 있다.

NestJS

NodeJS 및 Server Side JS를 위한 수많은 우수한 Library와 Helper, Tools가 있지만, 아키텍처 문제를 효과적으로 해결한 라이브러리는 전무하다. 이를 위해서 NestJS 팀은 1.테스트가 용이하며, 2.확장 가능및 느슨한 결합, 3. 유지 관리에 용이한 조건의 웹 서버 라이브러리로서 NestJS를 개발했다. 아키텍처는 Angular로부터 많은 영감을 받았다.

설치 방식

CLI를 통해서 설치한다.

$ npm i -g @nestjs/cli
$ nest new nest_practice

src directory

nest new nest_practice 명령어를 통해서 새로운 Nest App을 구축하면, node_module, src등과 eslint, tsconfig, prettier등 환경 설정과 같은 파일들이 생성된다. 먼저 src 내부 디렉토리 구조를 살펴보자.

src
├ app.controller.ts
├ app.controller.spec.ts
├ app.module.ts
├ app.service.ts
⎣ main.ts
  • app.controller.ts
    하나의 경로(root, /)를 지닌 기본 컨트롤러
  • app.controller.spect.ts
    컨트롤러에 대한 유닛테스트
  • app.module.ts
    Nest 어플리케이션의 루트 모듈, 모든 Nest모듈은 이 모듈에 연결되어있어야 한다.
  • app.service.ts
    하나의 메소드를 가진 기본 서비스
  • main.ts
    Nest App instance를 생성하는 함수 NestFactory를 사용하는, Nest 어플리케이션의 Entry 파일

Express.js


Nest는 Express를 기반으로하고 있기 때문에 기본 Express 서버코드와 비교해보며 알아보는 것이 도움이 될 수도 있다. 아래 코드는 express에서 controllerrouter를 분리해서 사용하는 예시다.

//controller.js
export function sayHello (req, res) {
	res.send('Hello World!');
}

// router.js
const router = express.Router();
router.get('/', sayHello);

export default router;

// app.js
app.use('/', router);

//http://localhost:3000/
Hello World!

Nest.js


Controller

Nest에서 Controller는 Express에서의 Router라고 생각하면된다.
(Service는 바로 다음에 쓸거다.)

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

@Controller()
export class AppController {
  constructor(private readonly appService: AppService){}
  
  @Get()
  sayHello(): string {
    return this.appService.sayhello();
  }
}

@Controller()는 express의 app.use('/', router)에서 '/'와 같은 역할을 한다. @Controller('say') 이렇게 인자로 string을 넘겨주면 express에서 app.use('/say', router)로 작성한 코드와 동일한 기능을 한다.

AppController 코드를 해석해보면, 루트경로로 GET요청이 들어오면

appService 안의 sayHello 함수를 실행하고 결과를 반환해라

와 동일하게 작동한다. 추가적으로 @Get(), @Post(), @Delete() 등 다른 HTTP 요청 메소드도 동일하게 처리할 수 있는 데코레이터가 있다.

Service

Nest에서 Service는 express에서의 controller라고 생각하면 된다. Nest의 Controller와 비지니스 로직을 분리하기 위해 Service가 존재한다.

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

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

위와 같이 메소드를 정의하고 AppModule에서 provider로 등록을 하면 Controller에서 사용할 수 있다.

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

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
profile
만물에 관심이 많은 잡학지식사전이자, 새로운 도전을 꿈꾸는 주니어 개발자 / 잡학지식에서 벗어나서 전문성을 가진 엔지니어로 거듭나자!

0개의 댓글