: 소프트웨어 시스템을 세 가지 주요 계층으로 나누어 설계하는 아키텍처 패턴
각 계층은 특정 기능을 수행하고 서로 간섭하지 않도록 분리
장점 : 시스템을 유지보수하기 쉽게 만들고, 확장성을 높이며, 코드의 재사용성을 증가
컨트롤러(Controller) : 사용자와의 상호작용을 담당 (요청과 응답을 처리)
서비스(Service) : API의 핵심적인 동작이 많이 일어나는 부분
저장소(Repository) : 데이터베이스와 통신하는 부분
{
"title" : "제목" ,
"content" : "내용"
}
resumes.router.js
// 이력서 생성
router.post('/', verificationToken, resumeController.createResume);
resumes.controller.js
createResume = async (req, res, next) => {
try {
const { userId, name } = req.user;
const { title, content } = req.body;
const resume = await this.resumeService.createResume(
userId,
name,
title,
content
);
return res.status(201).json({ data: resume });
} catch (err) {
next(err);
}
}
resumes.services.js
createResume = async (res, userId, name, title, content) => {
if (title.length === 0) {
throw new Error('제목을 입력하세요.');
} else if (content.length === 0) {
throw new Error('자기소개를 입력하세요.');
}
const createResume = await this.resumeRepository.createResume(
userId,
name,
title,
content
);
return createResume;
}
resumes.repositories.js
createResume = async (userId, name, title, content) => {
const resume = await prisma.resumes.create({
data: {
userId: +userId,
title,
content,
author: name
},
});
return resume;
}
{
"resumeId": 3,
"userId": 1,
"title": "제목",
"content": "내용",
"author": "사용자",
"status": "APPLY",
"countlike": 0,
"createdAt": "2024-02-20T11:16:16.273Z",
"updatedAt": "2024-02-20T11:16:16.273Z"
}
{
"data": {
"resumeId": 3,
"userId": 1,
"title": "제목",
"content": "내용",
"author": "사용자",
"status": "APPLY",
"countlike": 0,
"createdAt": "2024-02-20T11:16:16.273Z",
"updatedAt": "2024-02-20T11:16:16.273Z"
}
}