Entry Meercat는 EntryDSM 프로젝트를 위한 Application Performance Monitoring 서버입니다.
src/
├── domain/
│ ├── auth/ # 관리자 인증
│ ├── session/ # 세션 관리
│ ├── monitoring/ # 모니터링 (Health Check, API Logs)
│ ├── error/ # 에러 추적 (Client, Server, Critical)
│ ├── submission/ # 원서 제출 추적
│ ├── pdf/ # PDF 작업 추적
│ ├── network/ # 네트워크 품질 테스트
│ └── dashboard/ # 대시보드 (CQRS Query Service)
└── global/
├── dto/ # 공통 DTO
├── decorators/ # 커스텀 데코레이터
├── filters/ # 예외 필터
├── guards/ # 인증 가드
├── interceptors/ # 응답 인터셉터
├── strategies/ # Passport 전략
└── tasks/ # 스케줄러 태스크
- ✅ DDD 아키텍처: 도메인별 명확한 분리, 높은 응집도
- ✅ CQRS 패턴: Command(Write)와 Query(Read) 분리
- ✅ Clean Code: CLAUDE.md 가이드라인 준수
- ✅ TypeScript Strict Mode: 타입 안정성 보장
- ✅ Swagger API 문서: 자동 생성된 API 문서
- ✅ JWT 인증: 30일 만료 토큰
- ✅ 자동 세션 타임아웃: 2분 비활성 시 자동 종료
- ✅ Validation: class-validator로 요청 검증
- Node.js 18+
- MySQL 8.0+
- npm 또는 yarn
# 의존성 설치
npm install
# 환경 변수 설정
cp .env.example .env
# .env 파일을 열어 데이터베이스 설정을 수정하세요
# MySQL 데이터베이스 생성
mysql -u root -p
CREATE DATABASE entrydsm_apm CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;
# 테이블 생성
mysql -u root -p entrydsm_apm < database-schema.sql
# 개발 모드
npm run start:dev
# 프로덕션 빌드
npm run build
# 프로덕션 실행
npm run start:prod
서버 실행 후 다음 URL에서 Swagger API 문서를 확인할 수 있습니다:
http://localhost:3000/api
- Username:
admin
- Password:
admin123
POST http://localhost:3000/v1/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}
응답:
{
"success": true,
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"username": "admin"
}
}
GET http://localhost:3000/v1/dashboard/realtime
Authorization: Bearer {accessToken}
POST /v1/session/start
- 세션 시작POST /v1/session/status
- 사용자 상태 변경POST /v1/session/end
- 세션 종료
POST /v1/healthcheck
- Health check 기록POST /v1/logs/api
- API 로그 기록
POST /v1/errors/client
- 클라이언트 에러 기록POST /v1/errors/server
- 서버 에러 기록POST /v1/errors/critical
- 크리티컬 에러 기록
POST /v1/submission/start
- 제출 시작POST /v1/submission/progress
- 진행 업데이트POST /v1/submission/complete
- 제출 완료POST /v1/submission/failed
- 제출 실패POST /v1/submission/cancel
- 제출 취소POST /v1/submission/abandon
- 미제출 이탈
POST /v1/pdf/download-success
- 다운로드 성공POST /v1/pdf/download-failed
- 다운로드 실패POST /v1/pdf/preview-success
- 미리보기 성공POST /v1/pdf/preview-failed
- 미리보기 실패
POST /v1/network/test
- 네트워크 품질 기록
GET /v1/dashboard/realtime
- 실시간 대시보드 데이터
# Server Configuration
PORT=3000
NODE_ENV=development
# Database Configuration
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=password
DB_DATABASE=entrydsm_apm
# JWT Configuration
JWT_SECRET=your-super-secret-jwt-key
# Admin Default Account
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123
- admins - 관리자 계정
- sessions - 세션 정보
- health_checks - Health check 기록
- api_logs - API 로그
- client_errors - 클라이언트 에러
- server_errors - 서버 에러
- critical_errors - 크리티컬 에러
- submission_sessions - 제출 세션
- submission_cancellations - 제출 취소 기록
- pdf_operations - PDF 작업 기록
- network_tests - 네트워크 테스트 결과
자세한 스키마는 database-schema.sql
파일을 참고하세요.
성능 유지를 위해 주기적으로 오래된 데이터를 정리하세요:
-- 30일 이상 된 health checks 삭제
DELETE FROM health_checks WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 90일 이상 된 api logs 삭제
DELETE FROM api_logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);
-- 90일 이상 된 종료된 세션 삭제
DELETE FROM sessions WHERE ended_at IS NOT NULL AND ended_at < DATE_SUB(NOW(), INTERVAL 90 DAY);
-- 테이블 최적화
OPTIMIZE TABLE sessions, health_checks, api_logs;
매 1분마다 실행되어 2분 이상 heartbeat가 없는 세션을 자동으로 종료합니다.
// src/global/tasks/SessionTimeoutTask.ts
@Cron(CronExpression.EVERY_MINUTE)
async handleSessionTimeout() {
// 2분 이상 heartbeat 없는 세션 종료
}
# 단위 테스트
npm run test
# E2E 테스트
npm run test:e2e
# 테스트 커버리지
npm run test:cov
프로젝트는 CLAUDE.md 가이드라인을 따릅니다:
- PascalCase: 파일명, 클래스명
- camelCase: 변수명, 메서드명
- UPPER_SNAKE_CASE: 상수
- TypeScript strict mode
- No barrel exports (index.ts 금지, 예외: error codes)
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature
) - Commit your changes (
git commit -m 'Add some AmazingFeature'
) - Push to the branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
이 프로젝트는 UNLICENSED 라이선스를 따릅니다.
EntryDSM Team
- NestJS Framework
- TypeORM
- JWT
- Swagger
Made with ❤️ by EntryDSM Team