포시코딩

[Nest.js] 4. 게시판 만들기 - Service 본문

Node.js

[Nest.js] 4. 게시판 만들기 - Service

포시 2023. 2. 9. 21:38
728x90

서비스 작성

import _ from 'lodash';
import { Injectable, NotFoundException, UnauthorizedException } from '@nestjs/common';

@Injectable()
export class BoardService {
  // 원래는 Repository를 참조하여 비지니스 로직을 실행하기 위해 데이터베이스와 통신을 함
  // 하지만, 여기선 편의성을 위하여 인-메모리 변수로 해결


  private articles = [];

  private articlePasswords = new Map();

  getArticles() {
    return this.articles;
  }

  getArticleById(id) {
    return this.articles.find((article) => {
      return article.id === id;
    });
  }

  createArticle(title: string, content: string, password: number) {
    // id를 먼저 매겨야 한다.
    // 1부터 시작 -> 현재 배열의 크기 + 1 ->
    const articleId = this.articles.length + 1;
    this.articles.push({ id: articleId, title, content });
    this.articlePasswords.set(articleId, password);
    return articleId;
  }

  updateArticle(id: number, title: string, content: string, password: number)  {
    if (this.articlePasswords.get(id) !== password) {
      throw new UnauthorizedException('Password is not correct. id: ' + id);
      // nest.js에서는 status code와 예외에 대해서 최소한으로 생각할 수 있게
      // 자체적으로 예외를 제공하고 있다.
    }

    const article = this.getArticleById(id);
    if (_.isNil(article)) {
      throw new NotFoundException('Article not found. id: ' + id);
    }

    article.title = title;
    article.content = content;
  }

  deleteArticle(id: number, password: number) {
    if (this.articlePasswords.get(id) !== password) {
      throw new UnauthorizedException('Password is not correct. id: ' + id);
    }

    this.articles = this.articles.filter((article) => {
      return article.id !== id;
    })
  }
}

이전 글에서 만들었던 controller와 그에 따른 service의 메소드들을 만들었다.

DB 대신 인메모리 변수를 사용했고

그 외 특이사항에 대해 아래에 정리해보았다.

 

_.isNil()

그동안 어떤 값이 null이나 undefined일 경우를 체크할 때

if (!체크) {}

와 같은 형식으로 했는데 솔직히 이게 좋지 않은 코드인걸 알고 있었지만 

간편하기 때문에 써왔었다.

 

이번에 lodash를 배우면서 새롭게 알게 되었는데

 

https://www.geeksforgeeks.org/lodash-_-isnil-method/

 

Lodash _.isNil() Method - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

if (_.isNil(체크)) {}

이렇게 null, undefined를 체크하는게 훨씬 안전해보인다.

 

예외처리

import { NotFoundException, UnauthorizedException } from '@nestjs/common';

throw new UnauthorizedException('Password is not correct. id: ' + id);
throw new NotFoundException('Article not found. id: ' + id);

Nest.js에서는 HTTP status code와 예외에 대한 생각도 최소한으로 할 수 있게

자체적으로 예외를 제공하고 있다.

위의 UnauthorizedException, NotFoundException 말고도 많으니 

상황에 맞게 import 해서 사용하면 될 것이다. 

728x90