NestJS

[실습] Board Module 로직 구현

dev-byul 2022. 3. 16. 18:37
목표 : Controller 에서 Service 불러오기

진행 과정

  1. Boards 모듈 생성하기
  2. Boards 모듈 내 Controller 와 Service 생성하기
  3. Service에 로직 작성 후 Controller 로 불러오기
  4. NestJS 실행 후 데이터 확인하기

Ref

  • CRUD 중 R에 해당하는 Read에 관련한 로직을 작성 할 것입니다.
  • 실제 DB와 연동하지 않고, 간단한 데이터를 담을 수 있는 변수를 이용해 변수 데이터를 가져오는 로직을 구성할 것입니다.

0. NestJS CLI 설치 및 프로젝트 생성하기

Nest JS CLI 설치하기

$ npm i -g @nestjs/cli

전역에서 명령어 nest를 사용하기 위해서는 npm(Node Package Module)을 이용하여 전역으로 @nestjs/cli 모듈을 설치합니다.

Nest Project 생성하기

$ nest new nestjst
...
? Which package manager would you ❤️  to use? (Use arrow keys)
> npm
  yarn
  pnpm

프로젝트를 생성할 때 프로젝트내 패키지를 어떤 패키지 매니저로 관리할 것인지 선택을 할 수 있습니다. 여기서는 원하시는 패키지 매니저를 선택하면 됩니다.

패키지 매니저에 관련해서 정리가 잘된 블로그가 있어 링크를 걸어 둡니다.

1. Board 모듈 생성하기

모듈은 컨트롤러와 서비스를 중앙에서 제어하는 공간이라 생각하면 이해하기 편하실것 같습니다.

모듈내에 작성되지 않은 컨트롤러나 서비스는 따로 사용할 수 없습니다.

모듈은 모듈을 import 해올수 있고, 다른 모듈에 현재 작성된 공급자(provider)과 같이 exports 해줄수 있습니다.

Nest CLI 명령어로 모듈 생성

$ nest g moudle boards

NestCLI를 통해 생성할 경우 다음과 같이 boards 디렉토리 안에 boards.module.ts 파일이 생성됩니다.

./boards/boards.moduele.ts

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

@Module({})
export class BoardsModule {}

./boards/boards.module.ts 는 다음과 같은 코드를 가지고 생성되며, ./app.module.ts 에는 새로운 module이 추가되었음을 인지하여 자동으로 imports 해 가져옵니다.

./app.module.ts

import { Module } from '@nestjs/common';
import { BoardsModule } from './boards/boards.module'; 

@Module({
  imports: [BoardsModule], // 추가된 부분
})
export class AppModule {}

2. Boards 모듈 내 Controller 와 Service 생성하기

컨트롤러는 서비스와 클라이언트를 조율하는 공간이라 생각하면 될 것같습니다.

서비스는 실질적으로 DB나 데이터 관련한 로직을 작성하는 공간입니다.

컨트롤러 생성

$ nest g controller boards --no-spec

서비스 생성

$ nest g service boards --no-spec

NestCLI를 통해 생성되는 Controller와 Service는 기본적으로 테스트 코드가 같이 작성이 됩니다.

지금은 테스트 코드를 작성하지 않으니, —no-spec 명령어를 추가로 작성하여 Controller와 Service 만 생성되도록 합니다.

./boards/boards.moduele.ts

NestCLI로 Controller와 Service를 생성할 경우 관련된 모듈에서는 자동적으로 공급자 추가와 컨트롤러 추가가 진행됩니다.

import { Module } from '@nestjs/common';
import { BoardsService } from './boards.service';
import { BoardsController } from './boards.controller';

@Module({
  controllers: [BoardsController], // 컨트롤러 추가
  providers: [BoardsService], // 공급자 추가
})
export class BoardsModule {}

3. Service에 로직 작성 후 Controller 로 불러오기

Service 로직 작성하기

간단하게 Service 로직에 배열을 생성한 후 배열의 값을 되돌려주는 함수를 작성하겠습니다.

여기서 boards 배열에 접근제한자 private 를 붙여준 이유는 다른 컴포넌트에서 접근할 수 없게 하기 위함입니다.

./boards/boards.service.ts

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

@Injectable()
export class BoardsService {
  private boards = ['hi', 'devbyul'];

  getAllBoards() {
    return this.boards;
  }
}

Controller 에서 Service 불러오기

로직이 작성된 Service를 우리는 Controller에 가져와서 클라이언트가 요청 할 경우 board 배열의 데이터 값으 전달 해줄 것입니다.

./boards/boards.controller.ts

import { Controller, Get } from '@nestjs/common';
import { BoardsService } from './boards.service';

@Controller('boards')
export class BoardsController {
  // 의존성 주입( DI[Dependency Injection] )
  constructor(private boardsService: BoardsService) {}

  @Get('/')
  getAllBoard() {
    return this.boardsService.getAllBoards();
  }
}

4. NestJS 실행 후 데이터 확인하기

command

$ npm run start:dev

명령어를 입력하여 실행 하고 localhost:3000 으로 접속하면 다음과 같이 404 에러가 발생할 것입니다.

이는 우리가 작성한 컨트롤러를 보면 데코레이션으로 ‘boards’ 로 경로작성을 했기 때문입니다.

import { Controller, Get } from '@nestjs/common';
import { BoardsService } from './boards.service';

@Controller('boards') // <-- boards 경로 작성
export class BoardsController {
	...
  @Get('/') // <-- boards 뒤 추가 경로 작성
  getAllBoard() { ... }
}

localhost:3000/boards 로 접속을 다시 시도 하면 다음과 같이 정상 데이터가 출력 되는 것을 확인할 수 있습니다.