객체지향 프로그래밍을 글로 배웠어요...
직접 코드를 짜면서 가슴이 아닌 머리로 이해하는 날이 오길 바라며 정리해보는 글
대표적으로는 다음과 같은 특징이 있음
Private
를 사용함Interface
를 통해 클래스를 정의할 때 메소드와 속성만 정의, 상속 받은 클래스에서 해당 메소드와 속성을 구현하지 않으면 에러 발생유지 보수와 확장이 쉬운 시스템을 만들기 위해 사용함
프로젝트 명
├── 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
const express = require("express");
const router = express.Router();
// postscontroller 모듈 불러오기 - 첫 글자 대문자로
const PostsController = require("../controllers/posts.controller");
// 불러온 postscontroller 모듈을 변수에 저장
const postsController = new PostsController();
// 라우터에서 컨트롤러의 메서드를 사용할 수 있음
router.get("/", postsController.getPosts);
router.post("/", postsController.createPosts);
// 모듈로 내보냄
module.exports = router;
express 모듈을 불러오고
router를 만든다
PostsController 모듈을 불러온 다음
postsController 변수에 저장한다
url '/'로 get 요청 시 postsController의 getPosts 메서드를 사용한다
url '/'로 post 요청 시 postsController의 creatPosts 메서드를 사용한다
router를 모듈로 내보낸다.
const PostService = require("../services/posts.service");
// Post의 컨트롤러 역할을 하는 클래스
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;
// 서비스 계층에 구현된 creatPost 로직을 실행한다.
const createPostData = await this.postService.createPost(
nickname,
password,
title,
content
);
res.status(201).json({ data: createPostDats });
};
}
module.exports = PostsController;
service 모듈을 불러온다
PostController 클래스를 선언해주고
PostService를 postService라는 멤버 변수로 저장한다
service 계층에 구현된 findAllPost() 로직을 실행하는 getPosts 메서드를 만들고
service 계층에 구현된 creatPost() 로직을 실행하는 getPostsData 메서드를 만든다
controller를 모듈을 내보낸다.
const PostRepository = require("../repositories/posts.repository");
class PostService {
postRepository = new PostRepository();
findAllPost = async () => {
// 저장소에 데이터를 요청합니다.
const allPost = await this.postRepository.findAllPost();
// 호출한 post들을 가장 최신 게시글부터 정렬합니다.
allPost.sort((a, b) => {
return b.createAt - a.createdAt;
});
// 비즈니스 로직을 수행한 후 사용자에게 보여줄 데이터를 가공합니다.
return allPost.map((post) => {
return {
postId: post.postId,
nickname: post.nickname,
title: post.title,
createdAt: post.createAt,
updatedAt: post.updatedAt,
};
});
};
createPost = async (nickname, password, title, content) => {
// 저장소에 데이터를 요청한다.
const createPostData = await this.postRepository.createPost(
nickname,
password,
title,
comment
);
// 비즈니스 로직을 수행한 후 사용자에게 보여줄 데이터를 가공합니다.
return {
postId: createPostData.null,
nickname: createPostData.nickname,
title: createPostData.title,
content: createPostData.content,
createAt: createPostData.createAt,
updatedAt: createPostData.updatedAt,
};
};
}
module.exports = PostService;
이 정도 되면 공통점이 보인다.
router에서는 controller를 불러내고
controller에서는 service를 불러내고
service에서는 repository를 불러내는 방향으로 코드가 작성된다.
마지막으로 repository에서는 models을 불러온다.