서비스 계층(Service Layer)이란 비즈니스 로직 계층(Business logic layer)이라고도 불리는데요 아키텍처의 가장 핵심적인 비즈니스 로직을 수행하고 실제 사용자(클라이언트)가 원하는 요구사항을 구현하는 계층입니다.
서비스 계층의 장점
각각의 유스 케이스(Use Case)와 워크플로우(Workflow)를 명확히 정의할 때 도움이 됩니다.
저장소(Repository)에게 얻을 필요가 있는 데이터가 무엇인지 이해할 수 있습니다.
어떤 사전 검사와 현재 상태 검증을 필수적으로 해야하는 것인지 이해할 수 있습니다.
어떤 내용을 저장해야 하는지 이해할 수 있습니다.
비즈니스 로직을 API 뒤에 감췄기 때문에 서비스 계층의 코드를 자유롭게 리팩터링할 수 있습니다.
저장소 패턴(Repository Pattern) 및 가짜 저장소(Fake Repository)와 조합하면 높은 수준의 테스트를 작성할 수 있습니다.
서비스 계층의 단점
서비스 계층(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같이 알아서는 안될 정보까지 전달되게 되어 보안성이 떨어지는 결과를 낳게됨.