백앤드(Back-End)/Nest.js

[Nest.js] Nest.js API 만들기 (2) - Handler(@Get, @Post ...)

RyanSin 2021. 11. 9. 23:18
반응형

- 개요

안녕하세요. 이번 시간에는 지난 시간에 이어서 RESTFul API를 만들어보는 시간을 가져보겠습니다.

 

지난 시간에는 Controller, Service, Provider에 대해  학습하고 실제 HTTP 요청을 통해 브라우저에서 Hello World!! 를 출력했습니다.

혹시 놓치고 오신 분들은 아래 링크를 통해 학습하고 오시는 걸 추천드리겠습니다.

[Nest.js] Nest.js API 만들기 (1) - Controller, Service, Provider

 

[Nest.js] Nest.js API 만들기 (1) - Controller, Service, Provider

- 개요 안녕하세요. 이번 시간에는 Nest.js 프레임워크를 활용해 RESTFul API를 만들어 보겠습니다. 지난 시간에 Nest.js 기본 구조를 알아봤습니다. 혹시 놓치고 오신 분들은 아래 링크를 통해 학습하

any-ting.tistory.com

 

- Handler 사용법

우리는 아주 기본적인 유저에 대한 CRUD를 만들어 보겠습니다. (CRUD란...? Create, Read, Update, Delete를 말합니다.)

 

Nest.js는 클라이언트 요청이 들어오면 다음과 같은 로직으로 실행됩니다.

 

"1. @Controller -> 2.@Service -> 3. Repository"

 

클라이언트에 요청과 응답을 처리하는 부분은 Controller가 담당합니다.

 

비즈니스 로직은 Service가 담당합니다.

 

REST Method

  • @GET : 조회
  • @POST : 생성
  • @PATCH : 단일 수정
  • @PUT :  전체 수정
  • @DELETE : 삭제

HTTP 통신을 할 때 위와 같은 메서드를 정의해서 통신을 합니다.

 

지난 시간 소스코드에 추가를 하면서 진행하도록 하겠습니다.

 

- UserController

import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get() //경로를 설정하지 않으면 "user/" 경로로 설정이 된다.
  getHelloWorld(): string {
    return this.userService.getHelloWorld();
  }
}

- UserService

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

@Injectable()
export class UserService {
  getHelloWorld(): string {
    return 'Hello World!!';
  }
}

 

실행 결과

 

- GET, POST, PUT, DELETE, PATCH

클라이언트가 데이터를 전송하는 방식은 3가지 방식이 있습니다. 위 코드에서는 대표적으로 GET 방식에서 설명하고 있습니다.

 

다른 메서드에서도 사용이 가능합니다.

  1. Body (@Body() 변수명: 자료형) -> @Body() body -> 전체 처리방식 
  2. Body (@Body('키') 키_변수: 자료형) -> @Body('id') id : number - 단일 처리 방식
    (Body에서 데이터를 처리하는 방식은 위와 같이 "묶어서" 처리하는 방식과 "하나씩" 단일로 처리하는 방식이 있습니다.)
  3. Query Params (@Query('키') 키_변수: 자료형) -> @Query('id') id: number 
  4. Path Variables (@Param('키') 키_변수: 자료형) -> @Param('id') id: number
  5. 그리고 위 방식을 혼합해서 사용할 수 있습니다.

- UserService 소스 코드

