11 KiB
11 KiB
GeoJSON 파일 모니터링 시스템 - Daniel Lee
kamco-dabeeo-backoffice 프로젝트에 추가된 GeoJSON 파일 자동 모니터링 및 처리 시스템입니다.
주요 기능
1. 자동 파일 모니터링
- 지정된 폴더(
/data/geojson/upload)를 주기적으로 모니터링 (기본값: 30초마다) - 지원 압축 형식: ZIP, TAR, TAR.GZ, TGZ
- 최대 파일 크기: 100MB
2. 압축파일 자동 처리
- 압축파일에서 GeoJSON 파일들을 자동 추출
- GeoJSON 데이터 검증 및 파싱
tb_map_sheet_learn_data테이블에 데이터 저장
3. Geometry 데이터 자동 변환
- JSON 데이터에서 Geometry 정보 추출
tb_map_sheet_learn_data_geom테이블에 geometry 데이터 저장- JTS Geometry 객체로 변환하여 PostGIS와 연동
시스템 구조
폴더 구조
/data/geojson/
├── upload/ # 모니터링 대상 폴더 (압축파일 업로드)
├── processed/ # 처리 완료된 파일들
├── error/ # 처리 실패한 파일들
└── /tmp/geojson_extract/ # 임시 추출 폴더
데이터베이스 테이블
tb_map_sheet_learn_data (학습데이터)
data_uid: 식별키data_name: 파일명data_path: 파일 경로data_type: 데이터 타입 (GeoJSON)data_json: GeoJSON 원본 데이터 (JSON)data_state: 처리 상태 (PROCESSED/PENDING)anal_state: 분석 상태 (PENDING/COMPLETED/ERROR)
tb_map_sheet_learn_data_geom (학습데이터 Geometry)
geo_uid: 식별키data_uid: 연결된 학습데이터 IDgeom: Geometry 데이터 (PostGIS)geo_type: Geometry 타입 (Point, Polygon 등)area: 면적 정보- 기타 속성 정보들
설정 방법
application.yml 설정
geojson:
monitor:
watch-directory: /data/geojson/upload
processed-directory: /data/geojson/processed
error-directory: /data/geojson/error
temp-directory: /tmp/geojson_extract
cron-expression: "0/30 * * * * *" # 매 30초
supported-extensions:
- zip
- tar
- tar.gz
- tgz
max-file-size: 104857600 # 100MB
사용 방법
1. 자동 모니터링
- 시스템 시작 시 자동으로 스케줄러가 동작
/data/geojson/upload폴더에 압축파일 업로드- 30초 이내에 자동으로 처리됨
- 처리 결과는 로그에서 확인 가능
2. API를 통한 수동 제어
모니터링 상태 확인
GET /api/geojson/monitor/status
특정 파일 수동 처리
POST /api/geojson/process/file?filePath=/path/to/your/file.zip
미처리 Geometry 변환
POST /api/geojson/process/geometry
특정 데이터 Geometry 변환
POST /api/geojson/process/geometry/convert
Content-Type: application/json
[1, 2, 3] # 학습데이터 ID 배열
3. 데이터 조회 API
학습 데이터 목록 조회
GET /api/geojson/data/learn-data?page=0&size=10&dataState=PROCESSED
학습 데이터 상세 조회
GET /api/geojson/data/learn-data/{id}
Geometry 데이터 조회
GET /api/geojson/data/geometry?dataUid=123
시스템 통계 조회
GET /api/geojson/data/statistics
상태별 카운트 조회
GET /api/geojson/data/status-counts
처리 흐름
- 파일 모니터링: 스케줄러가 주기적으로 upload 폴더 검사
- 압축파일 검증: 파일 형식, 크기 확인
- 압축파일 추출: GeoJSON 파일들 추출
- 데이터 검증: GeoJSON 형식 검증
- 학습데이터 저장:
tb_map_sheet_learn_data에 저장 - Geometry 변환: JSON → JTS Geometry 변환
- Geometry 저장:
tb_map_sheet_learn_data_geom에 저장 - 파일 이동: 처리 완료된 파일을 processed 폴더로 이동
오류 처리
처리 실패 시
- 파일은
/data/geojson/error/폴더로 이동 - 오류 정보는
.error.info파일에 기록 - 로그에 상세한 오류 내용 기록
복구 방법
- 오류 원인을 수정 후 error 폴더에서 upload 폴더로 파일 이동
- 또는 API를 통한 수동 처리 실행
모니터링 및 로그
로그 확인
# 전체 로그
tail -f logs/application.log
# GeoJSON 관련 로그만
tail -f logs/application.log | grep "geojson"
주요 로그 레벨
INFO: 파일 처리 시작/완료WARN: 비정상적이지만 처리 가능한 상황ERROR: 처리 실패 및 오류 상황DEBUG: 상세한 처리 과정
성능 고려사항
제한사항
- 최대 파일 크기: 100MB
- 한 번에 처리 가능한 GeoJSON 파일: 50개
- 메모리 사용량을 고려하여 대용량 파일 처리 시 주의
최적화 팁
- 압축파일 내 GeoJSON 파일 개수를 적절히 제한
- 너무 큰 GeoJSON 파일은 분할하여 처리
- 시스템 리소스에 따라 cron 표현식 조정
문제 해결
자주 발생하는 문제
-
폴더 권한 문제
chmod 755 /data/geojson/upload chown -R app-user:app-group /data/geojson/ -
디스크 공간 부족
- processed 폴더의 오래된 파일들 정리
- 임시 폴더 정리
-
메모리 부족
- JVM 힙 크기 조정:
-Xmx2g - 처리할 파일 크기 제한
- JVM 힙 크기 조정:
-
데이터베이스 연결 문제
- PostgreSQL 연결 상태 확인
- PostGIS 확장 설치 확인
디버깅 방법
-
로그 레벨 조정
logging: level: com.kamco.cd.kamcoback.geojson: DEBUG -
API 테스트
# 상태 확인 curl http://localhost:8080/api/geojson/monitor/status # 통계 확인 curl http://localhost:8080/api/geojson/data/statistics
확장 가능한 기능
- 알림 시스템: 처리 완료/실패 시 이메일 또는 슬랙 알림
- 웹 UI: 모니터링 및 관리를 위한 웹 인터페이스
- 배치 처리: 대용량 파일을 위한 비동기 배치 처리
- 데이터 검증: 더 상세한 GeoJSON 데이터 검증 룰
- 성능 모니터링: 처리 시간, 메모리 사용량 등 성능 지표 수집
터미널 API 테스트 로그
deniallee@Denialui-MacBookPro-2 kamco-dabeeo-backoffice % curl -s "http://localhost:8080/api/geojson/monitor/status" | jq .
{
"cronExpression": "0/30 * * * * *",
"processedDirectory": "/Users/deniallee/geojson/processed",
"watchDirectory": "/Users/deniallee/geojson/upload",
"errorDirectory": "/Users/deniallee/geojson/error",
"maxFileSize": 104857600,
"maxFileSizeMB": 100,
"supportedExtensions": [
"zip",
"tar",
"tar.gz",
"tgz"
]
}
deniallee@Denialui-MacBookPro-2 kamco-dabeeo-backoffice % curl -s "http://localhost:8080/api/geojson/monitor/stats" | jq .
{
"fileSystem": {
"processedDirectoryCount": 1,
"errorDirectoryCount": 2,
"watchDirectoryCount": 1
},
"database": {
"totalLearnData": 1,
"totalGeomData": 1,
"pendingAnalysis": 0
},
"monitoring": {
"errorDirectory": "/Users/deniallee/geojson/error",
"isActive": true,
"watchDirectory": "/Users/deniallee/geojson/upload",
"processedDirectory": "/Users/deniallee/geojson/processed",
"cronExpression": "0/30 * * * * *"
}
}
deniallee@Denialui-MacBookPro-2 kamco-dabeeo-backoffice % curl -X POST -s "http://localhost:8080/api/geojson/monitor/init-d
irectories" | jq .
{
"status": "success",
"message": "디렉토리 초기화가 완료되었습니다."
}
deniallee@Denialui-MacBookPro-2 kamco-dabeeo-backoffice % curl -X POST -s "http://localhost:8080/api/geojson/process/geomet
ry" | jq .
{
"message": "Geometry 변환이 완료되었습니다.",
"processedCount": 0,
"processedIds": [],
"status": "success"
}
GeoJSON 파일 모니터링 시스템 - API 문제 해결 리스트
해결된 문제들
1. 누락된 Stats API 추가
- 문제:
/monitor/stats엔드포인트가 없어서 500 에러 발생 - 해결: 시스템 통계 정보를 제공하는 완전한 API 구현
2. Repository 메서드 누락
- 문제:
countByAnalState메서드 미구현으로 컴파일 에러 - 해결:
MapSheetLearnDataRepository에 메서드 추가
3. Import 누락
- 문제:
HashMap, Repository 클래스들 import 누락 - 해결: 필요한 모든 import 문 추가
현재 사용 가능한 API 목록
GET APIs
1. 모니터링 상태 조회
curl "http://localhost:8080/api/geojson/monitor/status"
응답 예시:
{
"cronExpression": "0/30 * * * * *",
"processedDirectory": "/Users/deniallee/geojson/processed",
"watchDirectory": "/Users/deniallee/geojson/upload",
"errorDirectory": "/Users/deniallee/geojson/error",
"maxFileSize": 104857600,
"maxFileSizeMB": 100,
"supportedExtensions": ["zip", "tar", "tar.gz", "tgz"]
}
2. 시스템 통계 조회 [신규 추가]
curl "http://localhost:8080/api/geojson/monitor/stats"
응답 예시:
{
"fileSystem": {
"processedDirectoryCount": 1,
"errorDirectoryCount": 2,
"watchDirectoryCount": 1
},
"database": {
"totalLearnData": 1,
"totalGeomData": 1,
"pendingAnalysis": 0
},
"monitoring": {
"errorDirectory": "/Users/deniallee/geojson/error",
"isActive": true,
"watchDirectory": "/Users/deniallee/geojson/upload",
"processedDirectory": "/Users/deniallee/geojson/processed",
"cronExpression": "0/30 * * * * *"
}
}
POST APIs
1. 디렉토리 초기화
curl -X POST "http://localhost:8080/api/geojson/monitor/init-directories"
응답 예시:
{
"status": "success",
"message": "디렉토리 초기화가 완료되었습니다."
}
2. 수동 파일 처리
curl -X POST "http://localhost:8080/api/geojson/process/file?filePath=/path/to/file.zip"
3. 미처리 Geometry 변환
curl -X POST "http://localhost:8080/api/geojson/process/geometry"
응답 예시:
{
"message": "Geometry 변환이 완료되었습니다.",
"processedCount": 0,
"processedIds": [],
"status": "success"
}
4. 특정 학습 데이터 Geometry 변환
curl -X POST "http://localhost:8080/api/geojson/process/geometry/convert" \
-H "Content-Type: application/json" \
-d '[1, 2, 3]'
주요 개선사항
-
완전한 통계 정보 제공
- 데이터베이스 통계 (학습 데이터, Geometry 데이터 수)
- 파일 시스템 통계 (각 폴더별 파일 수)
- 모니터링 설정 정보
-
견고한 에러 처리
- 각 API별 적절한 에러 처리
- 상세한 에러 메시지 제공
- 로깅을 통한 디버깅 지원
-
일관된 응답 형식
- 성공/실패 상태 명확히 구분
- JSON 형식 통일
- 적절한 HTTP 상태 코드
시스템 현재 상태
- 모니터링 시스템: 정상 작동 (30초 간격)
- API 서버: http://localhost:8080 에서 실행 중
- 데이터베이스: PostgreSQL + PostGIS 연결됨
- 파일 처리: 자동 ZIP/TAR 처리 가능
- 통계 조회: 실시간 시스템 상태 확인 가능