프레젠테이션 계층은
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.
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
클래스는 클라이언트의 요청을 서비스 계층으로 전달하는 역할을 수행하며 서비스 계층이 어떤 내부구조를 통해 비지니스 로직을 수행하는지는 상위 계층인 컨트롤러에게는 중요하지 않습니다.