Express로 REST API 서버 처음부터 다시 짜보기
예전에 급하게 만든 API 서버는 라우터 파일 하나에 로직이 다 몰려있어서, 기능 하나 추가할 때마다 파일이 몇백 줄씩 늘어나는 게 스트레스였다. 이번엔 처음부터 레이어를 분리해서 다시 짜보기로 했다.
기존 구조의 문제
라우터에서 바로 DB 쿼리를 날리고, 에러 처리도 그때그때 try-catch로 땜빵하다 보니 나중에 로직을 추적하기가 너무 힘들었다. 특히 비슷한 검증 로직이 여러 라우터에 중복돼 있는 게 제일 거슬렸다.
새 구조: Router → Controller → Service
역할을 세 단으로 나눴다. 라우터는 요청을 받아서 컨트롤러로 넘기기만 하고, 컨트롤러는 요청/응답 처리, 서비스는 실제 비즈니스 로직을 담당하게 했다.
// routes/user.route.js
const router = require("express").Router();
const userController = require("../controllers/user.controller");
router.get("/:id", userController.getUser);
router.post("/", userController.createUser);
module.exports = router;
// controllers/user.controller.js
const userService = require("../services/user.service");
exports.getUser = async (req, res, next) => {
try {
const user = await userService.findById(req.params.id);
res.json(user);
} catch (err) {
next(err);
}
};
공통 에러 핸들링 미들웨어
매번 try-catch로 반복하던 걸 없애고, 에러를 next로 넘기면 마지막 미들웨어에서 한 번에 처리하도록 정리했다. 덕분에 컨트롤러 코드가 훨씬 짧아졌다.
다음 글에서는 이 구조에 유효성 검증 미들웨어(Joi)를 붙이는 과정을 정리할 예정이다.