소프트웨어의 구조를 구성하기위한 가장 기본적인 토대를 제시
(아키텍처 패턴)
계층을 분리해서 관리하는 아키텍처 패턴
현재 가장 흔하게 사용되는 아키텍처 패턴 중 하나이다.
const express = require('express');
const router = express.Router();
const PostsController = require('../controllers/posts.controller');
const postsController = new PostsController();
router.get('/', postsController.getPosts);
router.post('/', postsController.createPost);
module.exports = router;
const PostsController = require('../controllers/posts.controller')
컨트롤러에서 가져온 클래스를
const postsController = new PostsController()
new PostsController()로 객체화 하고
const postsController 인스턴스를 생성한다.
const PostService = require('../services/posts.service');
// Post의 컨트롤러(Controller)역할을 하는 클래스
class PostsController {
postService = new PostService(); // Post 서비스를 클래스를 컨트롤러 클래스의 멤버 변수로 할당합니다.
getPosts = async (req, res, next) => {
// 서비스 계층에 구현된 findAllPost 로직을 실행합니다.
const posts = await this.postService.findAllPost();
res.status(200).json({ data: posts })
}
createPost = async (req, res, next) => {
const { nickname, password, title, content } = req.body;
// 서비스 계층에 구현된 createPost 로직을 실행합니다.
const createPostData = await this.postService.createPost(nickname, password, title, content);
res.status(201).json({ data: createPostData });
}
}
module.exports = PostsController;
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;
const { Posts } = require('../models');
class PostRepository {
findAllPost = async () => {
// ORM인 Sequelize에서 Posts 모델의 findAll 메소드를 사용해 데이터를 요청합니다.
const posts = await Posts.findAll();
return posts;
}
createPost = async (nickname, password, title, content) => {
// ORM인 Sequelize에서 Posts 모델의 create 메소드를 사용해 데이터를 요청합니다.
const createPostData = await Posts.create({ nickname, password, title, content });
return createPostData;
}
}
module.exports = PostRepository;