Files
test/GEOJSON_MONITOR_README.md
2025-12-08 11:20:45 +09:00

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: 연결된 학습데이터 ID
  • geom: 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. 자동 모니터링

  1. 시스템 시작 시 자동으로 스케줄러가 동작
  2. /data/geojson/upload 폴더에 압축파일 업로드
  3. 30초 이내에 자동으로 처리됨
  4. 처리 결과는 로그에서 확인 가능

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

처리 흐름

  1. 파일 모니터링: 스케줄러가 주기적으로 upload 폴더 검사
  2. 압축파일 검증: 파일 형식, 크기 확인
  3. 압축파일 추출: GeoJSON 파일들 추출
  4. 데이터 검증: GeoJSON 형식 검증
  5. 학습데이터 저장: tb_map_sheet_learn_data에 저장
  6. Geometry 변환: JSON → JTS Geometry 변환
  7. Geometry 저장: tb_map_sheet_learn_data_geom에 저장
  8. 파일 이동: 처리 완료된 파일을 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 표현식 조정

문제 해결

자주 발생하는 문제

  1. 폴더 권한 문제

    chmod 755 /data/geojson/upload
    chown -R app-user:app-group /data/geojson/
    
  2. 디스크 공간 부족

    • processed 폴더의 오래된 파일들 정리
    • 임시 폴더 정리
  3. 메모리 부족

    • JVM 힙 크기 조정: -Xmx2g
    • 처리할 파일 크기 제한
  4. 데이터베이스 연결 문제

    • PostgreSQL 연결 상태 확인
    • PostGIS 확장 설치 확인

디버깅 방법

  1. 로그 레벨 조정

    logging:
      level:
        com.kamco.cd.kamcoback.geojson: DEBUG
    
  2. API 테스트

    # 상태 확인
    curl http://localhost:8080/api/geojson/monitor/status
    
    # 통계 확인
    curl http://localhost:8080/api/geojson/data/statistics
    

확장 가능한 기능

  1. 알림 시스템: 처리 완료/실패 시 이메일 또는 슬랙 알림
  2. 웹 UI: 모니터링 및 관리를 위한 웹 인터페이스
  3. 배치 처리: 대용량 파일을 위한 비동기 배치 처리
  4. 데이터 검증: 더 상세한 GeoJSON 데이터 검증 룰
  5. 성능 모니터링: 처리 시간, 메모리 사용량 등 성능 지표 수집

터미널 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]'

주요 개선사항

  1. 완전한 통계 정보 제공

    • 데이터베이스 통계 (학습 데이터, Geometry 데이터 수)
    • 파일 시스템 통계 (각 폴더별 파일 수)
    • 모니터링 설정 정보
  2. 견고한 에러 처리

    • 각 API별 적절한 에러 처리
    • 상세한 에러 메시지 제공
    • 로깅을 통한 디버깅 지원
  3. 일관된 응답 형식

    • 성공/실패 상태 명확히 구분
    • JSON 형식 통일
    • 적절한 HTTP 상태 코드

시스템 현재 상태

  • 모니터링 시스템: 정상 작동 (30초 간격)
  • API 서버: http://localhost:8080 에서 실행 중
  • 데이터베이스: PostgreSQL + PostGIS 연결됨
  • 파일 처리: 자동 ZIP/TAR 처리 가능
  • 통계 조회: 실시간 시스템 상태 확인 가능