import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Put,
  Query,
} from '@nestjs/common';
import { UserService } from './user.service';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get() //경로를 설정하지 않으면 "user/" 경로로 설정이 된다.
  getHelloWorld(): string {
    return this.userService.getHelloWorld();
  }

  /**
   * @author Ryan
   * @description @Body 방식 - @Body 어노테이션 여러개를 통해 요청 객체를 접근할 수 있습니다.
   *
   * @param id 유저 고유 아이디
   * @param name 유저 이름
   */
  @Post('/create_user')
  onCreateUser(@Body('id') id: number, @Body('name') name: string): User[] {
    return this.userService.onCreateUser(id, name);
  }

  /**
   * @author Ryan
   * @description 전체 유저 조회
   */
  @Get('/user_all')
  getUserAll(): User[] {
    return this.userService.getUserAll();
  }

  /**
   * @author Ryan
   * @description @Query 방식 - 단일 유저 조회
   *
   * @param id 유저 고유 아이디
   */
  @Get('/user')
  findByUserOne1(@Query('id') id: number): User {
    return this.userService.findByUserOne(id);
  }

  /**
   * @author Ryan
   * @description @Param 방식 - 단일 유저 조회
   *
   * @param id 유저 고유 아이디
   */
  @Get('/user/:id')
  findByUserOne2(@Param('id') id: number): User {
    return this.userService.findByUserOne(id);
  }

  /**
   * @author Ryan
   * @description @Param & @Body 혼합 방식 - 단일 유저 수정
   *
   * @param id 유저 고유 아이디
   * @param name 유저 이름
   */
  @Patch('/user/:id')
  setUser(@Param('id') id: number, @Body('name') name: string): User {
    return this.userService.setUser(id, name);
  }

  /**
   * @author Ryan
   * @description @Body 방식 - 전체 유저 수정
   *
   * @param id 유저 고유 아이디
   * @param name 유저 이름
   */
  @Put('/user/update')
  setAllUser(@Body('id') id: number, @Body('name') name: string): User[] {
    return this.userService.setAllUser(id, name);
  }

  /**
   * @author Ryan
   * @description @Query 방식 - 단일 유저 삭제
   *
   * @param id 유저 고유 아이디
   */
  @Delete('/user/delete')
  deleteUser(@Query('id') id: number): User[] {
    return this.userService.deleteUser(id);
  }
}

 

- UserService

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

const users: User[] = [
  { id: 1, name: '유저1' },
  { id: 2, name: '유저2' },
  { id: 3, name: '유저3' },
];

@Injectable()
export class UserService {
  /**
   * @author Ryan
   * @description 유저 생성
   *
   * @param id 유저 고유 아이디
   * @param name 유저 이름
   * @returns {User[]} users
   */
  onCreateUser(id: number, name: string): User[] {
    return users.concat({ id, name });
  }

  /**
   * @author Ryan
   * @description 모든 유저 조회
   *
   * @returns {User[]} users
   */
  getUserAll(): User[] {
    return users;
  }

  /**
   * @author Ryan
   * @description 단일 유저 조회
   *
   * @param id 유저 고유 아이디
   * @returns {User} users
   */
  findByUserOne(id: number): User {
    return users.find((data) => data.id == id);
  }

  /**
   * @author Ryan
   * @description 단일 유저 수정
   *
   * @returns {User} users
   */
  setUser(id: number, name: string): User {
    return users.find((data) => {
      if (data.id == id) return (data.name = name);
    });
  }

  /**
   * @author Ryan
   * @description 전체 유저 수정
   *
   * @returns {User[]} users
   */
  setAllUser(id, name): User[] {
    return users.map((data) => {
      if (data.id == id) {
        data.name = name;
      }

      return {
        id: data.id,
        name: data.name,
      };
    });
  }

  /**
   * @author Ryan
   * @description 유저 삭제
   *
   * @param id
   * @returns {User[]} users
   */
  deleteUser(id: number): User[] {
    return users.filter((data) => data.id != id);
  }

  getHelloWorld(): string {
    return 'Hello World!!';
  }
}

 

소스 코드에 주석을 통해 설명을 해놨습니다.

 

기본적으로 API 개념에 대해 알고 있으시면 어렵게 느껴지지 않으실거라고 생각합니다.

 

하지만 따로 꼭 실습을 해보시는 걸 추천 드리겠습니다.

 

소스 저장소

github: https://github.com/Ryan-Sin/Node_Nest/tree/v2

 

GitHub - Ryan-Sin/Node_Nest

Contribute to Ryan-Sin/Node_Nest development by creating an account on GitHub.

github.com