3. Service

수원 개발자·2023년 11월 23일
0

NestJS

목록 보기
5/15

서비스와 모듈, 컨트롤러는 세트처럼 취급한다.
컨트롤러는 어떠한 요청과 그게 해당되는 method를 움직여서 작동한다.
컨트롤러는 최전방에서 요청이 어디로 가야 될지를 함수로 라우팅해주는 역할을 하는 것이다. 컨트롤러는 오직 그 역할을 해야하고 그 역할에만 초점을 둬야한다.

서비스 파일은 일반적으로 애플리케이션의 비즈니스 로직을 처리하는 데 사용된다. NestJS에서 서비스는 컨트롤러에서 요청을 처리하기 위한 별도의 로직을 분리하고, 컨트롤러로부터 분리된 모듈화된 기능을 제공하는 데 주로 사용된다.

  1. 비즈니스 로직 분리: 서비스는 애플리케이션의 핵심 비즈니스 로직을 담당하며, 이를 컨트롤러로부터 분리하여 유지보수 및 테스트를 용이하게 한다.

  2. 재사용성: 여러 컨트롤러가 동일한 기능을 공유할 수 있도록 서비스를 사용하여 코드 재사용성을 높일 수 있다.

  3. 테스트 용이성: 서비스는 독립적으로 테스트할 수 있다. 이는 단위 테스트 및 모의 객체(Mocking)를 통한 테스트를 용이하게 만든다.

  4. 간결한 컨트롤러: 서비스로 로직을 분리함으로써, 컨트롤러는 주로 요청과 응답을 처리하고, 서비스로 비즈니스 로직 처리를 위임하여 간결하고 가독성 있는 코드를 유지할 수 있다.

예를 들어, 게시물과 관련된 CRUD(Create, Read, Update, Delete) 작업이 있다면, 해당 동작들을 수행하는 서비스를 만들어 컨트롤러에서 호출하여 사용할 수 있다. 이렇게 하면 관련 로직을 서비스에 모듈화하여 관리할 수 있으며, 컨트롤러는 이 서비스의 기능을 사용하여 요청을 처리하게 된다.

NestJS는 서비스를 통한 모듈화된 접근 방식을 지원하여 코드의 유연성과 확장성을 높이고, 애플리케이션을 관리하기 쉽게 만들어준다.

그래서 posts.service.ts 파일에 로직들을 옮겨주도록 하겠다.

먼저 더미데이터와 인터페이스를 옮겨준다.
그리고 1 ~ 5번 로직들을 각자 다 옮겨주었다.

export class PostsService {
  getAllPosts() {
    return posts;
  }

  getPostById(id: number) {
    const post = posts.find((post) => post.id === +id);

    if (!post) {
      throw new NotFoundException();
    }

    return post;
  }

  createPost(author: string, title: string, content: string) {
    const post = {
      id: posts[posts.length - 1].id + 1,
      author,
      title,
      content,
      likeCount: 0,
      commentCount: 0,
    };

    posts = [...posts, post];

    return post;
  }

  updatePost(postId: number, author: string, title: string, content: string) {
    const post = posts.find((post) => post.id === postId);

    if (!post) {
      throw new NotFoundException();
    }

    if (author) {
      post.author = author;
    }

    if (title) {
      post.title = title;
    }

    if (content) {
      post.content = content;
    }

    posts = posts.map((prevPost) => (prevPost.id === postId ? post : prevPost));

    return post;
  }

  deletePost(postId: number) {
    const post = posts.find((post) => post.id === postId);

    if (!post) {
      throw new NotFoundException();
    }

    posts = posts.filter((post) => post.id !== postId);

    return postId;
  }
}

0개의 댓글

관련 채용 정보