노드심화 4-5

·2022년 12월 28일
0

study

목록 보기
38/81
post-thumbnail

서비스 계층(Service Layer) 이란?

서비스 계층(Service Layer)이란 비즈니스 로직 계층(Business logic layer)이라고도 불리는데요 아키텍처의 가장 핵심적인 비즈니스 로직을 수행하고 실제 사용자(클라이언트)가 원하는 요구사항을 구현하는 계층입니다.

  • 프레젠테이션 계층(Presentation Layer)데이터 엑세스 계층(Data Access Layer) 사이에서 중간 다리 역할을 하며 서로 다른 두 계층이 직접 통신하지 않게 만들어 줍니다.
  • 서비스(Service)데이터가 필요할 때 저장소(Repository)에게 데이터를 요청합니다.
  • 어플리케이션의 규모가 커지면 커질수록 서비스의 역할코드또한 점점 더 커지게 됩니다.
  • 어플리케이션의 핵심적인 비즈니스 로직을 수행하여 클라이언트들의 요구사항을 반영하여 원하는 결과를 반환해주는 계층입니다.

서비스 계층의 장단점

서비스 계층의 장점

각각의 유스 케이스(Use Case)워크플로우(Workflow)를 명확히 정의할 때 도움이 됩니다.

  • 저장소(Repository)에게 얻을 필요가 있는 데이터가 무엇인지 이해할 수 있습니다.

  • 어떤 사전 검사현재 상태 검증을 필수적으로 해야하는 것인지 이해할 수 있습니다.

  • 어떤 내용을 저장해야 하는지 이해할 수 있습니다.

  • 비즈니스 로직을 API 뒤에 감췄기 때문에 서비스 계층의 코드를 자유롭게 리팩터링할 수 있습니다.

  • 저장소 패턴(Repository Pattern)가짜 저장소(Fake Repository)와 조합하면 높은 수준테스트작성할 수 있습니다.

서비스 계층의 단점

  • 서비스 계층또한 다른 추상화 계층에 불과합니다.
  • 서비스 계층에 너무 많은 기능을 넣으면 빈약한 도메인 모델(Anemic Domain Model)과 같은 안티 패턴이 생길 수 있습니다.

서비스 계층 구현하기

서비스 계층(Service Layer)에서는 PostService가 PostRepository의 findAllPost, createPost 메소드를 호출

// services/posts.service.js

const PostRepository = require('../repositories/posts.repository');

class PostService {
 postRepository = new PostRepository();

 findAllPost = async () => {
   // 저장소(Repository)에게 데이터를 요청합니다.
   const allPost = await this.postRepository.findAllPost();

   // 호출한 Post들을 가장 최신 게시글 부터 정렬합니다.
   allPost.sort((a, b) => {
     return b.createdAt - a.createdAt;
   })

   // 비즈니스 로직을 수행한 후 사용자에게 보여줄 데이터를 가공합니다.
   return allPost.map(post => {
     return {
       postId: post.postId,
       nickname: post.nickname,
       title: post.title,
       createdAt: post.createdAt,
       updatedAt: post.updatedAt
     }
   });
 }

 createPost = async (nickname, password, title, content) => {
   // 저장소(Repository)에게 데이터를 요청합니다.
   const createPostData = await this.postRepository.createPost(nickname, password, title, content);

   // 비즈니스 로직을 수행한 후 사용자에게 보여줄 데이터를 가공합니다.
   return {
     postId: createPostData.null,
     nickname: createPostData.nickname,
     title: createPostData.title,
     content: createPostData.content,
     createdAt: createPostData.createdAt,
     updatedAt: createPostData.updatedAt,
   };
 }
}

module.exports = PostService;

=>
Repository에서 데이터를 가져와 가공하지 않고 클라이언트에게 전달할 경우 사용자의 Password같이 알아서는 안될 정보까지 전달되게 되어 보안성이 떨어지는 결과를 낳게됨.

profile
개발자 꿈나무

0개의 댓글