아키텍처

정창민·2022년 12월 28일
0

1. 계층형 아키텍처 패턴

  • 소프트웨어의 구조를 구성하기위한 가장 기본적인 토대를 제시
    (아키텍처 패턴)

  • 계층을 분리해서 관리하는 아키텍처 패턴

  • 현재 가장 흔하게 사용되는 아키텍처 패턴 중 하나이다.



2. 3계층 아키텍처


  • 프레젠테이션 계층 (Presentation Layer)
  • 비즈니스 로직 계층 (Business Logic Layer)
  • 데이터 엑세스 계층 (Data Access Layer)

  1. Controller : 어플리케이션의 가장 바깥쪽 부분, 요청 / 응답을 처리
  • 클라이언트의 요청을 처리, 서버에서 처리된 결과를 반환

  1. Service : 어플리케이션의 중간 부분, 실제로 중요한 작동이 가장 많이 일어남
  • 아키텍처의 핵심적인 비즈니스 로직이 수행되는 부분

  1. Repository : 어플리케이션의 안쪽 부분, DB와 맞닿아 있다.
  • db의 데이터를 사용하는 계층



3. 컨트롤러


routes/posts.routes.js

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 인스턴스를 생성한다.


controller/posts.controller.js

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;


4. 서비스


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;


5. 저장소


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;
profile
안녕하세요~!

0개의 댓글