서비스를 구체화 하는 방법 (Reducing Complexity in Service)
두줄요약
에너지 현황 리포트 요구사항을 이벤트 기반 구조와 일 마감 배치로 구체화했습니다.\n비순차 이벤트·동시성·데이터 보존 문제를 MongoDB 잠금과 TTL로 관리했습니다.
문제 상황
- GRMS의 IoT 장치·객실 이벤트를 기반으로 일별 에너지 사용량, 재실·체크인 상태별 낭비를 분석하는 리포트 요구
- 비순차 이벤트 도착, 이벤트 유실, 연박 상태, 자정 기준 일별 집계와 동시성 제어 필요
구조와 흐름
- Device·Space 서비스의 상태 변경 이벤트를 AWS SQS로 발행하고 Report 서비스가 구독하는 이벤트 기반 구조
- 실시간 이벤트 처리로 장치별 사용 시간 이력 생성, 일 마감 배치로 연속 상태와 자정 구간 정리 후 일별 리포트 생성
- 리포트·이력 데이터를 기반으로 조회, 역추적, 장애 관리 지원
선택 이유
- 동기 HTTP 호출 대비 서비스 간 직접 의존성과 장애 전파를 낮추는 이벤트 기반 통신
- 기존 AWS 환경의 비용·운영 편의성을 고려한 Document DB 선택
- 모듈 관리 용이성에 따른 NestJS·TypeScript, 안정성과 레퍼런스를 고려한 TypeORM 선택
성능/운영 포인트
- MongoDB의 findOneAndUpdate 원자성을 활용한 SpinLock과 JobNo 기반 DistLock으로 이벤트·배치 동시성 제어
- TTL Index 기반 데이터 생명 주기 관리와 실패 배치의 다음 주기 재시도
- 유닛 테스트와 E2E 테스트, 테스트용 API를 통한 시나리오 검증 및 커버리지 70% 이상 유지 목표


