index.js
// express 모듈 가져오기
import express from 'express';
// 인증 관련 라우터 가져오기
import { authRouter } from './auth.router.js';
// 사용자 관련 라우터 가져오기
import { usersRouter } from './users.router.js';
// 이력서 관련 라우터 가져오기
import { resumesRouter } from './resumes.router.js';
// 액세스 토큰이 필요한 미들웨어 가져오기
import { requireAccessToken } from '../middlewares/require-access-token.middleware.js';
// Express 라우터 생성
const apiRouter = express.Router();
// '/auth' 경로로 들어오는 요청을 authRouter로 처리
apiRouter.use('/auth', authRouter);
// '/users' 경로로 들어오는 요청을 usersRouter로 처리
apiRouter.use('/users', usersRouter);
// '/resumes' 경로로 들어오는 요청을 requireAccessToken 미들웨어와 resumesRouter로 처리
apiRouter.use('/resumes', requireAccessToken, resumesRouter);
// apiRouter를 외부에서 사용할 수 있도록 export
export { apiRouter };
주제: Express에서 라우터 관리 및 미들웨어 적용
Express 라우터 사용법
express.Router()를 사용하여 여러 라우트를 그룹화하고 모듈화할 수 있음. apiRouter.use()를 통해 특정 경로로 들어오는 요청을 처리하도록 설정 가능. 라우터 모듈화의 이점
auth.router.js로, 사용자 관리 라우트는 users.router.js로 분리. 미들웨어 적용 방식
/resumes 경로에서만 액세스 토큰 검증 미들웨어 requireAccessToken 적용. 파일 구조
auth.router.js, users.router.js, resumes.router.js 등으로 라우터를 분리. middlewares/require-access-token.middleware.js로 미들웨어 코드 분리. 느낀 점
라우터와 미들웨어를 모듈화하고 조합하여 사용하니 코드가 훨씬 깔끔해졌다. 파일 단위로 기능을 분리하면 코드 수정 시 특정 파일만 집중적으로 변경하면 되어서 유지보수가 쉬워진다. 앞으로 프로젝트 구조를 설계할 때 이러한 패턴을 적극 활용해야겠다.
user.router.js
import express from 'express';
import { requireAccessToken } from '../middlewares/require-access-token.middleware.js'; // 액세스 토큰을 요구하는 미들웨어
import { HTTP_STATUS } from '../constants/http-status.constant.js'; // HTTP 상태 코드 상수
import { MESSAGES } from '../constants/message.constant.js'; // 응답 메시지 상수
const usersRouter = express.Router(); // Express 라우터 생성
// 현재 로그인된 사용자 정보 조회
usersRouter.get('/me', requireAccessToken, (req, res, next) => {
try {
const data = req.user; // 요청 객체에서 사용자 정보 가져오기 (액세스 토큰 미들웨어에서 추가됨)
// 사용자 정보를 성공적으로 응답
return res.status(HTTP_STATUS.OK).json({
status: HTTP_STATUS.OK, // HTTP 200 상태 코드
message: MESSAGES.USERS.READ_ME.SUCCEED, // 성공 메시지
data, // 사용자 데이터
});
} catch (error) {
next(error); // 오류 처리 미들웨어로 오류 전달
}
});
export { usersRouter }; // 라우터를 내보내기
주제: Express 라우터에서 사용자 정보 조회 API 구현
/me 경로로 GET 요청 시, 로그인한 사용자 정보를 반환하는 API를 구현. 라우터 생성 및 미들웨어 적용
usersRouter.get('/me', requireAccessToken, ...): /me 경로에 대해 requireAccessToken 미들웨어가 먼저 실행되어 액세스 토큰을 검증. HTTP 상태 코드와 메시지 관리
HTTP_STATUS): HTTP_STATUS.OK: 요청 성공(200)을 나타냄. MESSAGES): MESSAGES.USERS.READ_ME.SUCCEED: 성공 메시지를 관리하는 상수로, 코드에서 하드코딩을 피할 수 있음. 핸들러 동작
req.user: requireAccessToken 미들웨어에서 추가된 사용자 정보를 사용. return res.status(HTTP_STATUS.OK).json({
status: HTTP_STATUS.OK,
message: MESSAGES.USERS.READ_ME.SUCCEED,
data,
});catch 블록에서 발생한 오류를 next(error)로 전달해 오류 처리 미들웨어로 위임. 라우터 내보내기
export { usersRouter }: 미들웨어로 사용자 인증 처리
requireAccessToken 미들웨어는 액세스 토큰 검증, 사용자 정보 추가 등의 작업을 처리하며, 이후 라우터 핸들러에서 req.user를 통해 사용자 데이터를 바로 활용 가능. HTTP 상태 코드와 메시지 상수화의 장점
HTTP_STATUS와 MESSAGES 상수를 통해 코드의 가독성과 유지보수성을 높임. 오류 처리 패턴
next(error)로 오류를 전달하여, 중앙에서 관리하는 오류 처리 미들웨어로 위임. 오늘 작성한 코드를 통해 Express에서 라우터와 미들웨어를 효과적으로 조합하여 API를 구현하는 방법을 이해할 수 있었다. 특히, 미들웨어의 활용과 상수 관리의 중요성을 다시 한번 느꼈다. 앞으로도 유지보수가 쉬운 코드를 작성하기 위해 이런 패턴을 적극 활용해야겠다.
추가로 학습할 내용