[Node.js][TIL] Layered Architecture - 컨트롤러(Controller)

Trippy·2023년 12월 4일
1

Node.js

목록 보기
21/28
post-thumbnail

컨트롤러

프레젠테이션 계층은 3계층 아키텍처 패턴에서 가장 먼저 클라이언트 요청을 만나게 되는 계층이며, 대표적으로 컨트롤러가 이 역할을 담당한다.

  • 하위 계층에서 발생하는 예외를 처리 한다.
  • 클라이언트가 전달한 데이터에 대해 유효성을 검증하는 기능을 수행
  • 클라이언트의 요청을 처리한 후 서버에서 처리된 결과를 반환이라고 한다.

역할

  • 클라이언트의 요청(req)를 수신한다.
  • 요청(res)에 들어온 데이터 및 내용을 검증한다.
  • 서버에서 수행된 결과를 클라이언트에게 반환(res)한다.

3계층 아키택처 routers/posts.router.js

// router.posts.rouer

import { Router } from "express";
import { auth_middleware } from "../middlewares/auth_middleware.js";
import { UsersController } from "../controllers/users.controller.js";

const usersRouter = Router();
const usersController = new UsersController();
// 회원 가입
usersRouter.post("/signup", usersController.signup);

// 회원 정보 조회
usersRouter.get("/:userid", auth_middleware, usersController.userInfo);

export { usersRouter };

/signup 메서드 => usersController.signup
/:userid 메서드 => `usersController.


3계층 아키텍처 controller/post.controller

// controller

import {PostsService} from "../service/post.service.js"
```javascript
// src/controllers/posts.controller.js

import { PostsService } from '../services/posts.service.js';

// Post의 컨트롤러(Controller)역할을 하는 클래스
export class PostsController {
  postsService = new PostsService(); // Post 서비스를 클래스를 컨트롤러 클래스의 멤버 변수로 할당합니다.

  getPosts = async (req, res, next) => {
    try {
      // 서비스 계층에 구현된 findAllPosts 로직을 실행합니다.
      const posts = await this.postsService.findAllPosts();

      return res.status(200).json({ data: posts });
    } catch (err) {
      next(err);
    }
  };

  createPost = async (req, res, next) => {
    try {
      const { nickname, password, title, content } = req.body;

      // 서비스 계층에 구현된 createPost 로직을 실행합니다.
      const createdPost = await this.postsService.createPost(
        nickname,
        password,
        title,
        content,
      );

      return res.status(201).json({ data: createdPost });
    } catch (err) {
      next(err);
    }
  };
}

await this.postsService.findAllPosts(); 는 PostController 클래스의 postService인스턴스에서 findAllPost메서드를 호출합니다.

컨트롤러는 하위 계층의 내부 구조에 대해서 신경쓰지 않는다, 대신, 외부에 공개된 메서드를 호출하기만 합니다. 이것이 가증한 이유는 추상화 특성 덕분입니다.

PostController 클래스는 전달된 요청(req)을 처리하기 위해 PostService를 호출하도록 구현하였습니다.
여기서 컨트롤러가 비즈니스 로직을 직접 수행하지 않고, 클라이언트의 요청을 서비스 계층으로 바로 전달 가능하도록 구현한 것을 확인할 수 있다.

결국, PostController클래스는 클라이언트의 요청을 서비스 계층으로 전달하는 역할을 수행하며 서비스 계층이 어떤 내부구조를 통해 비지니스 로직을 수행하는지는 상위 계층인 컨트롤러에게는 중요하지 않습니다.

profile
감금 당하고 개발만 하고 싶어요

0개의 댓글