StepTrace는 Anthropic Claude AI를 활용하여 위험한 맨홀을 자동으로 감지하고 관리하는 스마트 도시 안전 시스템입니다. 시민들이 위험한 맨홀을 신고하면 AI가 자동으로 분석하여 위험도를 평가하고, 위치 기반으로 실시간 안전 알림을 제공합니다.
- AI 기반 이미지 분석: Claude API를 활용한 맨홀 상태 자동 분석
- 실시간 위치 추적: GPS 기반 맨홀 위치 관리 및 주변 알림
- 스마트 알림 시스템: FCM을 통한 위험 지역 접근 시 즉시 알림
- 자동 리포트 생성: 일일 Excel/HTML 리포트 자동 생성
- OAuth 2.0 인증: Google, Kakao 소셜 로그인 지원
- 모바일 앱을 통한 간편한 맨홀 신고
- 이전/이후 상태 이미지 비교
- GPS 좌표 기반 정확한 위치 정보
- PENDING → REPORTED → COMPLETED 워크플로우
- 2단계 프롬프트 검증: 유효성 검증 → 위험도 상세 분석
- 거짓 양성률 71.4% 감소: 비맨홀 객체 오판 대폭 감소
- 실시간 분석: 평균 3.8초 내 분석 완료
- 100m 반경 내 위험 맨홀 감지 시 즉시 푸시 알림
- Redis 캐싱을 통한 중복 알림 방지
- 3초 이내 실시간 알림 전송
- 매일 자정 자동 리포트 생성
- Excel, HTML 형식 지원
- ☁AWS S3 자동 업로드
- 언어: Kotlin 1.9+
- 프레임워크: Spring Boot 3.2+, Spring Security, Spring Data JPA
- AI: Spring AI + Anthropic Claude API
- 데이터베이스: MySQL 8.0, Redis 7.0
- 클라우드: AWS (S3, EC2)
- 푸시 알림: Firebase Cloud Messaging (FCM)
- 빌드 도구: Gradle
- Docker, AWS EC2
- Firebase Admin SDK
- OAuth 2.0/OIDC (Google, Kakao)
git clone https://github.com/your-username/step-trace.git
cd step-trace# .env 파일 생성
cp .env.example .env
# 필요한 API 키 설정
CLAUDE_API_KEY=your_claude_api_key
FIREBASE_CONFIG_PATH=path_to_firebase_config
AWS_ACCESS_KEY_ID=your_aws_access_key
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
GOOGLE_CLIENT_ID=your_google_client_id
KAKAO_CLIENT_ID=your_kakao_client_id📋 전체 API 문서: API.md
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/v1/manholes |
주변 맨홀 마커 조회 |
| GET | /api/v1/manholes/{id} |
맨홀 상세 정보 조회 |
| POST | /api/v1/manholes |
새 맨홀 신고 |
| POST | /api/v1/manholes/completed/images/{id} |
완료 이미지 등록 |
| GET | /api/v1/manholes/my-reports |
내 신고 내역 조회 |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/ai/abnormal-manhole/image |
비정상 맨홀 분석 |
| POST | /api/v1/ai/normal-manhole/image |
정상 맨홀 검증 |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/auth/v1/google |
Google OAuth 로그인 |
| POST | /api/auth/v1/kakao |
Kakao OAuth 로그인 |
| DELETE | /api/auth/users |
사용자 계정 삭제 |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/manholes/push/fcm |
위치 기반 FCM 알림 |
📦src
┣ 📂main
┃ ┣ 📂kotlin
┃ ┃ ┗ 📂com
┃ ┃ ┃ ┗ 📂steptrace
┃ ┃ ┃ ┃ ┣ 📂ai
┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜AiController.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageAnalysisRequest.kt
┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜AiService.kt
┃ ┃ ┃ ┃ ┣ 📂auth
┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜AuthController.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂google
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜GoogleUserInfoDto.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂kakao
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜KakaoUserInfoDto.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜LoginResponse.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜TokenDto.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UserInfoDto.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜AuthService.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂userAccount
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜UserAccountDto.kt
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UserAccountEntity.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜UserAccountRepository.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜BaseAuditEntity.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜OidcDecodePayload.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜OidcPublicKeyDto.kt
┃ ┃ ┃ ┃ ┃ ┗ 📜OidcPublicKeysResponse.kt
┃ ┃ ┃ ┃ ┣ 📂common
┃ ┃ ┃ ┃ ┃ ┗ 📂converter
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AttributeConverter.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜BooleanToYNConverter.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜JsonConverterFactory.kt
┃ ┃ ┃ ┃ ┣ 📂config
┃ ┃ ┃ ┃ ┃ ┣ 📂security
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CustomUserDetails.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜CustomUserDetailsService.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜JwtAuthenticationFilter.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜JwtTokenProvider.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜SecurityConfig.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜SpringSecurityAuditorAware.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜ChatClientConfig.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜JacksonConfig.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜RedisCacheConfig.kt
┃ ┃ ┃ ┃ ┃ ┗ 📜S3Config.kt
┃ ┃ ┃ ┃ ┣ 📂exception
┃ ┃ ┃ ┃ ┃ ┣ 📜AiResponseGenerateException.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜BadRequestToAiException.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜ControllerAdvice.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜EntityNotFoundException.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜ExcelGenerationException.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜InvalidManholeResponseTypeException.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜InvalidProcessStatusException.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜InvalidTokenException.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeStatusException.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜StepTraceException.kt
┃ ┃ ┃ ┃ ┃ ┣ 📜TokenExpiredException.kt
┃ ┃ ┃ ┃ ┃ ┗ 📜UserNotFoundException.kt
┃ ┃ ┃ ┃ ┣ 📂image
┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageController.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ImageS3UploadRequest.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ImageS3UploadResponse.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜S3UrlDto.kt
┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageService.kt
┃ ┃ ┃ ┃ ┣ 📂manhole
┃ ┃ ┃ ┃ ┃ ┣ 📂code
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeResponseType.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ProcessStatus.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂controller
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeController.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeAttachmentEntity.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeDto.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeEntity.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeRequest.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeResponse.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂mapper
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeMapper.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeAttachmentJpaRepository.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeClient.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeJpaRepository.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeRepository.kt
┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeService.kt
┃ ┃ ┃ ┃ ┣ 📂push
┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜FcmDto.kt
┃ ┃ ┃ ┃ ┃ ┗ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜PushService.kt
┃ ┃ ┃ ┃ ┣ 📂scheduler
┃ ┃ ┃ ┃ ┃ ┣ 📂code
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeExcelColumn.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ExcelReportService.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜HtmlReportService.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜S3Service.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂util
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ExcelStyleProvider.kt
┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeReportScheduler.kt
┃ ┃ ┃ ┃ ┣ 📂support
┃ ┃ ┃ ┃ ┃ ┣ 📂fcm
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜FcmFeignClient.kt
┃ ┃ ┃ ┃ ┃ ┗ 📂token
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂google
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜GoogleFeignClient.kt
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜GoogleProperties.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂kakao
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜KakaoFeignClient.kt
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜KakaoProperties.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜JwtOidcProvider.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜OauthOidcHelper.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜TokenProperties.kt
┃ ┃ ┃ ┃ ┗ 📜StepTraceApplication.kt
┃ ┗ 📂resources
┃ ┃ ┣ 📂firebase
┃ ┃ ┃ ┗ 📜steptrace-a734a-firebase-adminsdk-fbsvc-08656e4cfd.json
┃ ┃ ┣ 📂prompts
┃ ┃ ┃ ┣ 📜abnormal-manhole-analysis-by-sub-ai.st
┃ ┃ ┃ ┣ 📜abnormal-manhole-analysis.st
┃ ┃ ┃ ┗ 📜normal-manhole-analysis.st
┃ ┃ ┣ 📂static
┃ ┃ ┣ 📂templates
┃ ┃ ┃ ┗ 📜manhole-report.html
┃ ┃ ┗ 📜application.yml
┗ 📂test
┃ ┗ 📂kotlin
┃ ┃ ┗ 📂com
┃ ┃ ┃ ┗ 📂steptrace
┃ ┃ ┃ ┃ ┣ 📂annotation
┃ ┃ ┃ ┃ ┃ ┗ 📜UnitTest.kt
┃ ┃ ┃ ┃ ┣ 📂image
┃ ┃ ┃ ┃ ┃ ┣ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageServiceTest.kt
┃ ┃ ┃ ┃ ┃ ┗ 📂stub
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ImageStub.kt
┃ ┃ ┃ ┃ ┣ 📂manhole
┃ ┃ ┃ ┃ ┃ ┣ 📂dto
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeRequestTest.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeResponseTest.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂repository
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeClientTest.kt
┃ ┃ ┃ ┃ ┃ ┣ 📂service
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeServiceTest.kt
┃ ┃ ┃ ┃ ┃ ┗ 📂stub
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeAttachmentEntityStub.kt
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜ManholeDtoStub.kt
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜ManholeEntityStub.kt
┃ ┃ ┃ ┃ ┗ 📜StepTraceApplicationTests.kt
🌟 StepTrace와 함께 더 안전한 도시를 만들어가세요! 🌟
Made with ❤️ by StepTrace Team