coding/Node.js

node.js Controller, Service, Repository

JIN_Coder 2022. 8. 7. 00:52

사전 준비

Directory Structure

내 프로젝트 폴더 이름
├── app.js
├── config
│   └── config.json
├── controllers
│   └── posts.controller.js
├── migrations
│   └── 20220731133318-create-posts.js
├── models
│   ├── index.js
│   └── posts.js
├── repositories
│   └── posts.repository.js
├── routes
│   ├── index.js
│   └── posts.routes.js
├── services
│   └── posts.service.js
├── package.json
└── package-lock.json

controllers, services, repositories라는 폴더들 생성

 

 

컨트롤러(Controller)

클라이언트의 요청을 처리한 후 서버에서 처리된 결과를 반환해주는 역할을한다.

 

컨트롤러의 역할

- 클라이언트의 요청(Request)을 수신합니다.

- 요청(Request)에 들어온 데이터 및 내용을 검증합니다.

- 서버에서 수행된 결과를 클라이언트에게 반환(Response)합니다.

 

컨트롤러는 클라이언트의 요청(Request)을 서비스 계층으로 데이터를 전달

 

// 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;

 

// controllers/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;

await this.postService.findAllPost();

PostsController 클래스에서 멤버 변수로 정의한 postService에서 findAllPost 메소드를 실행하는 코드

 

PostsController에서는 들어온 요청(Request)을 처리하기 위해 PostService를 호출하도록 구현

 

 

서비스 (Service)

아키텍처의 가장 핵심적인 비즈니스 로직을 수행하고 실제 사용자(클라이언트)가 원하는 요구사항을 구현한다.

 

서비스(Service)는 데이터가 필요할 때 저장소(Repository)에게 데이터를 요청합니다.

어플리케이션의 규모가 커지면 커질수록 서비스의 역할 및 코드 또한 점점 더 커지게 됩니다.

어플리케이션의 핵심적인 비즈니스 로직을 수행하여 클라이언트들의 요구사항을 반영하여 원하는 결과를 반환해주는 계층입니다.

 

서비스가 비즈니스 로직을 수행하기 위해 필요한 데이터를 저장소 계층(Repository Layer)에게 요청한다.

 

// 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;

PostService가 PostRepository의 findAllPost, createPost 메소드를 호출한 것을 확인

 

 

저장소(Repository)

대표적으로 Database와 관련된 작업을 수행한다.

 

PostRepository 클래스에서 Sequelize의 메소드를 사용해 데이터를 조회하거나 생성하는 것이 가장 핵심

// repositories/posts.repository.js

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;

'coding > Node.js' 카테고리의 다른 글

CORS 사용방법  (0) 2022.08.14
Sequelize 시작, migrate 사용 관계 설정  (0) 2022.08.13
계층형 아키텍처 패턴(Layered Architecture Pattern)  (0) 2022.08.05
nodemon  (0) 2022.08.04
모듈(module), require(), IIFE  (0) 2022.08.03