feat: Swagger/OpenAPI 문서화 시스템 구축

- Swagger 패키지 설치 및 설정:
  * swagger-jsdoc, swagger-ui-express 패키지 추가
  * /api-docs 엔드포인트에서 Swagger UI 제공
  * /api-docs.json 엔드포인트에서 JSON 스펙 제공

- 포괄적인 Swagger 설정 파일 생성:
  * config/swagger.js: OpenAPI 3.0 스펙 정의
  * 공통 스키마 정의 (User, Worker, Project, Task, DailyWorkReport)
  * 표준 응답 스키마 (SuccessResponse, ErrorResponse, PaginatedResponse)
  * JWT Bearer 인증 스키마 설정

- API 문서화 적용:
  * Authentication API: 로그인 엔드포인트 문서화
  * Workers API: 전체 CRUD 작업 문서화
  * 상세한 요청/응답 스키마 및 예시 포함
  * 에러 코드별 응답 정의

- Swagger UI 커스터마이징:
  * 브랜딩 및 UI 개선
  * 인증 토큰 지속성 설정
  * 필터링 및 탐색 기능 활성화

- 접근 방법:
  * http://localhost:20005/api-docs - Swagger UI
  * http://localhost:20005/api-docs.json - JSON 스펙
This commit is contained in:
Hyungi Ahn
2025-11-03 11:00:45 +09:00
parent 775cd12a25
commit dea325739a
6 changed files with 1030 additions and 21 deletions

View File

@@ -9,6 +9,10 @@ const rateLimit = require('express-rate-limit');
const { errorMiddleware } = require('./utils/errorHandler');
const { responseMiddleware } = require('./utils/responseFormatter');
// Swagger 설정
const swaggerUi = require('swagger-ui-express');
const swaggerSpec = require('./config/swagger');
const app = express();
// 헬스체크와 개발용 엔드포인트는 CORS 이후에 등록
@@ -322,6 +326,27 @@ app.use('/api/tools', toolsRoute);
// 📤 파일 업로드
app.use('/api', uploadBgRoutes);
// ===== 📚 Swagger API 문서 =====
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec, {
explorer: true,
customCss: '.swagger-ui .topbar { display: none }',
customSiteTitle: 'TK Work Management API',
swaggerOptions: {
persistAuthorization: true,
displayRequestDuration: true,
docExpansion: 'none',
filter: true,
showExtensions: true,
showCommonExtensions: true
}
}));
// Swagger JSON 스펙 제공
app.get('/api-docs.json', (req, res) => {
res.setHeader('Content-Type', 'application/json');
res.send(swaggerSpec);
});
// ===== 🚨 에러 핸들러 (모든 라우트 뒤에 위치) =====
app.use(errorMiddleware);