🚀 확장 가능한 API 구축: Node.js와 Express의 실제 프로젝트 교훈
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Node.js 및 Express를 사용한 API 개발자
- 난이도: 중간 (모듈화, 보안, 에러 처리 등 핵심 개념 포함)
핵심 요약
- 모듈화된 폴더 구조 (
src/
하위 폴더 분리)는 확장성과 테스트 용이성 제공 controllers/
,routes/
,services/
등 명확한 역할 분리- 미들웨어 패턴 활용:
helmet
,cors
,express-rate-limit
등 보안 및 요청 제한 적용 - 비동기 처리 및 에러 처리 최적화:
async/await
+catchAsync()
사용 Joi
로 입력 검증,winston
으로 로깅- 버전 관리 (
/api/v1/
)로 기존 클라이언트 영향 최소화
섹션별 세부 요약
1. 폴더 구조 설계
src/
폴더 내config/
,controllers/
,models/
,services/
등 역할별 분리index.js
는 애플리케이션 진입점으로 유지- 분리 원칙: 각 라우트/컨트롤러는 기능별로 분리 (예:
authController.js
,authRoutes.js
)
2. 미들웨어 패턴
middlewares/logger.js
로 요청 로그 기록- 익명 미들웨어 사용은 스택 트레이스 복잡화 → 명시적 모듈 사용 권장
- 보안 관련 미들웨어:
helmet()
(보안 HTTP 헤더 설정)cors()
(도메인 접근 제한)mongoSanitize()
(SQL/NoSQL 인젝션 방지)
3. 보안 및 요청 제한
express-rate-limit
로 IP 기반 요청 제한 (15분당 100회).env
파일을 통해 환경 변수 관리 (예:MONGO_URI
)dotenv
로 환경 변수 로드 및mongoose
연결
4. 비동기 처리 최적화
util.promisify()
또는async/await
사용으로 콜백 지옥 방지catchAsync()
래퍼로 에러 처리 일관성 유지 (예:router.get('/user/:id', catchAsync(...))
)
5. 에러 처리 및 로깅
- 중앙 집중형 에러 미들웨어 (
app.use(errHandler)
) 사용 Joi
로 입력 검증 (예: 이메일 형식, 비밀번호 최소 길이)winston
으로 로그 기록 (예:error.log
파일에 오류 기록)
6. 버전 관리
/api/v1/users
와 같은 버전 식별자 사용- 최고 실천 방법: 버전별 폴더 분리 (
v1/
,v2/
)
7. 로깅 및 모니터링
morgan
으로 요청 로그 기록 (메서드, URL, 응답 시간)New Relic
,Sentry
,PM2
등 모니터링 도구 활용
결론
- 모듈화된 구조 + 보안 미들웨어 + 비동기 처리 + 에러 처리 일관성이 확장 가능한 API 구축의 핵심
- 예시:
Joi
로 입력 검증,express-rate-limit
로 DDoS 방지,winston
으로 로그 관리 - 추천: GitHub 템플릿을 통해 실제 프로젝트에서 사용하는 스타터 보일러플레이트 활용 가능