diff --git a/label/label-to-review/.editorconfig b/label/label-to-review/.editorconfig new file mode 100644 index 0000000..da27dc8 --- /dev/null +++ b/label/label-to-review/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.java] +max_line_length = 180 diff --git a/label/label-to-review/.gitattributes b/label/label-to-review/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/label/label-to-review/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/label/label-to-review/.gitignore b/label/label-to-review/.gitignore new file mode 100644 index 0000000..db9bd29 --- /dev/null +++ b/label/label-to-review/.gitignore @@ -0,0 +1,74 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### QueryDSL ### +/src/main/generated/ +**/generated/ + +### Logs ### +*.log +logs/ +*.log.* + +### OS ### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +### Environment ### +.env +.env.local +.env.*.local +application-local.yml +application-secret.yml + +### Docker (local testing) ### +.dockerignore +docker-compose.override.yml + +### Temporary ### +*.tmp +*.temp +*.swp +*.swo +*~ +!/CLAUDE.md diff --git a/label/label-to-review/.gitkeep b/label/label-to-review/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/label/label-to-review/.gradle/8.14/checksums/checksums.lock b/label/label-to-review/.gradle/8.14/checksums/checksums.lock deleted file mode 100644 index f939e90..0000000 Binary files a/label/label-to-review/.gradle/8.14/checksums/checksums.lock and /dev/null differ diff --git a/label/label-to-review/.gradle/8.14/executionHistory/executionHistory.bin b/label/label-to-review/.gradle/8.14/executionHistory/executionHistory.bin deleted file mode 100644 index c2fffe4..0000000 Binary files a/label/label-to-review/.gradle/8.14/executionHistory/executionHistory.bin and /dev/null differ diff --git a/label/label-to-review/.gradle/8.14/executionHistory/executionHistory.lock b/label/label-to-review/.gradle/8.14/executionHistory/executionHistory.lock deleted file mode 100644 index 04ac6bf..0000000 Binary files a/label/label-to-review/.gradle/8.14/executionHistory/executionHistory.lock and /dev/null differ diff --git a/label/label-to-review/.gradle/8.14/fileChanges/last-build.bin b/label/label-to-review/.gradle/8.14/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/label/label-to-review/.gradle/8.14/fileChanges/last-build.bin and /dev/null differ diff --git a/label/label-to-review/.gradle/8.14/fileHashes/fileHashes.bin b/label/label-to-review/.gradle/8.14/fileHashes/fileHashes.bin deleted file mode 100644 index c9e8a50..0000000 Binary files a/label/label-to-review/.gradle/8.14/fileHashes/fileHashes.bin and /dev/null differ diff --git a/label/label-to-review/.gradle/8.14/fileHashes/fileHashes.lock b/label/label-to-review/.gradle/8.14/fileHashes/fileHashes.lock deleted file mode 100644 index e10faee..0000000 Binary files a/label/label-to-review/.gradle/8.14/fileHashes/fileHashes.lock and /dev/null differ diff --git a/label/label-to-review/.gradle/8.14/fileHashes/resourceHashesCache.bin b/label/label-to-review/.gradle/8.14/fileHashes/resourceHashesCache.bin deleted file mode 100644 index 86e0be4..0000000 Binary files a/label/label-to-review/.gradle/8.14/fileHashes/resourceHashesCache.bin and /dev/null differ diff --git a/label/label-to-review/.gradle/8.14/gc.properties b/label/label-to-review/.gradle/8.14/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/label/label-to-review/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/label/label-to-review/.gradle/buildOutputCleanup/buildOutputCleanup.lock index aaca4c6..0555ab7 100644 Binary files a/label/label-to-review/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/label/label-to-review/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/label/label-to-review/.gradle/buildOutputCleanup/cache.properties b/label/label-to-review/.gradle/buildOutputCleanup/cache.properties index fddf220..415a87d 100644 --- a/label/label-to-review/.gradle/buildOutputCleanup/cache.properties +++ b/label/label-to-review/.gradle/buildOutputCleanup/cache.properties @@ -1,2 +1,2 @@ -#Mon Feb 02 19:50:45 KST 2026 -gradle.version=8.14 +#Tue Feb 24 20:33:13 KST 2026 +gradle.version=8.14.3 diff --git a/label/label-to-review/.gradle/buildOutputCleanup/outputFiles.bin b/label/label-to-review/.gradle/buildOutputCleanup/outputFiles.bin index acd82ad..4f1dca1 100644 Binary files a/label/label-to-review/.gradle/buildOutputCleanup/outputFiles.bin and b/label/label-to-review/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/label/label-to-review/.gradle/file-system.probe b/label/label-to-review/.gradle/file-system.probe index 599825a..a60b20d 100644 Binary files a/label/label-to-review/.gradle/file-system.probe and b/label/label-to-review/.gradle/file-system.probe differ diff --git a/label/label-to-review/Dockerfile-prod b/label/label-to-review/Dockerfile-prod new file mode 100644 index 0000000..fdd5b00 --- /dev/null +++ b/label/label-to-review/Dockerfile-prod @@ -0,0 +1,23 @@ +# 1단계에서 만든 로컬 베이스 이미지를 사용 +FROM 127.0.0.1:18082/kamco-cd/base-java21-gdal:1.0 + +# 사용자 설정 (앱 별로 다를 수 있으므로 여기에 유지) +ARG UID=1000 +ARG GID=1000 + +RUN groupadd -g ${GID} kcomu \ + && useradd -u ${UID} -g ${GID} -m kcomu + +USER kcomu + +# 작업 디렉토리 설정 +WORKDIR /app + +# JAR 파일 복사 (Jenkins에서 빌드된 ROOT.jar) +COPY build/libs/ROOT.jar app.jar + +# 포트 노출 +EXPOSE 8080 +# 애플리케이션 실행 +# dev 프로파일로 실행 +ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "app.jar"] diff --git a/label/label-to-review/README.md b/label/label-to-review/README.md index 78f614a..5878b61 100644 --- a/label/label-to-review/README.md +++ b/label/label-to-review/README.md @@ -1,26 +1,389 @@ -# LABEL TO REVIEW +# KAMCO Change Detection API -> 어제 라벨링 완료된 것 검수할당 schedule +> KAMCO 변화 탐지 시스템을 위한 백엔드 API 서버 ## 📋 프로젝트 소개 -**label-to-review**는 어제 라벨링 완료된 것을 검수 할당하는 schedule 입니다. +**kamco-change-detection-api**는 공간 데이터의 변화를 탐지하고 관리하기 위한 RESTful API 서버입니다. +JTS(Java Topology Suite)를 활용한 지오메트리 데이터 처리와 PostgreSQL을 통한 공간 데이터 저장을 지원합니다. + +## 🛠️ 기술 스택 + +| Category | Technology | +|----------|------------| +| **Language** | Java 21 | +| **Framework** | Spring Boot 3.5.7 | +| **Database** | PostgreSQL (with PostGIS) | +| **ORM** | Spring Data JPA + Hibernate | +| **Query** | QueryDSL 5.0.0 (Jakarta) | +| **Geospatial** | JTS (Java Topology Suite) + GeoJSON | +| **Connection Pool** | HikariCP | +| **Build Tool** | Gradle 8.x | +| **Monitoring** | Spring Boot Actuator | +| **Container** | Docker + Docker Compose | +| **CI/CD** | Jenkins | ## 🚀 시작하기 -TrainingDataLabelJobService 의 assignReviewerYesterdayLabelComplete 메소드가 매일 00:00분에 schedule 실행됨 -```bash -./gradlew spotlessApply -``` -```bash -./gradlew clean build -``` -```bash -Java -jar label-to-review.jar \ -``` ### 필수 요구사항 - Java 21 (JDK 21) - PostgreSQL 12+ (PostGIS 확장 필요) - Gradle 8.x (또는 Gradle Wrapper 사용) -- Docker & Docker Compose (선택사항) \ No newline at end of file +- Docker & Docker Compose (선택사항) + +### 로컬 환경 설정 + +1. **저장소 클론** +```bash +git clone https://10.100.0.10:3210/dabeeo/kamco-dabeeo-backoffice.git +cd kamco-back +``` + +2. **데이터베이스 설정** + +PostgreSQL 데이터베이스를 준비하고 `src/main/resources/application-local.yml`을 생성: + +```yaml +spring: + config: + activate: + on-profile: local + datasource: + url: jdbc:postgresql://localhost:5432/your_database + username: your_username + password: your_password +``` + +> **참고**: `application-local.yml`은 `.gitignore`에 포함되어 있어 Git에 커밋되지 않습니다. + +3. **빌드 및 실행** + +```bash +# 빌드 +./gradlew build + +# 실행 (local 프로파일) +./gradlew bootRun + +# 또는 JAR 파일로 실행 +java -jar build/libs/ROOT.jar +``` + +서버가 시작되면 http://localhost:8080 에서 접근 가능합니다. + +## ⚙️ 프로파일 설정 + +애플리케이션은 환경별로 다른 설정을 사용합니다: + +| 프로파일 | 환경 | 포트 | 설정 파일 | +|---------|------|------|-----------| +| `local` | 로컬 개발 | 8080 | `application.yml` (기본) | +| `dev` | 개발 서버 | 7100 | `application-dev.yml` | +| `prod` | 운영 서버 | 8080 | `application-prod.yml` | + +### 프로파일 활성화 + +```bash +# 개발 환경으로 실행 +./gradlew bootRun --args='--spring.profiles.active=dev' + +# JAR 실행 시 +java -jar build/libs/ROOT.jar --spring.profiles.active=dev +``` + +## 🧪 테스트 + +```bash +# 전체 테스트 실행 +./gradlew test + +# 특정 테스트 클래스 실행 +./gradlew test --tests com.kamco.cd.kamcoback.KamcoBackApplicationTests + +# 테스트 리포트 확인 +open build/reports/tests/test/index.html +``` + +## 📦 빌드 + +```bash +# 전체 빌드 (테스트 포함) +./gradlew clean build + +# 테스트 제외 빌드 (CI/CD에서 사용) +./gradlew clean build -x test + +# JAR 파일만 생성 +./gradlew bootJar +``` + +빌드된 JAR 파일: `build/libs/ROOT.jar` + +## 🐳 Docker로 실행하기 + +### Docker Compose 사용 (권장) + +```bash +# 빌드 및 실행 +docker-compose -f docker-compose-dev.yml up -d + +# 로그 확인 +docker-compose -f docker-compose-dev.yml logs -f + +# 중지 +docker-compose -f docker-compose-dev.yml down +``` + +### Docker만 사용 + +```bash +# 이미지 빌드 +docker build -f Dockerfile-dev -t kamco-changedetection-api:latest . + +# 컨테이너 실행 +docker run -d \ + --name kamco-changedetection-api \ + -p 7100:8080 \ + kamco-changedetection-api:latest + +# 로그 확인 +docker logs -f kamco-changedetection-api +``` + +## 📡 API 및 모니터링 + +### Actuator 헬스체크 + +애플리케이션 상태를 확인할 수 있는 엔드포인트가 제공됩니다: + +```bash +# 헬스체크 +curl http://localhost:8080/monitor/health + +# 응답 예시 +{ + "status": "UP", + "components": { + "db": { + "status": "UP" + }, + "diskSpace": { + "status": "UP" + } + } +} +``` + +**Actuator 엔드포인트**: +- `/monitor/health` - 애플리케이션 헬스 체크 +- `/monitor/health/readiness` - Kubernetes Readiness Probe +- `/monitor/health/liveness` - Kubernetes Liveness Probe + +## 🏗️ 프로젝트 구조 + +``` +kamco-back/ +├── src/ +│ ├── main/ +│ │ ├── java/com/kamco/cd/kamcoback/ +│ │ │ ├── KamcoBackApplication.java # 메인 애플리케이션 +│ │ │ ├── config/ # 설정 클래스 +│ │ │ │ ├── WebConfig.java # Jackson, CORS 설정 +│ │ │ │ └── StartupLogger.java # 시작 로그 +│ │ │ ├── common/ # 공통 유틸리티 +│ │ │ │ └── utils/geometry/ # GeoJSON 직렬화 +│ │ └── resources/ +│ │ ├── application.yml # 기본 설정 + local/prod +│ │ └── application-dev.yml # 개발 환경 설정 +│ └── test/ # 테스트 코드 +├── build.gradle # Gradle 빌드 설정 +├── Dockerfile-dev # Docker 이미지 정의 +├── docker-compose-dev.yml # Docker Compose 설정 +├── Jenkinsfile-dev # Jenkins CI/CD 파이프라인 +├── .editorconfig # 코드 스타일 설정 +├── intellij-java-google-style.xml # IntelliJ 코드 스타일 +└── README.md # 이 문서 +``` + +## 🎨 코드 스타일 + +프로젝트는 **Google Java Style Guide**를 따르며, 일부 커스터마이징이 적용되어 있습니다: + +- **들여쓰기**: 탭 (표시 너비: 2칸) +- **최대 줄 길이**: 100자 +- **줄 바꿈**: LF (Unix 스타일) +- **인코딩**: UTF-8 + +### IntelliJ IDEA 설정 + +1. `Preferences` → `Editor` → `Code Style` → `Java` +2. `Import Scheme` → `intellij-java-google-style.xml` 선택 + +## 📐 주요 기능 + +### GeoJSON 지원 + +JTS Geometry 타입이 자동으로 GeoJSON 형식으로 직렬화/역직렬화됩니다: + +```java +@Entity +public class SpatialEntity { + @Column(columnDefinition = "geometry(Point,4326)") + private Point location; + + @Column(columnDefinition = "geometry(Polygon,4326)") + private Polygon boundary; +} +``` + +**특징**: +- 16자리 정밀도 (기본 8자리에서 증가) +- Point, Polygon, Geometry 타입 지원 +- 자동 JSON 변환 (Jackson ObjectMapper 설정) + +### QueryDSL 설정 + +타입 안전한 쿼리를 위해 QueryDSL이 설정되어 있습니다: + +```java +// Q-class는 빌드 시 자동 생성됨 +QSpatialEntity entity = QSpatialEntity.spatialEntity; + +List results = queryFactory + .selectFrom(entity) + .where(entity.name.eq("example")) + .fetch(); +``` + +**Q-class 생성 위치**: `build/generated/sources/annotationProcessor/java/main` + +## 🚢 배포 + +### Jenkins CI/CD + +Jenkins를 통한 자동 배포가 설정되어 있습니다 (`Jenkinsfile-dev`): + +**파이프라인 단계**: +1. **Checkout**: Git 저장소에서 코드 가져오기 (develop 브랜치) +2. **Get Commit Hash**: 버전 태깅용 커밋 해시 추출 +3. **Build**: Gradle로 JAR 빌드 (테스트 제외) +4. **Docker Build & Deploy**: Docker 이미지 빌드 및 배포 +5. **Cleanup**: 오래된 이미지 정리 + +**자동 기능**: +- Git 커밋 해시로 이미지 태깅 +- 기존 컨테이너 자동 교체 +- 헬스체크로 배포 검증 +- 오래된 이미지 자동 정리 (최신 5개 유지) + +### 수동 배포 + +```bash +# 1. 빌드 +./gradlew clean build -x test + +# 2. Docker 이미지 빌드 +docker-compose -f docker-compose-dev.yml build + +# 3. 배포 +docker-compose -f docker-compose-dev.yml up -d + +# 4. 헬스체크 +curl http://localhost:7100/monitor/health +``` + +## 🔧 개발 가이드 + +### 새로운 엔티티 추가 + +1. `domain` 패키지에 엔티티 클래스 생성 +2. JPA 어노테이션 설정 +3. 빌드하여 Q-class 자동 생성 +4. Repository 인터페이스 작성 (QueryDSL custom 메서드 포함) + +### GeoJSON 데이터 다루기 + +```java +// Controller에서 GeoJSON 수신/반환 +@PostMapping("/spatial") +public ResponseEntity create(@RequestBody SpatialEntity entity) { + // Point, Polygon이 자동으로 GeoJSON에서 변환됨 + return ResponseEntity.ok(spatialService.save(entity)); +} + +// 응답 예시 +{ + "id": 1, + "location": { + "type": "Point", + "coordinates": [126.9779692, 37.5662952] + } +} +``` + +### 데이터베이스 마이그레이션 + +현재 설정은 `ddl-auto: validate`이므로 스키마 변경 시: + +1. 수동으로 마이그레이션 스크립트 작성 +2. 또는 개발 중에는 `ddl-auto: update` 사용 (주의 필요) +3. 운영 환경에서는 반드시 `validate` 유지 + +## 📝 환경 변수 + +Docker Compose 또는 시스템 환경 변수로 설정 가능: + +| 변수명 | 설명 | 기본값 | +|--------|------|--------| +| `SPRING_PROFILES_ACTIVE` | 활성 프로파일 | `local` | +| `IMAGE_TAG` | Docker 이미지 태그 | `latest` | +| `TZ` | 타임존 | `Asia/Seoul` | + +## 🐛 트러블슈팅 + +### DataSource 설정 오류 + +``` +Failed to configure a DataSource: 'url' attribute is not specified +``` + +**해결 방법**: +1. 프로파일 이름 확인: `dev`, `prod`, `local` (철자 정확히) +2. 해당 프로파일의 `application-{profile}.yml`에 datasource 설정 존재 확인 +3. PostgreSQL 접속 정보 확인 + +### Q-class가 생성되지 않음 + +```bash +# 강제로 Q-class 재생성 +./gradlew clean compileJava +``` + +생성 위치: `build/generated/sources/annotationProcessor/java/main` + +### Docker 컨테이너 헬스체크 실패 + +```bash +# 컨테이너 로그 확인 +docker logs kamco-changedetection-api + +# 직접 헬스체크 +docker exec kamco-changedetection-api curl http://localhost:8080/monitor/health +``` + +## 📚 참고 문서 + +- [Spring Boot 3.5.7 Documentation](https://docs.spring.io/spring-boot/3.5.7/reference/) +- [Spring Data JPA](https://docs.spring.io/spring-data/jpa/reference/) +- [QueryDSL](https://querydsl.com/static/querydsl/latest/reference/html/) +- [JTS Topology Suite](https://github.com/locationtech/jts) +- [GeoJSON Specification](https://geojson.org/) + +## 📄 라이선스 + +Copyright © 2024 KAMCO. All rights reserved. + +## 👥 기여자 + +- Development Team at KAMCO diff --git a/label/label-to-review/build.gradle b/label/label-to-review/build.gradle index ab0dbc0..9b3310e 100644 --- a/label/label-to-review/build.gradle +++ b/label/label-to-review/build.gradle @@ -6,8 +6,7 @@ plugins { } group = 'com.kamco.cd' -version = '0.0.1-SNAPSHOT' -description = 'label-to-review' +description = 'kamco-label-to-review' java { toolchain { @@ -15,14 +14,6 @@ java { } } -bootJar { - archiveFileName = "label-to-review.jar" -} - -jar { - enabled = false // plain.jar 안 만들기(혼동 방지) -} - configurations { compileOnly { extendsFrom annotationProcessor @@ -69,15 +60,15 @@ dependencies { // actuator implementation 'org.springframework.boot:spring-boot-starter-actuator' - // Redis - implementation 'org.springframework.boot:spring-boot-starter-data-redis' - // SpringDoc OpenAPI (Swagger) implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0' // Apache Commons Compress for archive handling implementation 'org.apache.commons:commons-compress:1.26.0' + // crypto + implementation 'org.mindrot:jbcrypt:0.4' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' implementation 'org.reflections:reflections:0.10.2' @@ -89,10 +80,15 @@ dependencies { configurations.configureEach { exclude group: 'javax.media', module: 'jai_core' } +// +//tasks.named('test') { +// useJUnitPlatform() +//} -tasks.named('test') { - useJUnitPlatform() -} + +//bootJar { +// archiveFileName = 'ROOT.jar' +//} // Spotless configuration for code formatting (2-space indent) spotless { diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.class deleted file mode 100644 index 48c08ea..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/config/QuerydslConfig.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/config/QuerydslConfig.class deleted file mode 100644 index 11f1c1a..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/config/QuerydslConfig.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ApiResponseCode.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ApiResponseCode.class deleted file mode 100644 index 18effd2..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ApiResponseCode.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$Error.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$Error.class deleted file mode 100644 index 4aec570..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$Error.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ResponseObj.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ResponseObj.class deleted file mode 100644 index b60f2a2..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ResponseObj.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto.class deleted file mode 100644 index 7e26f32..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$AllocateDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$AllocateDto.class deleted file mode 100644 index fa0b6c9..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$AllocateDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$AllocateInfoDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$AllocateInfoDto.class deleted file mode 100644 index 6919c67..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$AllocateInfoDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$AllocateMoveDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$AllocateMoveDto.class deleted file mode 100644 index 9e1d56b..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$AllocateMoveDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$Basic.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$Basic.class deleted file mode 100644 index faf54c5..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$Basic.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$InferenceDetail.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$InferenceDetail.class deleted file mode 100644 index aadc03c..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$InferenceDetail.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$InspectState.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$InspectState.class deleted file mode 100644 index 0b2eb5e..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$InspectState.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelMngState.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelMngState.class deleted file mode 100644 index a9409ce..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelMngState.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelState.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelState.class deleted file mode 100644 index 71ab91a..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelState.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelerDetail.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelerDetail.class deleted file mode 100644 index d45754a..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelerDetail.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelingStatDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelingStatDto.class deleted file mode 100644 index 3b8008d..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$LabelingStatDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$MoveInfo.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$MoveInfo.class deleted file mode 100644 index 84f08e5..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$MoveInfo.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$MoveUserList.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$MoveUserList.class deleted file mode 100644 index 07ab82f..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$MoveUserList.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$TargetInspector.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$TargetInspector.class deleted file mode 100644 index 048b969..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$TargetInspector.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$TargetUser.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$TargetUser.class deleted file mode 100644 index 0b06d67..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$TargetUser.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$UserList.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$UserList.class deleted file mode 100644 index 13a6718..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$UserList.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$WorkHistoryDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$WorkHistoryDto.class deleted file mode 100644 index e15a463..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$WorkHistoryDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$searchReq.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$searchReq.class deleted file mode 100644 index 2338cf9..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto$searchReq.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto.class deleted file mode 100644 index 8179e0d..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelAllocateDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelInspectorDto$Basic.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelInspectorDto$Basic.class deleted file mode 100644 index cc0a48c..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelInspectorDto$Basic.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelInspectorDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelInspectorDto.class deleted file mode 100644 index 584862e..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelInspectorDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelLabelerDto$Basic.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelLabelerDto$Basic.class deleted file mode 100644 index 7d64067..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelLabelerDto$Basic.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelLabelerDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelLabelerDto.class deleted file mode 100644 index 4b82468..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/LabelLabelerDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$AnalCntInfo.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$AnalCntInfo.class deleted file mode 100644 index c6ec5f9..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$AnalCntInfo.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$AnalMapSheetList.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$AnalMapSheetList.class deleted file mode 100644 index 4c5cb93..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$AnalMapSheetList.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$CompleteLabelData$GeoJsonFeature.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$CompleteLabelData$GeoJsonFeature.class deleted file mode 100644 index ae1392e..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$CompleteLabelData$GeoJsonFeature.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$CompleteLabelData$Properties.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$CompleteLabelData$Properties.class deleted file mode 100644 index eebe09e..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$CompleteLabelData$Properties.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$CompleteLabelData.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$CompleteLabelData.class deleted file mode 100644 index 754ed82..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$CompleteLabelData.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$FeatureCollection.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$FeatureCollection.class deleted file mode 100644 index 7e52a9e..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$FeatureCollection.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$InspectorPendingDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$InspectorPendingDto.class deleted file mode 100644 index b243c59..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$InspectorPendingDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$Tasks.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$Tasks.class deleted file mode 100644 index 8baee66..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto$Tasks.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto.class deleted file mode 100644 index e03275d..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum$EnumDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum$EnumDto.class deleted file mode 100644 index aff3c11..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum$EnumDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum.class deleted file mode 100644 index fad51ec..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/CodeDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/CodeDto.class deleted file mode 100644 index b0b057c..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/CodeDto.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/CommonUseStatus.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/CommonUseStatus.class deleted file mode 100644 index 6e2f34e..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/CommonUseStatus.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/Enums.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/Enums.class deleted file mode 100644 index 6b9ca97..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/Enums.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/MngStateType.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/MngStateType.class deleted file mode 100644 index 0e02cb7..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/MngStateType.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/SyncStateType.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/SyncStateType.class deleted file mode 100644 index 95c1408..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/enums/SyncStateType.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.class deleted file mode 100644 index 3fbb835..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResList.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResList.class index 9777979..b811eaf 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResList.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResList.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResSummary.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResSummary.class index 55c29d2..fdd2411 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResSummary.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResSummary.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResultInfo.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResultInfo.class index d861d3a..29ff2db 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResultInfo.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResultInfo.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Basic.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Basic.class index d2940c2..8466476 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Basic.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Basic.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$BboxPointDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$BboxPointDto.class index de5efd3..802dd63 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$BboxPointDto.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$BboxPointDto.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazz.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazz.class index c8f8e05..4c0979a 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazz.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazz.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazzes.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazzes.class index e5d81f2..417ea18 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazzes.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazzes.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Coordinate.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Coordinate.class index d800dfb..0048742 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Coordinate.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Coordinate.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Dashboard.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Dashboard.class index d476642..d9a4359 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Dashboard.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Dashboard.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Detail.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Detail.class index c12694d..7a8952b 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Detail.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Detail.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$DetailListEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$DetailListEntity.class index 9d5a16f..bd8c5fd 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$DetailListEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$DetailListEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Geom.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Geom.class index 3f065da..5f28558 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Geom.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Geom.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$InferenceBatchSheet.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$InferenceBatchSheet.class index f63eb56..4b29163 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$InferenceBatchSheet.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$InferenceBatchSheet.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$MapSheet.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$MapSheet.class index b76f82a..16ff8d5 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$MapSheet.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$MapSheet.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Scene.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Scene.class index 05ec255..153681e 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Scene.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Scene.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchGeoReq.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchGeoReq.class index 934dcb9..0c16aeb 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchGeoReq.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchGeoReq.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchReq.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchReq.class index b7ba811..956b198 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchReq.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchReq.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Uid.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Uid.class index 3a64879..4f330ff 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Uid.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Uid.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.class index 439019d..4329701 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto.class index 8bc99f5..14b8822 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$RegReq.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$RegReq.class index ac8df42..62dd89a 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$RegReq.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$RegReq.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeExpose.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeExpose.class deleted file mode 100644 index c5c9cc2..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeExpose.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeHidden.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeHidden.class deleted file mode 100644 index ea41d29..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeHidden.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/EnumType.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/EnumType.class deleted file mode 100644 index 6700ff7..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/EnumType.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.class deleted file mode 100644 index 190dc12..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelJobCoreService.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelJobCoreService.class index 35a328c..7171634 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelJobCoreService.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelJobCoreService.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.class deleted file mode 100644 index e3895f9..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.class index 0298c50..a42a7f3 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.class index 2f7d166..1f3595a 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class index b910f80..6bc7dc9 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class index 487388e..6cb0bae 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.class index 7294a45..6a6c7c4 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.class deleted file mode 100644 index bc26791..0000000 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.class and /dev/null differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.class index da2e512..fb61ad4 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.class index 44a88a7..e8073e7 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.class index c263e81..143ee20 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.class index fe95f6f..490afab 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryCustom.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryCustom.class index 60a1f82..098d027 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryCustom.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryCustom.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryImpl.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryImpl.class index 0476d72..269476c 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryImpl.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryImpl.class differ diff --git a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/service/TrainingDataLabelJobService.class b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/service/TrainingDataLabelJobService.class index 2f9fef1..dd5aa1e 100644 Binary files a/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/service/TrainingDataLabelJobService.class and b/label/label-to-review/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/service/TrainingDataLabelJobService.class differ diff --git a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.java b/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.java deleted file mode 100644 index 2bb519c..0000000 --- a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.kamco.cd.kamcoback.postgres.entity; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QCommonDateEntity is a Querydsl query type for CommonDateEntity - */ -@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") -public class QCommonDateEntity extends EntityPathBase { - - private static final long serialVersionUID = 1355779051L; - - public static final QCommonDateEntity commonDateEntity = new QCommonDateEntity("commonDateEntity"); - - public final DateTimePath createdDate = createDateTime("createdDate", java.time.ZonedDateTime.class); - - public final DateTimePath modifiedDate = createDateTime("modifiedDate", java.time.ZonedDateTime.class); - - public QCommonDateEntity(String variable) { - super(CommonDateEntity.class, forVariable(variable)); - } - - public QCommonDateEntity(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QCommonDateEntity(PathMetadata metadata) { - super(CommonDateEntity.class, metadata); - } - -} - diff --git a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.java b/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.java index 52939cb..94fa0b7 100644 --- a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.java +++ b/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.java @@ -19,7 +19,7 @@ public class QLabelingAssignmentEntity extends EntityPathBase analUid = createNumber("analUid", Long.class); diff --git a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.java b/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.java index d85c9e5..1a997e1 100644 --- a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.java +++ b/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.java @@ -19,7 +19,7 @@ public class QLabelingInspectorEntity extends EntityPathBase analUid = createNumber("analUid", Long.class); diff --git a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.java b/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.java index 471c2eb..37d0073 100644 --- a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.java +++ b/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.java @@ -19,7 +19,7 @@ public class QMapInkx50kEntity extends EntityPathBase { public static final QMapInkx50kEntity mapInkx50kEntity = new QMapInkx50kEntity("mapInkx50kEntity"); - public final QCommonDateEntity _super = new QCommonDateEntity(this); + public final com.kamco.cd.kamcoback.postgres.QCommonDateEntity _super = new com.kamco.cd.kamcoback.postgres.QCommonDateEntity(this); //inherited public final DateTimePath createdDate = _super.createdDate; diff --git a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.java b/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.java index be5ad05..5359179 100644 --- a/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.java +++ b/label/label-to-review/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.java @@ -22,7 +22,7 @@ public class QMapInkx5kEntity extends EntityPathBase { public static final QMapInkx5kEntity mapInkx5kEntity = new QMapInkx5kEntity("mapInkx5kEntity"); - public final QCommonDateEntity _super = new QCommonDateEntity(this); + public final com.kamco.cd.kamcoback.postgres.QCommonDateEntity _super = new com.kamco.cd.kamcoback.postgres.QCommonDateEntity(this); //inherited public final DateTimePath createdDate = _super.createdDate; @@ -40,7 +40,7 @@ public class QMapInkx5kEntity extends EntityPathBase { //inherited public final DateTimePath modifiedDate = _super.modifiedDate; - public final EnumPath useInference = createEnum("useInference", com.kamco.cd.kamcoback.enums.CommonUseStatus.class); + public final EnumPath useInference = createEnum("useInference", com.kamco.cd.kamcoback.common.enums.CommonUseStatus.class); public QMapInkx5kEntity(String variable) { this(MapInkx5kEntity.class, forVariable(variable), INITS); diff --git a/label/label-to-review/build/libs/label-to-review.jar b/label/label-to-review/build/libs/label-to-review.jar deleted file mode 100644 index bc3494d..0000000 Binary files a/label/label-to-review/build/libs/label-to-review.jar and /dev/null differ diff --git a/label/label-to-review/build/reports/problems/problems-report.html b/label/label-to-review/build/reports/problems/problems-report.html index d55fb85..f21957b 100644 --- a/label/label-to-review/build/reports/problems/problems-report.html +++ b/label/label-to-review/build/reports/problems/problems-report.html @@ -650,7 +650,7 @@ code + .copy-button { diff --git a/label/label-to-review/build/resources/main/application.yml b/label/label-to-review/build/resources/main/application.yml index 5d1aadc..b6d0803 100644 --- a/label/label-to-review/build/resources/main/application.yml +++ b/label/label-to-review/build/resources/main/application.yml @@ -1,4 +1,69 @@ server: - port: 9080 + port: 8080 +spring: + application: + name: kamco-change-detection-api + profiles: + active: prod # 사용할 프로파일 지정 (ex. dev, prod, test) + + datasource: + driver-class-name: org.postgresql.Driver + hikari: + jdbc: + time_zone: UTC + batch_size: 50 + # 권장 설정 + minimum-idle: 2 + maximum-pool-size: 2 + connection-timeout: 20000 + idle-timeout: 300000 + max-lifetime: 1800000 + leak-detection-threshold: 60000 + + data: + redis: + host: localhost + port: 6379 + password: + jpa: + hibernate: + ddl-auto: update # 테이블이 없으면 생성, 있으면 업데이트 + properties: + hibernate: + jdbc: + batch_size: 50 + default_batch_fetch_size: 100 +logging: + level: + root: INFO + org.springframework.web: DEBUG + org.springframework.security: DEBUG + + # 헬스체크 노이즈 핵심만 다운 + org.springframework.security.web.FilterChainProxy: INFO + org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO + org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO + org.springframework.web.servlet.DispatcherServlet: INFO +# actuator +management: + health: + readinessstate: + enabled: true + livenessstate: + enabled: true + endpoint: + health: + probes: + enabled: true + show-details: always + endpoints: + jmx: + exposure: + exclude: "*" + web: + base-path: /monitor + exposure: + include: + - "health" diff --git a/label/label-to-review/build/resources/main/application_dev.yml b/label/label-to-review/build/resources/main/application_dev.yml deleted file mode 100644 index a5bc4d9..0000000 --- a/label/label-to-review/build/resources/main/application_dev.yml +++ /dev/null @@ -1,67 +0,0 @@ -server: - port: 9080 - -spring: - application: - name: label-to-review - profiles: - active: dev # 사용할 프로파일 지정 (ex. dev, prod, test) - - datasource: - url: jdbc:postgresql://192.168.2.127:15432/kamco_cds - #url: jdbc:postgresql://localhost:5432/kamco_cds - username: kamco_cds - password: kamco_cds_Q!W@E#R$ - hikari: - minimum-idle: 1 - maximum-pool-size: 5 - - jpa: - hibernate: - ddl-auto: update # 테이블이 없으면 생성, 있으면 업데이트 - properties: - hibernate: - jdbc: - batch_size: 50 - default_batch_fetch_size: 100 -logging: - level: - root: INFO - org.springframework.web: DEBUG - org.springframework.security: DEBUG - - # 헬스체크 노이즈 핵심만 다운 - org.springframework.security.web.FilterChainProxy: INFO - org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO - org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO - org.springframework.web.servlet.DispatcherServlet: INFO -# actuator -management: - health: - readinessstate: - enabled: true - livenessstate: - enabled: true - endpoint: - health: - probes: - enabled: true - show-details: always - endpoints: - jmx: - exposure: - exclude: "*" - web: - base-path: /monitor - exposure: - include: - - "health" - -file: - #sync-root-dir: D:/kamco-nfs/images/ - sync-root-dir: /kamco-nfs/images/ - sync-tmp-dir: ${file.sync-root-dir}/tmp - sync-file-extention: tfw,tif - sync-auto-exception-start-year: 2025 - sync-auto-exception-before-year-cnt: 3 - diff --git a/label/label-to-review/build/resources/main/application_local.yml b/label/label-to-review/build/resources/main/application_local.yml deleted file mode 100644 index 328045e..0000000 --- a/label/label-to-review/build/resources/main/application_local.yml +++ /dev/null @@ -1,67 +0,0 @@ -server: - port: 9080 - -spring: - application: - name: imagery-make-dataset - profiles: - active: local # 사용할 프로파일 지정 (ex. dev, prod, test) - - datasource: - url: jdbc:postgresql://192.168.2.127:15432/kamco_cds - #url: jdbc:postgresql://localhost:5432/kamco_cds - username: kamco_cds - password: kamco_cds_Q!W@E#R$ - hikari: - minimum-idle: 1 - maximum-pool-size: 5 - - jpa: - hibernate: - ddl-auto: update # 테이블이 없으면 생성, 있으면 업데이트 - properties: - hibernate: - jdbc: - batch_size: 50 - default_batch_fetch_size: 100 -logging: - level: - root: INFO - org.springframework.web: DEBUG - org.springframework.security: DEBUG - - # 헬스체크 노이즈 핵심만 다운 - org.springframework.security.web.FilterChainProxy: INFO - org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO - org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO - org.springframework.web.servlet.DispatcherServlet: INFO -# actuator -management: - health: - readinessstate: - enabled: true - livenessstate: - enabled: true - endpoint: - health: - probes: - enabled: true - show-details: always - endpoints: - jmx: - exposure: - exclude: "*" - web: - base-path: /monitor - exposure: - include: - - "health" - -file: - #sync-root-dir: D:/kamco-nfs/images/ - sync-root-dir: /kamco-nfs/images/ - sync-tmp-dir: ${file.sync-root-dir}/tmp - sync-file-extention: tfw,tif - sync-auto-exception-start-year: 2025 - sync-auto-exception-before-year-cnt: 3 - diff --git a/label/label-to-review/build/resources/main/application_prod.yml b/label/label-to-review/build/resources/main/application_prod.yml deleted file mode 100644 index 1282d26..0000000 --- a/label/label-to-review/build/resources/main/application_prod.yml +++ /dev/null @@ -1,67 +0,0 @@ -server: - port: 9080 - -spring: - application: - name: imagery-make-dataset - profiles: - active: prod # 사용할 프로파일 지정 (ex. dev, prod, test) - - datasource: - url: jdbc:postgresql://192.168.2.127:15432/kamco_cds - #url: jdbc:postgresql://localhost:5432/kamco_cds - username: kamco_cds - password: kamco_cds_Q!W@E#R$ - hikari: - minimum-idle: 1 - maximum-pool-size: 5 - - jpa: - hibernate: - ddl-auto: update # 테이블이 없으면 생성, 있으면 업데이트 - properties: - hibernate: - jdbc: - batch_size: 50 - default_batch_fetch_size: 100 -logging: - level: - root: INFO - org.springframework.web: DEBUG - org.springframework.security: DEBUG - - # 헬스체크 노이즈 핵심만 다운 - org.springframework.security.web.FilterChainProxy: INFO - org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO - org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO - org.springframework.web.servlet.DispatcherServlet: INFO -# actuator -management: - health: - readinessstate: - enabled: true - livenessstate: - enabled: true - endpoint: - health: - probes: - enabled: true - show-details: always - endpoints: - jmx: - exposure: - exclude: "*" - web: - base-path: /monitor - exposure: - include: - - "health" - -file: - #sync-root-dir: D:/kamco-nfs/images/ - sync-root-dir: /kamco-nfs/images/ - sync-tmp-dir: ${file.sync-root-dir}/tmp - sync-file-extention: tfw,tif - sync-auto-exception-start-year: 2025 - sync-auto-exception-before-year-cnt: 3 - diff --git a/label/label-to-review/build/tmp/bootJar/MANIFEST.MF b/label/label-to-review/build/tmp/bootJar/MANIFEST.MF index 21c8aaa..9f482de 100644 --- a/label/label-to-review/build/tmp/bootJar/MANIFEST.MF +++ b/label/label-to-review/build/tmp/bootJar/MANIFEST.MF @@ -7,6 +7,5 @@ Spring-Boot-Lib: BOOT-INF/lib/ Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Spring-Boot-Layers-Index: BOOT-INF/layers.idx Build-Jdk-Spec: 21 -Implementation-Title: kamco-label-to-review-job -Implementation-Version: 0.0.1-SNAPSHOT +Implementation-Title: kamco-label-to-review diff --git a/label/label-to-review/build/tmp/compileJava/previous-compilation-data.bin b/label/label-to-review/build/tmp/compileJava/previous-compilation-data.bin index f076f10..9cbdf71 100644 Binary files a/label/label-to-review/build/tmp/compileJava/previous-compilation-data.bin and b/label/label-to-review/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/label/label-to-review/dev.backup b/label/label-to-review/dev.backup deleted file mode 100644 index e69de29..0000000 diff --git a/label/label-to-review/docker-compose-dev.yml b/label/label-to-review/docker-compose-dev.yml index 40b4346..295c7ee 100644 --- a/label/label-to-review/docker-compose-dev.yml +++ b/label/label-to-review/docker-compose-dev.yml @@ -15,10 +15,6 @@ services: - SPRING_PROFILES_ACTIVE=dev - TZ=Asia/Seoul volumes: - - /mnt/nfs_share/images:/app/original-images - - /mnt/nfs_share/model_output:/app/model-outputs - - /mnt/nfs_share/train_dataset:/app/train-dataset - - /mnt/nfs_share/tmp:/app/tmp - /kamco-nfs:/kamco-nfs networks: - kamco-cds diff --git a/label/label-to-review/docker-compose-prod.yml b/label/label-to-review/docker-compose-prod.yml new file mode 100644 index 0000000..8c586f5 --- /dev/null +++ b/label/label-to-review/docker-compose-prod.yml @@ -0,0 +1,31 @@ +services: + kamco-changedetection-api: + build: + context: . + dockerfile: Dockerfile-prod + args: + UID: 1000 # manager01 UID + GID: 1000 # manager01 GID + image: kamco-changedetection-api:${IMAGE_TAG:-latest} + container_name: kamco-changedetection-api + user: "1000:1000" + ports: + - "7100:8080" + environment: + - SPRING_PROFILES_ACTIVE=dev + - TZ=Asia/Seoul + volumes: + - /data:/kamco-nfs + networks: + - kamco-cds + restart: unless-stopped + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:8080/monitor/health" ] + interval: 10s + timeout: 5s + retries: 5 + start_period: 40s + +networks: + kamco-cds: + external: true diff --git a/label/label-to-review/gradle/wrapper/gradle-wrapper.properties b/label/label-to-review/gradle/wrapper/gradle-wrapper.properties index ca025c8..d4081da 100644 --- a/label/label-to-review/gradle/wrapper/gradle-wrapper.properties +++ b/label/label-to-review/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/label/label-to-review/http/CommonCode.http b/label/label-to-review/http/CommonCode.http deleted file mode 100644 index 6083e22..0000000 --- a/label/label-to-review/http/CommonCode.http +++ /dev/null @@ -1,4 +0,0 @@ -### GET getByCodeId -GET http://localhost:8080/api/code/1 -Content-Type: application/json -### diff --git a/label/label-to-review/settings.gradle b/label/label-to-review/settings.gradle index 23e87e5..c96106d 100644 --- a/label/label-to-review/settings.gradle +++ b/label/label-to-review/settings.gradle @@ -1,6 +1,6 @@ pluginManagement { - plugins { - id 'org.jetbrains.kotlin.jvm' version '2.2.20' - } + plugins { + id 'org.jetbrains.kotlin.jvm' version '2.2.20' + } } -rootProject.name = 'kamco-label-to-review-job' +rootProject.name = 'kamco-label-to-review' diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java index baa9fdc..02561f9 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java @@ -87,7 +87,7 @@ public class CommonCodeDto { private Integer order; private Boolean used; private Boolean deleted; - private List children; + private List children; @JsonFormatDttm private ZonedDateTime createdDttm; @@ -112,7 +112,7 @@ public class CommonCodeDto { Integer order, Boolean used, Boolean deleted, - List children, + List children, ZonedDateTime createdDttm, ZonedDateTime updatedDttm, String props1, diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/README.md b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/README.md new file mode 100644 index 0000000..d6509dd --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/README.md @@ -0,0 +1,13 @@ +### TODO +## 환경분리 +- local +- dev +- prod + +## codestyle 세팅 - google 고쳐주세요. tab 간격 2자리 + +## objectmepper 빈으로 세팅 +## 라이브러리 체크 +## querydsl 세팅 custom, impl +## 공통코드 관리 +## 나중 레디스랑 캐시 \ No newline at end of file diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/ApiConfigEnum.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/ApiConfigEnum.java similarity index 90% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/ApiConfigEnum.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/ApiConfigEnum.java index 79cd405..30d8ea2 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/ApiConfigEnum.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/ApiConfigEnum.java @@ -1,4 +1,4 @@ -package com.kamco.cd.kamcoback.enums; +package com.kamco.cd.kamcoback.common.enums; import lombok.EqualsAndHashCode; import lombok.Getter; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/CommonUseStatus.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/CommonUseStatus.java similarity index 82% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/CommonUseStatus.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/CommonUseStatus.java index bcd0b39..66f9260 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/CommonUseStatus.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/CommonUseStatus.java @@ -1,7 +1,8 @@ -package com.kamco.cd.kamcoback.enums; +package com.kamco.cd.kamcoback.common.enums; -import com.kamco.cd.kamcoback.enums.ApiConfigEnum.EnumDto; -import com.kamco.cd.kamcoback.inferface.EnumType; +import com.kamco.cd.kamcoback.common.enums.ApiConfigEnum.EnumDto; +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; import java.util.Arrays; import lombok.AllArgsConstructor; import lombok.Getter; @@ -12,6 +13,7 @@ import lombok.Getter; *

This enum represents whether a resource is active, excluded from processing, or inactive. It * is commonly used for filtering, business rules, and status management. */ +@CodeExpose @Getter @AllArgsConstructor public enum CommonUseStatus implements EnumType { diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/CrsType.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/CrsType.java new file mode 100644 index 0000000..42fffdf --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/CrsType.java @@ -0,0 +1,27 @@ +package com.kamco.cd.kamcoback.common.enums; + +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum CrsType implements EnumType { + EPSG_3857("Web Mercator, 웹지도 미터(EPSG:900913 동일)"), + EPSG_4326("WGS84 위경도, GeoJSON/OSM 기본"), + EPSG_5186("Korea 2000 중부 TM, 한국 SHP"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/DetectionClassification.java similarity index 96% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/DetectionClassification.java index d2a1330..1d5e44b 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/DetectionClassification.java @@ -1,4 +1,4 @@ -package com.kamco.cd.kamcoback.inference.dto; +package com.kamco.cd.kamcoback.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/FileUploadStatus.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/FileUploadStatus.java new file mode 100644 index 0000000..d81ab6e --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/FileUploadStatus.java @@ -0,0 +1,29 @@ +package com.kamco.cd.kamcoback.common.enums; + +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum FileUploadStatus implements EnumType { + INIT("초기화"), + UPLOADING("업로드중"), + DONE("업로드완료"), + MERGED("병합완료"), + MERGE_FAIL("병합 실패"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/ImageryFitStatus.java similarity index 82% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/ImageryFitStatus.java index 777c31f..ad7df5a 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/ImageryFitStatus.java @@ -1,5 +1,7 @@ -package com.kamco.cd.kamcoback.common.utils.enums; +package com.kamco.cd.kamcoback.common.enums; +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; import java.util.Arrays; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/LayerType.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/LayerType.java new file mode 100644 index 0000000..9981665 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/LayerType.java @@ -0,0 +1,37 @@ +package com.kamco.cd.kamcoback.common.enums; + +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import java.util.Optional; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum LayerType implements EnumType { + TILE("배경지도"), + GEOJSON("객체데이터"), + WMTS("타일레이어"), + WMS("지적도"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + + public static Optional from(String type) { + try { + return Optional.of(LayerType.valueOf(type)); + } catch (Exception e) { + return Optional.empty(); + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/MngStateType.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/MngStateType.java similarity index 70% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/MngStateType.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/MngStateType.java index f5fd245..d1d98df 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/MngStateType.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/MngStateType.java @@ -1,9 +1,11 @@ -package com.kamco.cd.kamcoback.enums; +package com.kamco.cd.kamcoback.common.enums; -import com.kamco.cd.kamcoback.inferface.EnumType; +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; import lombok.AllArgsConstructor; import lombok.Getter; +@CodeExpose @Getter @AllArgsConstructor public enum MngStateType implements EnumType { diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/RoleType.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/RoleType.java new file mode 100644 index 0000000..3321e90 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/RoleType.java @@ -0,0 +1,27 @@ +package com.kamco.cd.kamcoback.common.enums; + +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum RoleType implements EnumType { + ADMIN("관리자"), + LABELER("라벨러"), + REVIEWER("검수자"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/StatusType.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/StatusType.java new file mode 100644 index 0000000..8559968 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/StatusType.java @@ -0,0 +1,27 @@ +package com.kamco.cd.kamcoback.common.enums; + +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum StatusType implements EnumType { + ACTIVE("사용"), + INACTIVE("사용중지"), + PENDING("계정등록"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncCheckStateType.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncCheckStateType.java new file mode 100644 index 0000000..2b4f1e8 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncCheckStateType.java @@ -0,0 +1,26 @@ +package com.kamco.cd.kamcoback.common.enums; + +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum SyncCheckStateType implements EnumType { + NOTYET("미처리"), + DONE("완료"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/SyncStateType.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncStateType.java similarity index 68% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/SyncStateType.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncStateType.java index adba1cc..f5c9d08 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/SyncStateType.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncStateType.java @@ -1,8 +1,8 @@ -package com.kamco.cd.kamcoback.enums; +package com.kamco.cd.kamcoback.common.enums; -import com.kamco.cd.kamcoback.inferface.CodeExpose; -import com.kamco.cd.kamcoback.inferface.CodeHidden; -import com.kamco.cd.kamcoback.inferface.EnumType; +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.CodeHidden; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/error/AuthErrorCode.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/error/AuthErrorCode.java new file mode 100644 index 0000000..ad3fcc7 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/enums/error/AuthErrorCode.java @@ -0,0 +1,24 @@ +package com.kamco.cd.kamcoback.common.enums.error; + +import com.kamco.cd.kamcoback.common.utils.ErrorCode; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public enum AuthErrorCode implements ErrorCode { + LOGIN_ID_NOT_FOUND("LOGIN_ID_NOT_FOUND", HttpStatus.UNAUTHORIZED), + + LOGIN_PASSWORD_MISMATCH("LOGIN_PASSWORD_MISMATCH", HttpStatus.UNAUTHORIZED), + + LOGIN_PASSWORD_EXCEEDED("LOGIN_PASSWORD_EXCEEDED", HttpStatus.UNAUTHORIZED), + + INACTIVE_ID("INACTIVE_ID", HttpStatus.UNAUTHORIZED); + + private final String code; + private final HttpStatus status; + + AuthErrorCode(String code, HttpStatus status) { + this.code = code; + this.status = status; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/exception/CustomApiException.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/exception/CustomApiException.java new file mode 100644 index 0000000..ca4dc02 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/exception/CustomApiException.java @@ -0,0 +1,36 @@ +package com.kamco.cd.kamcoback.common.exception; + +import com.kamco.cd.kamcoback.common.utils.ErrorCode; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public class CustomApiException extends RuntimeException { + + private final String codeName; // ApiResponseCode enum name과 맞추는 용도 (예: "UNPROCESSABLE_ENTITY") + private final HttpStatus status; // 응답으로 내려줄 HttpStatus + + public CustomApiException(String codeName, HttpStatus status, String message) { + super(message); + this.codeName = codeName; + this.status = status; + } + + public CustomApiException(String codeName, HttpStatus status) { + super(codeName); + this.codeName = codeName; + this.status = status; + } + + public CustomApiException(ErrorCode errorCode) { + super(errorCode.getCode()); // 또는 errorCode.getMessage() + this.codeName = errorCode.getCode(); + this.status = errorCode.getStatus(); + } + + public CustomApiException(String codeName, HttpStatus status, Throwable cause) { + super(codeName, cause); + this.codeName = codeName; + this.status = status; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/exception/DuplicateFileException.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/exception/DuplicateFileException.java new file mode 100644 index 0000000..8ee3b67 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/exception/DuplicateFileException.java @@ -0,0 +1,7 @@ +package com.kamco.cd.kamcoback.common.exception; + +public class DuplicateFileException extends RuntimeException { + public DuplicateFileException(String message) { + super(message); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/exception/ValidationException.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/exception/ValidationException.java new file mode 100644 index 0000000..f9df75b --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/exception/ValidationException.java @@ -0,0 +1,7 @@ +package com.kamco.cd.kamcoback.common.exception; + +public class ValidationException extends RuntimeException { + public ValidationException(String message) { + super(message); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/geometry/GeoJsonFileWriter.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/geometry/GeoJsonFileWriter.java new file mode 100644 index 0000000..a5182b1 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/geometry/GeoJsonFileWriter.java @@ -0,0 +1,171 @@ +package com.kamco.cd.kamcoback.common.geometry; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import java.io.FileWriter; +import java.io.IOException; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.locationtech.jts.geom.Geometry; + +/** GeoJSON 파일 생성 유틸리티 */ +public class GeoJsonFileWriter { + + private final ObjectMapper objectMapper; + + public GeoJsonFileWriter() { + this.objectMapper = new ObjectMapper(); + } + + public GeoJsonFileWriter(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + + /** + * GeoJSON 문자열 생성 + * + * @param features Feature 목록 + * @param name GeoJSON name 속성 + * @param srid CRS EPSG 코드 + * @return GeoJSON 문자열 + */ + public String buildGeoJson(List features, String name, int srid) { + try { + ObjectNode root = objectMapper.createObjectNode(); + root.put("type", "FeatureCollection"); + root.put("name", name); + + // CRS 정보 + ObjectNode crs = objectMapper.createObjectNode(); + crs.put("type", "name"); + ObjectNode crsProps = objectMapper.createObjectNode(); + crsProps.put("name", "urn:ogc:def:crs:EPSG::" + srid); + crs.set("properties", crsProps); + root.set("crs", crs); + + // Features 배열 + ArrayNode featuresArray = objectMapper.createArrayNode(); + for (ImageFeature f : features) { + featuresArray.add(buildFeature(f)); + } + root.set("features", featuresArray); + + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(root); + + } catch (Exception e) { + throw new RuntimeException("GeoJSON 생성 실패", e); + } + } + + /** 단일 Feature 객체 생성 */ + private ObjectNode buildFeature(ImageFeature f) throws Exception { + ObjectNode feature = objectMapper.createObjectNode(); + feature.put("type", "Feature"); + + // Properties + ObjectNode properties = objectMapper.createObjectNode(); + properties.put("scene_id", f.getSceneId()); + properties.put("abs_path", f.getAbsPath()); + properties.put("basename", f.getFileName()); + properties.put("georef_source", "internal"); + properties.put("crs_source", "transformed"); + feature.set("properties", properties); + + // Geometry (CRS 제거) + ObjectNode geometry = (ObjectNode) objectMapper.readTree(f.getGeomJson()); + geometry.remove("crs"); + feature.set("geometry", geometry); + + return feature; + } + + /** + * 파일로 저장 + * + * @param geojson GeoJSON 문자열 + * @param filePath 저장 경로 + */ + public void writeToFile(String geojson, String filePath) throws IOException { + try (FileWriter writer = new FileWriter(filePath)) { + writer.write(geojson); + } + } + + /** Feature 목록을 바로 파일로 저장 */ + public void exportToFile(List features, String name, int srid, String filePath) + throws IOException { + String geojson = buildGeoJson(features, name, srid); + writeToFile(geojson, filePath); + } + + /** Feature 데이터 클래스 */ + public static class ImageFeature { + + private String sceneId; + private String filePath; + private String fileName; + private String geomJson; + + public ImageFeature() {} + + public ImageFeature(String sceneId, String filePath, String fileName, Geometry geomJson) { + this.sceneId = sceneId; + this.filePath = filePath; + this.fileName = fileName; + if (geomJson != null) { + + this.geomJson = GeometryUtils.toGeoJson(geomJson); + } + } + + public String getSceneId() { + return sceneId; + } + + public void setSceneId(String sceneId) { + this.sceneId = sceneId; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getGeomJson() { + return geomJson; + } + + public void setGeomJson(String geomJson) { + this.geomJson = geomJson; + } + + public String getAbsPath() { + return filePath + "/" + fileName; + } + } + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class Scene { + + List features; + String filePath; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/geometry/GeometryUtils.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/geometry/GeometryUtils.java new file mode 100644 index 0000000..dff401d --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/geometry/GeometryUtils.java @@ -0,0 +1,17 @@ +package com.kamco.cd.kamcoback.common.geometry; + +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.io.geojson.GeoJsonWriter; + +public class GeometryUtils { + + private static final GeoJsonWriter GEOJSON_WRITER = new GeoJsonWriter(8); + + /** JTS Geometry를 GeoJSON 문자열로 변환 */ + public static String toGeoJson(Geometry geometry) { + if (geometry == null) { + return null; + } + return GEOJSON_WRITER.write(geometry); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/service/BaseCoreService.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/service/BaseCoreService.java new file mode 100644 index 0000000..072e808 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/service/BaseCoreService.java @@ -0,0 +1,38 @@ +package com.kamco.cd.kamcoback.common.service; + +import org.springframework.data.domain.Page; + +/** + * Base Core Service Interface + * + *

CRUD operations를 정의하는 기본 서비스 인터페이스 + * + * @param Entity 타입 + * @param Entity의 ID 타입 + * @param Search Request 타입 + */ +public interface BaseCoreService { + + /** + * ID로 엔티티를 삭제합니다. + * + * @param id 삭제할 엔티티의 ID + */ + void remove(ID id); + + /** + * ID로 단건 조회합니다. + * + * @param id 조회할 엔티티의 ID + * @return 조회된 엔티티 + */ + T getOneById(ID id); + + /** + * 검색 조건과 페이징으로 조회합니다. + * + * @param searchReq 검색 조건 + * @return 페이징 처리된 검색 결과 + */ + Page search(S searchReq); +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/service/ExternalJarRunner.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/service/ExternalJarRunner.java new file mode 100644 index 0000000..94bc2cb --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/service/ExternalJarRunner.java @@ -0,0 +1,135 @@ +package com.kamco.cd.kamcoback.common.service; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Log4j2 +@Component +public class ExternalJarRunner { + @Value("${spring.profiles.active}") + private String profile; + + private static final long TIMEOUT_MINUTES = TimeUnit.DAYS.toMinutes(3); + + /** + * shp 파일 생성 + * + * @param jarPath jar 경로 + * @param batchIds 배치 아이디 + * @param inferenceId uid + * @param mapIds 추론 실행한 도엽 ids + * @param mode + *

MERGED - batch-ids 에 해당하는 **모든 데이터를 하나의 Shapefile로 병합 생성, + *

MAP_IDS - 명시적으로 전달한 map-ids만 대상으로 Shapefile 생성, + *

RESOLVE - batch-ids 기준으로 **JAR 내부에서 map_ids를 조회**한 뒤 Shapefile 생성 + */ + public void run(String jarPath, String batchIds, String inferenceId, String mapIds, String mode) { + List args = new ArrayList<>(); + + addArg(args, "converter.inference-id", inferenceId); + addArg(args, "converter.batch-ids", batchIds); + + if (mapIds != null && !mapIds.isEmpty()) { + addArg(args, "converter.map-ids", mapIds); + } + + if (mode != null && !mode.isEmpty()) { + addArg(args, "converter.mode", mode); + } + addArg(args, "spring.profiles.active", profile); + execJar(jarPath, args); + } + + /** + * geoserver 등록 + * + * @param jarPath jar 파일경로 + * @param register shp 경로 + * @param layer geoserver에 등록될 레이어 이름 + */ + public void run(String jarPath, String register, String layer) { + List args = new ArrayList<>(); + + addArg(args, "upload-shp", register); + // addArg(args, "layer", layer); + + addArg(args, "spring.profiles.active", profile); + execJar(jarPath, args); + } + + private void execJar(String jarPath, List args) { + StringBuilder out = new StringBuilder(); + + try { + List cmd = new ArrayList<>(); + cmd.add("java"); + cmd.add("-jar"); + cmd.add(jarPath); + cmd.addAll(args); + + ProcessBuilder pb = new ProcessBuilder(cmd); + pb.redirectErrorStream(true); + + Process p = pb.start(); + + try (BufferedReader br = + new BufferedReader(new InputStreamReader(p.getInputStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = br.readLine()) != null) { + out.append(line).append('\n'); + log.info("[jar] {}", line); + } + } + + boolean finished = p.waitFor(TIMEOUT_MINUTES, TimeUnit.MINUTES); + if (!finished) { + p.destroyForcibly(); + throw new RuntimeException("jar timeout\n" + out); + } + + int exit = p.exitValue(); + if (exit != 0) { + throw new RuntimeException("jar failed. exitCode=" + exit + "\n" + out); + } + + log.info("jar finished successfully"); + + } catch (Exception e) { + log.error("jar execution error. output=\n{}", out, e); + } + } + + private void addArg(List args, String key, String value) { + value = normalizeCliValue(value); + + if (value != null && !value.isBlank()) { + log.info("addArg key={}, normalizedValue=[{}], length={}", key, value, value.length()); + args.add("--" + key + "=" + value); + } + } + + private String normalizeCliValue(String v) { + if (v == null) { + return null; + } + + v = v.trim(); + + // 양끝 따옴표 제거 + if (v.length() >= 2 && v.startsWith("\"") && v.endsWith("\"")) { + v = v.substring(1, v.length() - 1); + } + + // 남아있는 따옴표 제거 + v = v.replace("\"", ""); + + return v; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/DateRange.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/DateRange.java new file mode 100644 index 0000000..c372ddb --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/DateRange.java @@ -0,0 +1,20 @@ +package com.kamco.cd.kamcoback.common.utils; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.ZonedDateTime; + +public class DateRange { + + private static final ZoneId KST = ZoneId.of("Asia/Seoul"); + + private DateRange() {} + + public static ZonedDateTime start(LocalDate date) { + return date == null ? null : date.atStartOfDay(KST); + } + + public static ZonedDateTime end(LocalDate date) { + return date == null ? null : date.plusDays(1).atStartOfDay(KST); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/ErrorCode.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/ErrorCode.java new file mode 100644 index 0000000..8ace8fe --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/ErrorCode.java @@ -0,0 +1,10 @@ +package com.kamco.cd.kamcoback.common.utils; + +import org.springframework.http.HttpStatus; + +public interface ErrorCode { + + String getCode(); + + HttpStatus getStatus(); +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/HeaderUtil.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/HeaderUtil.java new file mode 100644 index 0000000..d7078aa --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/HeaderUtil.java @@ -0,0 +1,23 @@ +package com.kamco.cd.kamcoback.common.utils; + +import jakarta.servlet.http.HttpServletRequest; + +public final class HeaderUtil { + + private HeaderUtil() {} + + /** 특정 Header 값 조회 */ + public static String get(HttpServletRequest request, String headerName) { + if (request == null || headerName == null) { + return null; + } + + String value = request.getHeader(headerName); + return (value != null && !value.isBlank()) ? value : null; + } + + /** 필수 Header 조회 (없으면 null) */ + public static String getRequired(HttpServletRequest request, String headerName) { + return get(request, headerName); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/NameValidator.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/NameValidator.java new file mode 100644 index 0000000..ed56a20 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/NameValidator.java @@ -0,0 +1,43 @@ +package com.kamco.cd.kamcoback.common.utils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class NameValidator { + + private static final String HANGUL_REGEX = ".*\\p{IsHangul}.*"; + private static final Pattern HANGUL_PATTERN = Pattern.compile(HANGUL_REGEX); + + private static final String WHITESPACE_REGEX = ".*\\s.*"; + private static final Pattern WHITESPACE_PATTERN = Pattern.compile(WHITESPACE_REGEX); + + public static boolean containsKorean(String str) { + if (str == null || str.isEmpty()) { + return false; + } + Matcher matcher = HANGUL_PATTERN.matcher(str); + return matcher.matches(); + } + + public static boolean containsWhitespaceRegex(String str) { + if (str == null || str.isEmpty()) { + return false; + } + + Matcher matcher = WHITESPACE_PATTERN.matcher(str); + // find()를 사용하여 문자열 내에서 패턴이 일치하는 부분이 있는지 확인 + return matcher.find(); + } + + public static boolean isNullOrEmpty(String str) { + if (str == null) { + return true; + } + + if (str.isEmpty()) { + return true; + } + + return false; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/NetUtils.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/NetUtils.java new file mode 100644 index 0000000..9c6ee78 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/NetUtils.java @@ -0,0 +1,61 @@ +package com.kamco.cd.kamcoback.common.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.net.InetAddress; +import java.net.URLEncoder; +import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.stream.Collectors; +import org.springframework.http.HttpHeaders; + +public class NetUtils { + + public String getLocalIP() { + + String ip; + { + try { + InetAddress local = InetAddress.getLocalHost(); + ip = local.getHostAddress(); + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } + } + + return ip; + } + + public String dtoToQueryString(Object dto, String queryString) { + ObjectMapper objectMapper = new ObjectMapper(); + + Map map = objectMapper.convertValue(dto, Map.class); + + String qStr = + map.entrySet().stream() + .filter(entry -> entry.getValue() != null) // null 제외 + .map( + entry -> + String.format( + "%s=%s", + entry.getKey(), + URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8))) + .collect(Collectors.joining("&")); + + if (queryString == null || queryString.isEmpty()) { + queryString = "?" + qStr; + } else { + queryString = queryString + "&" + qStr; + } + + // 2. Map을 쿼리 스트링 문자열로 변환 + return queryString; + } + + public HttpHeaders jsonHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.set(HttpHeaders.ACCEPT, "application/json;charset=UTF-8"); + headers.set(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8"); + return headers; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/StringUtils.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/StringUtils.java new file mode 100644 index 0000000..8b8a6c8 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/StringUtils.java @@ -0,0 +1,34 @@ +package com.kamco.cd.kamcoback.common.utils; + +import java.util.regex.Pattern; +import org.mindrot.jbcrypt.BCrypt; + +public class StringUtils { + + private static final int BCRYPT_COST = 10; + + /** + * 영문, 숫자, 특수문자를 모두 포함하여 8~20자 이내의 비밀번호 + * + * @param password 벨리데이션 필요한 패스워드 + * @return + */ + public static boolean isValidPassword(String password) { + String passwordPattern = + "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[!@#$%^&*()_+\\-\\[\\]{};':\"\\\\|,.<>/?=]).{8,20}$"; + return Pattern.matches(passwordPattern, password); + } + + /** + * 패스워드 암호화 + * + * @param password 암호화 필요한 패스워드 + * @return + */ + public static String hashPassword(String password) { + if (password == null) { + throw new IllegalArgumentException("password must not be null"); + } + return BCrypt.hashpw(password.trim(), BCrypt.gensalt(BCRYPT_COST)); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/geometry/GeometryDeserializer.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/geometry/GeometryDeserializer.java new file mode 100644 index 0000000..2e0c68e --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/geometry/GeometryDeserializer.java @@ -0,0 +1,42 @@ +package com.kamco.cd.kamcoback.common.utils.geometry; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import java.io.IOException; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.io.geojson.GeoJsonReader; +import org.springframework.util.StringUtils; + +public class GeometryDeserializer extends StdDeserializer { + + public GeometryDeserializer() { + super(Geometry.class); + } + + public GeometryDeserializer(Class targetType) { + super(targetType); + } + + // TODO: test code + @SuppressWarnings("unchecked") + @Override + public T deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JacksonException { + String json = jsonParser.readValueAsTree().toString(); + + if (!StringUtils.hasText(json)) { + return null; + } + + try { + GeoJsonReader reader = new GeoJsonReader(); + Geometry geometry = reader.read(json); + geometry.setSRID(5186); + return (T) geometry; + } catch (Exception e) { + throw new IllegalArgumentException("Failed to deserialize GeoJSON into Geometry", e); + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/geometry/GeometrySerializer.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/geometry/GeometrySerializer.java new file mode 100644 index 0000000..733c36a --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/geometry/GeometrySerializer.java @@ -0,0 +1,31 @@ +package com.kamco.cd.kamcoback.common.utils.geometry; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import java.io.IOException; +import java.util.Objects; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.io.geojson.GeoJsonWriter; + +public class GeometrySerializer extends StdSerializer { + + // TODO: test code + public GeometrySerializer(Class targetType) { + super(targetType); + } + + @Override + public void serialize( + T geometry, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) + throws IOException { + if (Objects.nonNull(geometry)) { + // default: 8자리 강제로 반올림시킴. 16자리로 늘려줌 + GeoJsonWriter writer = new GeoJsonWriter(16); + String json = writer.write(geometry); + jsonGenerator.writeRawValue(json); + } else { + jsonGenerator.writeNull(); + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/CsvFileProcessor.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/CsvFileProcessor.java new file mode 100644 index 0000000..fc440c5 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/CsvFileProcessor.java @@ -0,0 +1,33 @@ +package com.kamco.cd.kamcoback.common.utils.zip; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class CsvFileProcessor implements ZipEntryProcessor { + + @Override + public boolean supports(String fileName) { + return fileName.toLowerCase().endsWith(".csv"); + } + + @Override + public void process(String fileName, InputStream is) throws IOException { + try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) { + br.lines() + .forEach( + line -> { + String[] cols = line.split(","); + // CSV 처리 + for (String col : cols) { + log.info(col); // TODO : 추후에 csv 파일 읽어서 작업 필요할 때 정의하기 + } + }); + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/JsonStreamingFileProcessor.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/JsonStreamingFileProcessor.java new file mode 100644 index 0000000..40d2e42 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/JsonStreamingFileProcessor.java @@ -0,0 +1,73 @@ +package com.kamco.cd.kamcoback.common.utils.zip; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.io.InputStream; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class JsonStreamingFileProcessor implements ZipEntryProcessor { + + private final JsonFactory jsonFactory; + + public JsonStreamingFileProcessor(ObjectMapper objectMapper) { + // ZipInputStream 보호용 설정 + objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false); + this.jsonFactory = objectMapper.getFactory(); + } + + @Override + public boolean supports(String fileName) { + return fileName.toLowerCase().endsWith(".json"); + } + + @Override + public void process(String fileName, InputStream is) throws IOException { + + log.info("JSON process start: {}", fileName); + + JsonParser parser = jsonFactory.createParser(is); + + // JSON 구조에 상관없이 token 단위로 순회 + while (parser.nextToken() != null) { + handleToken(parser); + } + + log.info("JSON process end: {}", fileName); + } + + private void handleToken(JsonParser parser) throws IOException { + JsonToken token = parser.currentToken(); + + if (token == JsonToken.FIELD_NAME) { + String fieldName = parser.getCurrentName(); + // TODO: json 파일 읽어야 할 내용 정의되면 항목 확정하기 + switch (fieldName) { + case "type" -> { + parser.nextToken(); + String type = parser.getValueAsString(); + log.info("type: {}", type); + } + case "name" -> { + parser.nextToken(); + String name = parser.getValueAsString(); + log.info("Name: {}", name); + } + case "features" -> { + parser.nextToken(); + String features = parser.readValueAsTree().toString(); + log.info("features: {}", features); + } + default -> { + parser.nextToken(); + parser.skipChildren(); + } + } + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/TextFileProcessor.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/TextFileProcessor.java new file mode 100644 index 0000000..1f5d0b5 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/TextFileProcessor.java @@ -0,0 +1,27 @@ +package com.kamco.cd.kamcoback.common.utils.zip; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class TextFileProcessor implements ZipEntryProcessor { + + @Override + public boolean supports(String fileName) { + return fileName.toLowerCase().endsWith(".txt"); + } + + @Override + public void process(String fileName, InputStream is) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String line; + while ((line = br.readLine()) != null) { + log.info(line); // TODO : 추후 txt 파일 읽어서 작업할 때 정의하기 + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/ZipEntryProcessor.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/ZipEntryProcessor.java new file mode 100644 index 0000000..985b6a8 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/ZipEntryProcessor.java @@ -0,0 +1,11 @@ +package com.kamco.cd.kamcoback.common.utils.zip; + +import java.io.IOException; +import java.io.InputStream; + +public interface ZipEntryProcessor { + + boolean supports(String fileName); + + void process(String fileName, InputStream is) throws IOException; +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/ZipUtils.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/ZipUtils.java new file mode 100644 index 0000000..c0e7f5e --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/common/utils/zip/ZipUtils.java @@ -0,0 +1,49 @@ +package com.kamco.cd.kamcoback.common.utils.zip; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class ZipUtils { + + private final List processors; + + public ZipUtils(List processors) { + this.processors = processors; + } + + public void processZip(InputStream zipStream) throws IOException { + try (ZipInputStream zis = new ZipInputStream(zipStream)) { + + ZipEntry entry; + while ((entry = zis.getNextEntry()) != null) { + + if (entry.isDirectory()) { + continue; + } + + String fileName = entry.getName(); + processors.stream() + .filter(p -> p.supports(fileName)) + .findFirst() + .ifPresent( + processor -> { + try { + processor.process(fileName, zis); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + }); + + zis.closeEntry(); + } + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/OpenApiConfig.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/OpenApiConfig.java new file mode 100644 index 0000000..f8b1653 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/OpenApiConfig.java @@ -0,0 +1,77 @@ +package com.kamco.cd.kamcoback.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class OpenApiConfig { + + @Value("${server.port}") + private String serverPort; + + @Value("${spring.profiles.active:local}") + private String profile; + + @Value("${swagger.dev-url:https://kamco.dev-api.gs.dabeeo.com}") + private String devUrl; + + @Value("${swagger.prod-url:https://api.kamco.com}") + private String prodUrl; + + @Bean + public OpenAPI kamcoOpenAPI() { + // 1) SecurityScheme 정의 (Bearer JWT) + SecurityScheme bearerAuth = + new SecurityScheme() + .type(SecurityScheme.Type.HTTP) + .scheme("bearer") + .bearerFormat("JWT") + .in(SecurityScheme.In.HEADER) + .name("Authorization"); + + // 2) SecurityRequirement (기본으로 BearerAuth 사용) + SecurityRequirement securityRequirement = new SecurityRequirement().addList("BearerAuth"); + + // 3) Components 에 SecurityScheme 등록 + Components components = new Components().addSecuritySchemes("BearerAuth", bearerAuth); + + // profile 별 server url 분기 + List servers = new ArrayList<>(); + if ("dev".equals(profile)) { + servers.add(new Server().url(devUrl).description("개발 서버")); + servers.add(new Server().url("http://localhost:" + serverPort).description("로컬 서버")); + // servers.add(new Server().url(prodUrl).description("운영 서버")); + } else if ("prod".equals(profile)) { + // servers.add(new Server().url(prodUrl).description("운영 서버")); + servers.add(new Server().url("http://localhost:" + serverPort).description("로컬 서버")); + servers.add(new Server().url(devUrl).description("개발 서버")); + } else { + servers.add(new Server().url("http://localhost:" + serverPort).description("로컬 서버")); + servers.add(new Server().url(devUrl).description("개발 서버")); + // servers.add(new Server().url(prodUrl).description("운영 서버")); + } + + return new OpenAPI() + .info( + new Info() + .title("KAMCO Change Detection API") + .description( + "KAMCO 변화 탐지 시스템 API 문서\n\n" + + "이 API는 지리공간 데이터를 활용한 변화 탐지 시스템을 제공합니다.\n" + + "GeoJSON 형식의 공간 데이터를 처리하며, PostgreSQL/PostGIS 기반으로 동작합니다.") + .version("v1.0.0")) + .servers(servers) + // 만들어둔 components를 넣어야 함 + .components(components) + .addSecurityItem(securityRequirement); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/StartupLogger.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/StartupLogger.java new file mode 100644 index 0000000..4df4c83 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/StartupLogger.java @@ -0,0 +1,96 @@ +package com.kamco.cd.kamcoback.config; + +import com.zaxxer.hikari.HikariDataSource; +import javax.sql.DataSource; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class StartupLogger { + + private final Environment environment; + private final DataSource dataSource; + + @EventListener(ApplicationReadyEvent.class) + public void logStartupInfo() { + String[] activeProfiles = environment.getActiveProfiles(); + String profileInfo = activeProfiles.length > 0 ? String.join(", ", activeProfiles) : "default"; + + // Database connection information + String dbUrl = environment.getProperty("spring.datasource.url"); + String dbUsername = environment.getProperty("spring.datasource.username"); + String dbDriver = environment.getProperty("spring.datasource.driver-class-name"); + + // HikariCP pool settings + String poolInfo = ""; + if (dataSource instanceof HikariDataSource hikariDs) { + poolInfo = + String.format( + """ + │ Pool Size : min=%d, max=%d + │ Connection Timeout: %dms + │ Idle Timeout : %dms + │ Max Lifetime : %dms""", + hikariDs.getMinimumIdle(), + hikariDs.getMaximumPoolSize(), + hikariDs.getConnectionTimeout(), + hikariDs.getIdleTimeout(), + hikariDs.getMaxLifetime()); + } + + // JPA/Hibernate settings + String showSql = environment.getProperty("spring.jpa.show-sql", "false"); + String ddlAuto = environment.getProperty("spring.jpa.hibernate.ddl-auto", "none"); + String batchSize = + environment.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size", "N/A"); + String batchFetchSize = + environment.getProperty("spring.jpa.properties.hibernate.default_batch_fetch_size", "N/A"); + + String startupMessage = + String.format( + """ + + ╔════════════════════════════════════════════════════════════════════════════════╗ + ║ 🚀 APPLICATION STARTUP INFORMATION ║ + ╠════════════════════════════════════════════════════════════════════════════════╣ + ║ PROFILE CONFIGURATION ║ + ╠────────────────────────────────────────────────────────────────────────────────╣ + │ Active Profile(s): %s + ╠════════════════════════════════════════════════════════════════════════════════╣ + ║ DATABASE CONFIGURATION ║ + ╠────────────────────────────────────────────────────────────────────────────────╣ + │ Database URL : %s + │ Username : %s + │ Driver : %s + ╠════════════════════════════════════════════════════════════════════════════════╣ + ║ HIKARICP CONNECTION POOL ║ + ╠────────────────────────────────────────────────────────────────────────────────╣ + %s + ╠════════════════════════════════════════════════════════════════════════════════╣ + ║ JPA/HIBERNATE CONFIGURATION ║ + ╠────────────────────────────────────────────────────────────────────────────────╣ + │ Show SQL : %s + │ DDL Auto : %s + │ JDBC Batch Size : %s + │ Fetch Batch Size : %s + ╚════════════════════════════════════════════════════════════════════════════════╝ + """, + profileInfo, + dbUrl != null ? dbUrl : "N/A", + dbUsername != null ? dbUsername : "N/A", + dbDriver != null ? dbDriver : "PostgreSQL JDBC Driver (auto-detected)", + poolInfo, + showSql, + ddlAuto, + batchSize, + batchFetchSize); + + log.info(startupMessage); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/WebConfig.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/WebConfig.java new file mode 100644 index 0000000..0af7fa2 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/WebConfig.java @@ -0,0 +1,32 @@ +package com.kamco.cd.kamcoback.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.kamco.cd.kamcoback.common.utils.geometry.GeometryDeserializer; +import com.kamco.cd.kamcoback.common.utils.geometry.GeometrySerializer; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.Polygon; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Bean + public ObjectMapper objectMapper() { + SimpleModule module = new SimpleModule(); + module.addSerializer(Geometry.class, new GeometrySerializer<>(Geometry.class)); + module.addDeserializer(Geometry.class, new GeometryDeserializer<>(Geometry.class)); + + module.addSerializer(Polygon.class, new GeometrySerializer<>(Polygon.class)); + module.addDeserializer(Polygon.class, new GeometryDeserializer<>(Polygon.class)); + + module.addSerializer(Point.class, new GeometrySerializer<>(Point.class)); + module.addDeserializer(Point.class, new GeometryDeserializer<>(Point.class)); + + return Jackson2ObjectMapperBuilder.json().modulesToInstall(module).build(); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/ApiResponseDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseDto.java similarity index 98% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/ApiResponseDto.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseDto.java index 56313e3..c32c958 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/ApiResponseDto.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseDto.java @@ -1,8 +1,8 @@ -package com.kamco.cd.kamcoback.dto; +package com.kamco.cd.kamcoback.config.api; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import com.kamco.cd.kamcoback.inferface.EnumType; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient.java new file mode 100644 index 0000000..e4e656d --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient.java @@ -0,0 +1,120 @@ +package com.kamco.cd.kamcoback.config.resttemplate; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.nio.charset.StandardCharsets; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestTemplate; + +@RequiredArgsConstructor +@Component +@Log4j2 +public class ExternalHttpClient { + + private final RestTemplate restTemplate; + private final ObjectMapper objectMapper; + + public ExternalCallResult call( + String url, HttpMethod method, Object body, HttpHeaders headers, Class responseType) { + + // responseType 기반으로 Accept 동적 세팅 + HttpHeaders resolvedHeaders = resolveHeaders(headers, responseType); + logRequestBody(body); + + HttpEntity entity = new HttpEntity<>(body, resolvedHeaders); + + try { + // String: raw bytes -> UTF-8 string + if (responseType == String.class) { + ResponseEntity res = restTemplate.exchange(url, method, entity, byte[].class); + String raw = + (res.getBody() == null) ? null : new String(res.getBody(), StandardCharsets.UTF_8); + + @SuppressWarnings("unchecked") + T casted = (T) raw; + return new ExternalCallResult<>(res.getStatusCodeValue(), true, casted, null); + } + + // byte[]: raw bytes로 받고, JSON이면 에러로 처리 + if (responseType == byte[].class) { + ResponseEntity res = restTemplate.exchange(url, method, entity, byte[].class); + + MediaType ct = res.getHeaders().getContentType(); + byte[] bytes = res.getBody(); + + if (isJsonLike(ct)) { + String err = (bytes == null) ? null : new String(bytes, StandardCharsets.UTF_8); + return new ExternalCallResult<>(res.getStatusCodeValue(), false, null, err); + } + + @SuppressWarnings("unchecked") + T casted = (T) bytes; + return new ExternalCallResult<>(res.getStatusCodeValue(), true, casted, null); + } + + // DTO 등: 일반 역직렬화 + ResponseEntity res = restTemplate.exchange(url, method, entity, responseType); + return new ExternalCallResult<>(res.getStatusCodeValue(), true, res.getBody(), null); + + } catch (HttpStatusCodeException e) { + return new ExternalCallResult<>( + e.getStatusCode().value(), false, null, e.getResponseBodyAsString()); + } + } + + // 기존 resolveJsonHeaders를 "동적"으로 교체 + private HttpHeaders resolveHeaders(HttpHeaders headers, Class responseType) { + // 원본 headers를 그대로 쓰면 외부에서 재사용할 때 사이드이펙트 날 수 있어서 복사 권장 + HttpHeaders h = (headers == null) ? new HttpHeaders() : new HttpHeaders(headers); + + // 요청 바디 기본은 JSON이라고 가정 (필요하면 호출부에서 덮어쓰기) + if (h.getContentType() == null) { + h.setContentType(MediaType.APPLICATION_JSON); + } + + // 호출부에서 Accept를 명시했으면 존중 + if (h.getAccept() != null && !h.getAccept().isEmpty()) { + return h; + } + + // responseType 기반 Accept 자동 지정 + if (responseType == byte[].class) { + h.setAccept( + List.of( + MediaType.APPLICATION_OCTET_STREAM, + MediaType.valueOf("application/zip"), + MediaType.APPLICATION_JSON // 실패(JSON 에러 바디) 대비 + )); + } else { + h.setAccept(List.of(MediaType.APPLICATION_JSON)); + } + + return h; + } + + private boolean isJsonLike(MediaType ct) { + if (ct == null) return false; + return ct.includes(MediaType.APPLICATION_JSON) + || "application/problem+json".equalsIgnoreCase(ct.toString()); + } + + private void logRequestBody(Object body) { + try { + if (body != null) { + log.info("[HTTP-REQ-BODY-JSON] {}", objectMapper.writeValueAsString(body)); + } + } catch (Exception e) { + log.warn("[HTTP-REQ-BODY-JSON] serialize failed: {}", e.getMessage()); + } + } + + public record ExternalCallResult(int statusCode, boolean success, T body, String errBody) {} +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/RestTemplateConfig.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/RestTemplateConfig.java new file mode 100644 index 0000000..7a4ba07 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/RestTemplateConfig.java @@ -0,0 +1,33 @@ +package com.kamco.cd.kamcoback.config.resttemplate; + +import lombok.extern.log4j.Log4j2; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.BufferingClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +@Log4j2 +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate(RestTemplateBuilder builder) { + SimpleClientHttpRequestFactory baseFactory = new SimpleClientHttpRequestFactory(); + baseFactory.setConnectTimeout(2000); + baseFactory.setReadTimeout(3000); + + RestTemplate rt = + builder + .requestFactory(() -> new BufferingClientHttpRequestFactory(baseFactory)) + .additionalInterceptors(new RetryInterceptor()) + .build(); + + // byte[] 응답은 무조건 raw로 읽게 강제 (Jackson이 끼어들 여지 제거) + rt.getMessageConverters() + .add(0, new org.springframework.http.converter.ByteArrayHttpMessageConverter()); + + return rt; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/RetryInterceptor.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/RetryInterceptor.java new file mode 100644 index 0000000..ab80e9b --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/RetryInterceptor.java @@ -0,0 +1,56 @@ +package com.kamco.cd.kamcoback.config.resttemplate; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.TimeUnit; +import lombok.extern.log4j.Log4j2; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +@Log4j2 +public class RetryInterceptor implements ClientHttpRequestInterceptor { + + private static final int MAX_RETRY = 3; + private static final long WAIT_MILLIS = 3000; + + @Override + public ClientHttpResponse intercept( + HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { + + IOException lastException = null; + + for (int attempt = 1; attempt <= MAX_RETRY; attempt++) { + try { + log.info("[WIRE-REQ] {} {}", request.getMethod(), request.getURI()); + log.info("[WIRE-REQ-HEADERS] {}", request.getHeaders()); + log.info("[WIRE-REQ-BODY] {}", new String(body, StandardCharsets.UTF_8)); + + ClientHttpResponse response = execution.execute(request, body); + + log.info("[WIRE-RES-STATUS] {}", response.getStatusCode()); + return response; + + } catch (IOException e) { + lastException = e; + log.error("[WIRE-IO-ERR] attempt={} msg={}", attempt, e.getMessage(), e); + } + + if (attempt < MAX_RETRY) { + sleep(); + } + } + + throw lastException; + } + + private void sleep() throws IOException { + try { + TimeUnit.MILLISECONDS.sleep(WAIT_MILLIS); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + throw new IOException("Retry interrupted", ie); + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerConfig.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerConfig.java new file mode 100644 index 0000000..5794025 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerConfig.java @@ -0,0 +1,13 @@ +package com.kamco.cd.kamcoback.config.swagger; + +import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; +import io.swagger.v3.oas.annotations.security.SecurityScheme; +import org.springframework.context.annotation.Configuration; + +@Configuration +@SecurityScheme( + name = "BearerAuth", + type = SecuritySchemeType.HTTP, + scheme = "bearer", + bearerFormat = "JWT") +public class SwaggerConfig {} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerUiAutoAuthConfig.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerUiAutoAuthConfig.java new file mode 100644 index 0000000..f157506 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerUiAutoAuthConfig.java @@ -0,0 +1,97 @@ +package com.kamco.cd.kamcoback.config.swagger; + +import jakarta.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import org.springdoc.core.properties.SwaggerUiConfigProperties; +import org.springdoc.core.properties.SwaggerUiOAuthProperties; +import org.springdoc.core.providers.ObjectMapperProvider; +import org.springdoc.webmvc.ui.SwaggerIndexPageTransformer; +import org.springdoc.webmvc.ui.SwaggerIndexTransformer; +import org.springdoc.webmvc.ui.SwaggerWelcomeCommon; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; +import org.springframework.core.io.Resource; +import org.springframework.web.servlet.resource.ResourceTransformerChain; +import org.springframework.web.servlet.resource.TransformedResource; + +@Profile({"local", "dev"}) +@Configuration +public class SwaggerUiAutoAuthConfig { + + @Bean + @Primary + public SwaggerIndexTransformer swaggerIndexTransformer( + SwaggerUiConfigProperties swaggerUiConfigProperties, + SwaggerUiOAuthProperties swaggerUiOAuthProperties, + SwaggerWelcomeCommon swaggerWelcomeCommon, + ObjectMapperProvider objectMapperProvider) { + + SwaggerIndexPageTransformer delegate = + new SwaggerIndexPageTransformer( + swaggerUiConfigProperties, + swaggerUiOAuthProperties, + swaggerWelcomeCommon, + objectMapperProvider); + + return new SwaggerIndexTransformer() { + private static final String TOKEN_KEY = "SWAGGER_ACCESS_TOKEN"; + + @Override + public Resource transform( + HttpServletRequest request, Resource resource, ResourceTransformerChain chain) { + try { + // 1) springdoc 기본 변환 먼저 적용 + Resource transformed = delegate.transform(request, resource, chain); + + String html = + new String(transformed.getInputStream().readAllBytes(), StandardCharsets.UTF_8); + + String loginPathContains = "/api/auth/signin"; + + String inject = + """ + tagsSorter: (a, b) => { + const TOP = '인증(Auth)'; + if (a === TOP && b !== TOP) return -1; + if (b === TOP && a !== TOP) return 1; + return a.localeCompare(b); + }, + requestInterceptor: (req) => { + const token = localStorage.getItem('%s'); + if (token) { + req.headers = req.headers || {}; + req.headers['Authorization'] = 'Bearer ' + token; + } + return req; + }, + responseInterceptor: async (res) => { + try { + const isLogin = (res?.url?.includes('%s') && res?.status === 200); + if (isLogin) { + const text = (typeof res.data === 'string') ? res.data : JSON.stringify(res.data); + const json = JSON.parse(text); + const token = json?.data?.accessToken; + + if (token) { + localStorage.setItem('%s', token); + } + } + } catch (e) {} + return res; + }, + """ + .formatted(TOKEN_KEY, loginPathContains, TOKEN_KEY); + + html = html.replace("SwaggerUIBundle({", "SwaggerUIBundle({\n" + inject); + + return new TransformedResource(transformed, html.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + // 실패 시 원본 반환(문서 깨짐 방지) + return resource; + } + } + }; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/CodeDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/CodeDto.java deleted file mode 100644 index ae4bc00..0000000 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/CodeDto.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.kamco.cd.kamcoback.enums; - -public class CodeDto { - - private String code; - private String name; - - public CodeDto(String code, String name) { - this.code = code; - this.name = name; - } - - public String getCode() { - return code; - } - - public String getName() { - return name; - } -} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/Enums.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/Enums.java deleted file mode 100644 index c87856e..0000000 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/enums/Enums.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.kamco.cd.kamcoback.enums; - -import com.kamco.cd.kamcoback.inferface.CodeExpose; -import com.kamco.cd.kamcoback.inferface.CodeHidden; -import com.kamco.cd.kamcoback.inferface.EnumType; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.reflections.Reflections; - -public class Enums { - - private static final String BASE_PACKAGE = "com.kamco.cd.kamcoback"; - - /** 노출 가능한 enum만 모아둔 맵 key: enum simpleName (예: RoleType) value: enum Class */ - private static final Map>> exposedEnumMap = scanExposedEnumMap(); - - // code로 enum 찾기 - public static & EnumType> E fromId(Class enumClass, String id) { - if (id == null) { - return null; - } - - for (E e : enumClass.getEnumConstants()) { - if (id.equalsIgnoreCase(e.getId())) { - return e; - } - } - return null; - } - - // enum -> CodeDto list - public static List toList(Class> enumClass) { - Object[] enums = enumClass.getEnumConstants(); - - return Arrays.stream(enums) - .map(e -> (EnumType) e) - .filter(e -> !isHidden(enumClass, (Enum) e)) - .map(e -> new CodeDto(e.getId(), e.getText())) - .toList(); - } - - private static boolean isHidden(Class> enumClass, Enum e) { - try { - return enumClass.getField(e.name()).isAnnotationPresent(CodeHidden.class); - } catch (NoSuchFieldException ex) { - return false; - } - } - - /** 특정 타입(enum)만 조회 /codes/{type} -> type = RoleType 같은 값 */ - public static List getCodes(String type) { - Class> enumClass = exposedEnumMap.get(type); - if (enumClass == null) { - throw new IllegalArgumentException("지원하지 않는 코드 타입: " + type); - } - return toList(enumClass); - } - - /** 전체 enum 코드 조회 */ - public static Map> getAllCodes() { - Map> result = new HashMap<>(); - for (Map.Entry>> e : exposedEnumMap.entrySet()) { - result.put(e.getKey(), toList(e.getValue())); - } - return result; - } - - /** CodeExpose + EnumType 인 enum만 스캔해서 Map 구성 */ - private static Map>> scanExposedEnumMap() { - Reflections reflections = new Reflections(BASE_PACKAGE); - - Set> types = reflections.getTypesAnnotatedWith(CodeExpose.class); - - Map>> result = new HashMap<>(); - - for (Class clazz : types) { - if (clazz.isEnum() && EnumType.class.isAssignableFrom(clazz)) { - result.put(clazz.getSimpleName(), (Class>) clazz); - } - } - return result; - } -} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java index 4cfe330..27705cc 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java @@ -6,7 +6,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.kamco.cd.kamcoback.common.utils.enums.ImageryFitStatus; +import com.kamco.cd.kamcoback.common.enums.DetectionClassification; +import com.kamco.cd.kamcoback.common.enums.ImageryFitStatus; import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.DetectOption; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetScope; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceProgressDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceProgressDto.java new file mode 100644 index 0000000..ffbc770 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceProgressDto.java @@ -0,0 +1,58 @@ +package com.kamco.cd.kamcoback.inference.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class InferenceProgressDto { + + private pred_requests_areas pred_requests_areas; + private String modelVersion; + private String cdModelPath; + private String cdModelFileName; + private String cdModelConfigPath; + private String cdModelConfigFileName; + private String cdModelClsPath; + private String cdModelClsFileName; + private String clsModelVersion; + private Double priority; + + public InferenceProgressDto( + pred_requests_areas pred_requests_areas, + String modelVersion, + String cdModelPath, + String cdModelFileName, + String cdModelConfigPath, + String cdModelConfigFileName, + String cdModelClsPath, + String cdModelClsFileName, + String clsModelVersion, + Double priority) { + this.pred_requests_areas = pred_requests_areas; + this.modelVersion = modelVersion; + this.cdModelPath = cdModelPath; + this.cdModelFileName = cdModelFileName; + this.cdModelConfigPath = cdModelConfigPath; + this.cdModelConfigFileName = cdModelConfigFileName; + this.cdModelClsPath = cdModelClsPath; + this.cdModelClsFileName = cdModelClsFileName; + this.clsModelVersion = clsModelVersion; + this.priority = priority; + } + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class pred_requests_areas { + + private Integer input1_year; + private Integer input2_year; + private String input1_scene_path; + private String input2_scene_path; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java index 2ee0526..452a106 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java @@ -246,15 +246,15 @@ public class InferenceResultDto { @NotBlank private String title; - @Schema(description = "M1", example = "b40e0f68-c1d8-49fc-93f9-a36270093861") + @Schema(description = "G1", example = "b40e0f68-c1d8-49fc-93f9-a36270093861") @NotNull private UUID model1Uuid; - @Schema(description = "M2", example = "ec92b7d2-b5a3-4915-9bdf-35fb3ca8ad27") + @Schema(description = "G2", example = "ec92b7d2-b5a3-4915-9bdf-35fb3ca8ad27") @NotNull private UUID model2Uuid; - @Schema(description = "M3", example = "37f45782-8ccf-4cf6-911c-a055a1510d39") + @Schema(description = "G3", example = "37f45782-8ccf-4cf6-911c-a055a1510d39") @NotNull private UUID model3Uuid; @@ -297,6 +297,30 @@ public class InferenceResultDto { @Schema(name = "InferenceStatusDetailDto", description = "추론(변화탐지) 진행상태") public static class InferenceStatusDetailDto { + @Schema(description = "모델1 사용시간 시작일시") + @JsonFormatDttm + ZonedDateTime m1ModelStartDttm; + + @Schema(description = "모델2 사용시간 시작일시") + @JsonFormatDttm + ZonedDateTime m2ModelStartDttm; + + @Schema(description = "모델3 사용시간 시작일시") + @JsonFormatDttm + ZonedDateTime m3ModelStartDttm; + + @Schema(description = "모델1 사용시간 종료일시") + @JsonFormatDttm + ZonedDateTime m1ModelEndDttm; + + @Schema(description = "모델2 사용시간 종료일시") + @JsonFormatDttm + ZonedDateTime m2ModelEndDttm; + + @Schema(description = "모델3 사용시간 종료일시") + @JsonFormatDttm + ZonedDateTime m3ModelEndDttm; + @Schema(description = "탐지대상 도엽수") private Long detectingCnt; @@ -336,30 +360,6 @@ public class InferenceResultDto { @Schema(description = "모델3 분석 실패") private Integer m3FailedJobs; - @Schema(description = "모델1 사용시간 시작일시") - @JsonFormatDttm - ZonedDateTime m1ModelStartDttm; - - @Schema(description = "모델2 사용시간 시작일시") - @JsonFormatDttm - ZonedDateTime m2ModelStartDttm; - - @Schema(description = "모델3 사용시간 시작일시") - @JsonFormatDttm - ZonedDateTime m3ModelStartDttm; - - @Schema(description = "모델1 사용시간 종료일시") - @JsonFormatDttm - ZonedDateTime m1ModelEndDttm; - - @Schema(description = "모델2 사용시간 종료일시") - @JsonFormatDttm - ZonedDateTime m2ModelEndDttm; - - @Schema(description = "모델3 사용시간 종료일시") - @JsonFormatDttm - ZonedDateTime m3ModelEndDttm; - @Schema(description = "변화탐지 제목") private String title; @@ -496,19 +496,19 @@ public class InferenceResultDto { return MapSheetScope.getDescByCode(this.mapSheetScope); } - @Schema(description = "M1 사용시간") + @Schema(description = "G1 사용시간") @JsonProperty("m1ElapsedTim") public String getM1ElapsedTime() { return formatElapsedTime(this.m1ModelStartDttm, this.m1ModelEndDttm); } - @Schema(description = "M2 사용시간") + @Schema(description = "G2 사용시간") @JsonProperty("m2ElapsedTim") public String getM2ElapsedTime() { return formatElapsedTime(this.m2ModelStartDttm, this.m2ModelEndDttm); } - @Schema(description = "M3 사용시간") + @Schema(description = "G3 사용시간") @JsonProperty("m3ElapsedTim") public String getM3ElapsedTime() { return formatElapsedTime(this.m3ModelStartDttm, this.m3ModelEndDttm); diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultShpDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultShpDto.java new file mode 100644 index 0000000..20e0ac0 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultShpDto.java @@ -0,0 +1,113 @@ +package com.kamco.cd.kamcoback.inference.dto; + +import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataInferenceGeomEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.locationtech.jts.geom.Geometry; + +public class InferenceResultShpDto { + + @Getter + @Setter + public static class Basic { + + // ===== 식별 ===== + private Long geoUid; + private UUID uuid; + + // ===== 그룹 키 ===== + private Integer stage; + private Long mapId; + private Integer input1; // compare_yyyy + private Integer input2; // target_yyyy + + // ===== 추론 결과 ===== + private Double cdProb; + + private String beforeClass; + private Double beforeProbability; + + private String afterClass; + private Double afterProbability; + + // ===== 공간 정보 ===== + private Geometry geometry; + private Double area; + + /** Entity → DTO 변환 */ + public static Basic from(MapSheetAnalDataInferenceGeomEntity e) { + Basic d = new Basic(); + + d.geoUid = e.getGeoUid(); + d.uuid = e.getUuid(); + + d.stage = e.getStage(); + d.mapId = e.getMapSheetNum(); + d.input1 = e.getCompareYyyy(); + d.input2 = e.getTargetYyyy(); + + d.cdProb = e.getCdProb(); + + d.beforeClass = e.getClassBeforeCd(); + d.beforeProbability = e.getClassBeforeProb(); + + d.afterClass = e.getClassAfterCd(); + d.afterProbability = e.getClassAfterProb(); + + d.geometry = e.getGeom(); + d.area = e.getArea(); + + return d; + } + } + + @Setter + @Getter + @AllArgsConstructor + @NoArgsConstructor + public static class InferenceCntDto { + + @Schema(description = "추론 결과(inference_results)를 기준으로 신규 목록 저장 터이터 건수", example = "120") + int sheetAnalDataCnt; + + @Schema(description = "추론 결과(inference_results)를 기준으로 신규 저장 데이터 건수", example = "120") + int inferenceCnt; + + @Schema(description = "추론 결과(inference_results)를 기준으로 신규 저장 Geom 데이터 건수", example = "120") + int inferenceGeomCnt; + } + + @Setter + @Getter + @AllArgsConstructor + @NoArgsConstructor + public static class FileCntDto { + + @Schema(description = "shp 파일 생성 수 (덮어쓰기 포함)", example = "120") + private int shp; + + @Schema(description = "shx 파일 생성 수 (덮어쓰기 포함)", example = "120") + private int shx; + + @Schema(description = "dbf 파일 생성 수 (덮어쓰기 포함)", example = "120") + private int dbf; + + @Schema(description = "prj 파일 생성 수 (덮어쓰기 포함)", example = "120") + private int prj; + + @Schema(description = "geojson 파일 생성 수 (덮어쓰기 포함)", example = "120") + private int geojson; + } + + @Getter + public static class CreateShpRequest { + + private Long m1BatchId; + private Long m2BatchId; + private Long m3BatchId; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultsTestingDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultsTestingDto.java new file mode 100644 index 0000000..db24097 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultsTestingDto.java @@ -0,0 +1,25 @@ +package com.kamco.cd.kamcoback.inference.dto; + +import com.kamco.cd.kamcoback.postgres.entity.InferenceResultsTestingEntity; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +public class InferenceResultsTestingDto { + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class ShpDto { + + private Long batchId; + private String uid; + private String mapId; + + public static ShpDto fromEntity(InferenceResultsTestingEntity e) { + return new ShpDto(e.getBatchId(), e.getUid(), e.getMapId()); + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceSendDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceSendDto.java new file mode 100644 index 0000000..5f7ca4f --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceSendDto.java @@ -0,0 +1,38 @@ +package com.kamco.cd.kamcoback.inference.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** AI API 추론 실행 DTO */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class InferenceSendDto { + + private pred_requests_areas pred_requests_areas; + private String model_version; + private String cd_model_path; + private String cd_model_config; + private String cls_model_path; + private String cls_model_version; + private String cd_model_type; + private Double priority; + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + @ToString + public static class pred_requests_areas { + + private Integer input1_year; + private Integer input2_year; + private String input1_scene_path; + private String input2_scene_path; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/LearningModelResultDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/LearningModelResultDto.java new file mode 100644 index 0000000..ba31942 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/LearningModelResultDto.java @@ -0,0 +1,180 @@ +package com.kamco.cd.kamcoback.inference.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** DTO classes for learning model result processing */ +public class LearningModelResultDto { + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Schema(description = "학습모델 결과 처리 요청") + public static class ProcessRequest { + + @Schema( + description = "GeoJSON 파일 경로", + example = + "src/main/resources/db/migration/sample-results_updated/캠코_2021_2022_35813023.geojson") + private String filePath; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Schema(description = "학습모델 결과 처리 응답") + public static class ProcessResponse { + + @Schema(description = "처리 성공 여부") + private boolean success; + + @Schema(description = "처리 결과 메시지") + private String message; + + @Schema(description = "처리된 feature 개수") + private int processedFeatures; + + @Schema(description = "처리된 파일 경로") + private String filePath; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Schema(description = "학습모델 결과 일괄 처리 요청") + public static class BatchProcessRequest { + + @Schema(description = "GeoJSON 파일 경로 목록") + private List filePaths; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Schema(description = "학습모델 결과 일괄 처리 응답") + public static class BatchProcessResponse { + + @Schema(description = "처리 성공 여부") + private boolean success; + + @Schema(description = "처리 결과 메시지") + private String message; + + @Schema(description = "전체 처리된 feature 개수") + private int totalProcessedFeatures; + + @Schema(description = "처리된 파일 개수") + private int processedFileCount; + + @Schema(description = "처리된 파일 경로 목록") + private List filePaths; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Schema(description = "학습모델 처리 상태") + public static class ProcessingStatus { + + @Schema(description = "처리 ID") + private String processingId; + + @Schema(description = "처리 상태 (PENDING, PROCESSING, COMPLETED, FAILED)") + private String status; + + @Schema(description = "진행률 (0-100)") + private int progressPercentage; + + @Schema(description = "현재 처리 중인 파일") + private String currentFile; + + @Schema(description = "전체 파일 개수") + private int totalFiles; + + @Schema(description = "처리 완료된 파일 개수") + private int completedFiles; + + @Schema(description = "시작 시간") + private String startTime; + + @Schema(description = "예상 완료 시간") + private String estimatedEndTime; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Schema(description = "학습모델 데이터 요약") + public static class DataSummary { + + @Schema(description = "전체 데이터 개수") + private long totalRecords; + + @Schema(description = "연도별 데이터 개수") + private List yearDataCounts; + + @Schema(description = "분류별 데이터 개수") + private List classDataCounts; + + @Schema(description = "지도 영역별 데이터 개수") + private List mapSheetDataCounts; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Schema(description = "연도별 데이터 개수") + public static class YearDataCount { + + @Schema(description = "비교 연도 (예: 2021_2022)") + private String compareYear; + + @Schema(description = "데이터 개수") + private long count; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Schema(description = "분류별 데이터 개수") + public static class ClassDataCount { + + @Schema(description = "분류명") + private String className; + + @Schema(description = "변화 전 개수") + private long beforeCount; + + @Schema(description = "변화 후 개수") + private long afterCount; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Schema(description = "지도 영역별 데이터 개수") + public static class MapSheetDataCount { + + @Schema(description = "지도 영역 번호") + private String mapSheetNum; + + @Schema(description = "데이터 개수") + private long count; + + @Schema(description = "평균 변화 탐지 확률") + private double avgChangeDetectionProb; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/WriteCnt.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/WriteCnt.java new file mode 100644 index 0000000..86fc652 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inference/dto/WriteCnt.java @@ -0,0 +1,17 @@ +package com.kamco.cd.kamcoback.inference.dto; + +public record WriteCnt(int shp, int shx, int dbf, int prj, int geojson) { + + public static WriteCnt zero() { + return new WriteCnt(0, 0, 0, 0, 0); + } + + public WriteCnt plus(WriteCnt o) { + return new WriteCnt( + this.shp + o.shp, + this.shx + o.shx, + this.dbf + o.dbf, + this.prj + o.prj, + this.geojson + o.geojson); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/CodeExpose.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/CodeExpose.java deleted file mode 100644 index aa50c0e..0000000 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/CodeExpose.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.kamco.cd.kamcoback.inferface; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface CodeExpose {} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/CodeHidden.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/CodeHidden.java deleted file mode 100644 index 7516dfe..0000000 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/CodeHidden.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.kamco.cd.kamcoback.inferface; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -public @interface CodeHidden {} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/EnumType.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/EnumType.java deleted file mode 100644 index 2fa5f21..0000000 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/EnumType.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.kamco.cd.kamcoback.inferface; - -public interface EnumType { - - String getId(); - - String getText(); -} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.java deleted file mode 100644 index aabb352..0000000 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.kamco.cd.kamcoback.inferface; - -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; -import com.fasterxml.jackson.annotation.JsonFormat; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({ElementType.FIELD, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@JacksonAnnotationsInside -@JsonFormat( - shape = JsonFormat.Shape.STRING, - pattern = "yyyy-MM-dd'T'HH:mm:ssXXX", - timezone = "Asia/Seoul") -public @interface JsonFormatDttm {} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/LabelAllocateDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto.java similarity index 90% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/LabelAllocateDto.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto.java index 1112194..7bda7d9 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/LabelAllocateDto.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto.java @@ -1,8 +1,9 @@ -package com.kamco.cd.kamcoback.dto; +package com.kamco.cd.kamcoback.label.dto; import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; import com.kamco.cd.kamcoback.common.utils.enums.EnumType; import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDate; import java.time.ZonedDateTime; import java.util.List; import java.util.UUID; @@ -359,4 +360,41 @@ public class LabelAllocateDto { @Schema(description = "작업기간 종료일") private ZonedDateTime projectCloseDttm; } + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class InferenceLearnDto { + + private UUID analUuid; + private String learnUid; + private String analState; + private Long analId; + } + + @Getter + @Setter + @AllArgsConstructor + public static class AllocateAddStbltDto { + + @Schema(description = "총 잔여 건수", example = "179") + private Integer totalCnt; + + @Schema( + description = "추가할당할 라벨러", + example = + """ + [ + "123454", "654321", "222233", "777222" + ] + """) + private List labelers; + + @Schema(description = "회차 마스터 key", example = "c0e77cc7-8c28-46ba-9ca4-11e90246ab44") + private UUID uuid; + + @Schema(description = "기준일자", example = "2026-02-20") + private LocalDate baseDate; + } } diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/LabelInspectorDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelInspectorDto.java similarity index 90% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/LabelInspectorDto.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelInspectorDto.java index 171748b..89fd8ef 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/LabelInspectorDto.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelInspectorDto.java @@ -1,4 +1,4 @@ -package com.kamco.cd.kamcoback.dto; +package com.kamco.cd.kamcoback.label.dto; import java.time.ZonedDateTime; import java.util.UUID; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/LabelLabelerDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelLabelerDto.java similarity index 93% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/LabelLabelerDto.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelLabelerDto.java index 16ab3be..80360db 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/LabelLabelerDto.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelLabelerDto.java @@ -1,4 +1,4 @@ -package com.kamco.cd.kamcoback.dto; +package com.kamco.cd.kamcoback.label.dto; import java.time.ZonedDateTime; import java.util.UUID; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java new file mode 100644 index 0000000..b9af35e --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java @@ -0,0 +1,263 @@ +package com.kamco.cd.kamcoback.label.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kamco.cd.kamcoback.common.utils.enums.Enums; +import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; +import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.LabelMngState; +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +public class LabelWorkDto { + + @Getter + @Setter + @AllArgsConstructor + public static class ChangeDetectYear { + + private String code; + private String name; + } + + @Schema(name = "LabelWorkMng", description = "라벨작업관리") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class LabelWorkMng { + + private UUID uuid; + private Integer compareYyyy; + private Integer targetYyyy; + private Integer stage; + @JsonFormatDttm private ZonedDateTime gukyuinApplyDttm; + private Long detectionTotCnt; + private Long labelTotCnt; + private Long labelAssignCnt; + private Long labelSkipTotCnt; + private Long labelCompleteTotCnt; + @JsonFormatDttm private ZonedDateTime labelStartDttm; + + // tb_map_sheet_anal_inference.anal_state 컬럼 값 + private String analState; + + // tb_labeling_assignment 테이블에서 stagnation_yn = 'N'인 정상 진행 건수 + private Long normalProgressCnt; + + // tb_labeling_assignment 테이블에서 총 배정 건수 + private Long totalAssignmentCnt; + + private String labelingClosedYn; + private String inspectionClosedYn; + + private Long inspectorCompleteTotCnt; + private Long inspectorRemainCnt; + private ZonedDateTime projectCloseDttm; + + private String resultUid; + private String subUid; + private UUID learnUuid; + + @JsonProperty("detectYear") + public String getDetectYear() { + if (compareYyyy == null || targetYyyy == null) { + return null; + } + return compareYyyy + "-" + targetYyyy; + } + + /** 라벨링 상태 반환 (tb_map_sheet_anal_inference.anal_state 기준) */ + public String getLabelState() { + // anal_state 값이 있으면 해당 값 사용 -> 우선은 미사용 + if (this.analState != null && !this.analState.isEmpty()) { + return this.analState; + } + + // anal_state 값이 없으면 기존 로직으로 폴백 + String mngState = LabelMngState.PENDING.getId(); + + if (this.labelTotCnt == 0) { + mngState = LabelMngState.PENDING.getId(); + } else if (this.labelTotCnt > 0 && this.labelAssignCnt > 0 && this.labelCompleteTotCnt == 0) { + mngState = LabelMngState.ASSIGNED.getId(); + } else if (this.labelingClosedYn.equals("Y") && this.inspectionClosedYn.equals("Y")) { + mngState = LabelMngState.FINISH.getId(); + } else if (this.labelCompleteTotCnt > 0) { + mngState = LabelMngState.ING.getId(); + } + + return mngState; + } + + public String getLabelStateName() { + String enumId = this.getLabelState(); + if (enumId == null || enumId.isEmpty()) { + enumId = "PENDING"; + } + + LabelMngState type = Enums.fromId(LabelMngState.class, enumId); + // type이 null인 경우 (enum에 정의되지 않은 상태값) 상태값 자체를 반환 + if (type == null) { + return enumId; + } + return type.getText(); + } + + /** + * 작업 진행률 반환 (tb_labeling_assignment.stagnation_yn = 'N'인 정상 진행율 기준) 계산식: (정상 진행 건수 / 총 배정 건수) * + * 100 + */ + public double getLabelRate() { + if (this.totalAssignmentCnt == null || this.totalAssignmentCnt == 0) { + return 0.0; + } + if (this.labelCompleteTotCnt == null) { + return 0.0; + } + return Math.round(((double) this.labelCompleteTotCnt / this.totalAssignmentCnt * 100.0) * 100) + / 100.0; + } + } + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class LabelWorkMngDetail { + + private String detectionYear; + private Integer stage; + @JsonFormatDttm private ZonedDateTime createdDttm; + private Long labelTotCnt; + private Long labeler; + private Long reviewer; + } + + @Schema(name = "LabelWorkMngSearchReq", description = "라벨작업관리 검색 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class LabelWorkMngSearchReq { + + // 페이징 파라미터 + @Schema(description = "페이지 번호 (0부터 시작) ", example = "0") + private int page = 0; + + @Schema(description = "페이지 크기", example = "20") + private int size = 20; + + @Schema(description = "변화탐지년도", example = "2024") + private String detectYear; + + @Schema(description = "시작일", example = "2026-01-01") + private LocalDate strtDttm; + + @Schema(description = "종료일", example = "2026-12-01") + private LocalDate endDttm; + + public Pageable toPageable() { + + return PageRequest.of(page, size); + } + } + + @Getter + @Setter + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Schema(description = "작업자 통계 응답") + public static class WorkerState { + + @Schema(description = "작업자 유형 (LABELER/INSPECTOR)") + private String userRole; + + @Schema(description = "작업자 ID (사번)") + private String name; + + @Schema(description = "작업자 이름") + private String userId; + + @Schema(description = "배정개수") + private Long assignedCnt; + + @Schema(description = "완료개수") + private Long doneCnt; + + @Schema(description = "Skip개수") + private Long skipCnt; + + @Schema(description = "3일전처리개수") + private Long day3AgoDoneCnt; + + @Schema(description = "2일전처리개수") + private Long day2AgoDoneCnt; + + @Schema(description = "1일전처리개수") + private Long day1AgoDoneCnt; + + @Schema(description = "계정 상태") + private String memberStatus; + + public Long getRemainCnt() { + return this.assignedCnt - this.doneCnt; + } + + public double getDoneRate() { + long dayDoneCnt = this.day3AgoDoneCnt + this.day2AgoDoneCnt + this.day1AgoDoneCnt; + + if (dayDoneCnt == 0) { + return 0.0; + } + return (double) dayDoneCnt / 3; + } + + public String getUserRoleName() { + if (this.userRole.equals("LABELER")) { + return "라벨러"; + } + return "검수자"; + } + } + + @Schema(name = "WorkerStateSearchReq", description = "라벨작업관리 검색 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class WorkerStateSearchReq { + + // 페이징 파라미터 + @Schema(description = "페이지 번호 (0부터 시작) ", example = "0") + private int page = 0; + + @Schema(description = "페이지 크기", example = "20") + private int size = 20; + + @Schema(description = "유형", example = "LABELER") + private String userRole; + + @Schema(description = "종료일", example = "20261201") + private String searchVal; + + @Schema(description = "종료일", example = "20261201") + private String uuid; + + @Schema(description = "정렬(remindCnt desc, doneCnt desc)", example = "remindCnt desc") + private String sort; + + public Pageable toPageable() { + + return PageRequest.of(page, size); + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/WorkerStatsDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/WorkerStatsDto.java new file mode 100644 index 0000000..42d924d --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/label/dto/WorkerStatsDto.java @@ -0,0 +1,240 @@ +package com.kamco.cd.kamcoback.label.dto; + +import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import java.time.ZonedDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +public class WorkerStatsDto { + + @Getter + @Setter + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Schema(description = "프로젝트 기본 정보 (상단 표시용)") + public static class ProjectInfo { + + @Schema(description = "변화탐지년도 (예: 2026-2025)") + private String detectionYear; + + @Schema(description = "회차 (예: 8)") + private String stage; + + @Schema(description = "국유인 반영일 (예: 2026-03-31)") + @JsonFormatDttm + private ZonedDateTime gukyuinApplyDttm; + + @Schema(description = "작업 시작일 (예: 2026-04-06)") + @JsonFormatDttm + private ZonedDateTime startDttm; + + @Schema(description = "프로젝트 UUID") + private String uuid; + + @Schema(description = "라벨링 종료 여부 (Y: 종료, N: 진행중)") + private String labelingClosedYn; + + @Schema(description = "검수 종료 여부 (Y: 종료, N: 진행중)") + private String inspectionClosedYn; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Schema(description = "프로젝트 종료 여부 업데이트 요청") + public static class UpdateClosedRequest { + + @Schema( + description = "프로젝트 UUID (선택) - 미입력 시 현재 진행중인 최신 프로젝트가 대상", + example = "f97dc186-e6d3-4645-9737-3173dde8dc64") + private String uuid; + + @Pattern( + regexp = "^(LABELING|INSPECTION|BOTH)$", + message = "종료 유형은 LABELING, INSPECTION 또는 BOTH 이어야 합니다.") + @Schema( + description = "종료 유형 (LABELING: 라벨링만, INSPECTION: 검수만, BOTH: 라벨링+검수 동시)", + example = "LABELING", + allowableValues = {"LABELING", "INSPECTION", "BOTH"}, + requiredMode = Schema.RequiredMode.NOT_REQUIRED) + private String closedType; + + @NotBlank(message = "종료 여부는 필수입니다.") + @Pattern(regexp = "^[YN]$", message = "종료 여부는 Y 또는 N이어야 합니다.") + @Schema( + description = "종료 여부 (Y: 종료, N: 진행중)", + example = "Y", + allowableValues = {"Y", "N"}, + requiredMode = Schema.RequiredMode.REQUIRED) + private String closedYn; + } + + @Getter + @Setter + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Schema(description = "작업자 통계 응답") + public static class WorkerStatistics { + + @Schema(description = "작업자 ID (사번)") + private String workerId; + + @Schema(description = "작업자 이름") + private String workerName; + + @Schema(description = "작업자 유형 (LABELER/INSPECTOR)") + private String workerType; + + @Schema(description = "전체 배정 건수") + private Long totalAssigned; + + @Schema(description = "완료 건수") + private Long completed; + + @Schema(description = "스킵 건수") + private Long skipped; + + @Schema(description = "남은 작업 건수") + private Long remaining; + + @Schema(description = "최근 3일간 처리 이력") + private DailyHistory history; + + @Schema(description = "작업 정체 여부 (3일간 실적이 저조하면 true)") + private Boolean isStagnated; + + // 레거시 필드 (기존 호환성 유지) + @Deprecated private Long doneCnt; // completed로 대체 + + @Deprecated private Long skipCnt; // skipped로 대체 + + @Deprecated private Long remainingCnt; // remaining으로 대체 + + @Deprecated private Long day3AgoDoneCnt; // history.day3Ago로 대체 + + @Deprecated private Long day2AgoDoneCnt; // history.day2Ago로 대체 + + @Deprecated private Long day1AgoDoneCnt; // history.day1Ago로 대체 + } + + @Getter + @Setter + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Schema(description = "최근 3일간 일일 처리 이력") + public static class DailyHistory { + + @Schema(description = "1일 전 (어제) 처리량") + private Long day1Ago; + + @Schema(description = "2일 전 처리량") + private Long day2Ago; + + @Schema(description = "3일 전 처리량") + private Long day3Ago; + + @Schema(description = "3일 평균 처리량") + private Long average; + } + + @Getter + @Setter + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Schema(description = "작업 진행 현황 정보") + public static class WorkProgressInfo { + + // === 라벨링 관련 === + @Schema(description = "라벨링 진행률 (완료건+스킵건)/배정건") + private Double labelingProgressRate; + + @Schema(description = "라벨링 작업 상태 (진행중/완료)") + private String labelingStatus; + + @Schema(description = "라벨링 전체 배정 건수") + private Long labelingTotalCount; + + @Schema(description = "라벨링 완료 건수 (LABEL_FIN + TEST_ING + DONE)") + private Long labelingCompletedCount; + + @Schema(description = "라벨링 스킵 건수 (SKIP)") + private Long labelingSkipCount; + + @Schema(description = "라벨링 남은 작업 건수") + private Long labelingRemainingCount; + + @Schema(description = "투입된 라벨러 수") + private Long labelerCount; + + // === 검수(Inspection) 관련 (신규 추가) === + @Schema(description = "검수 진행률 (완료건/대상건)") + private Double inspectionProgressRate; + + @Schema(description = "검수 작업 상태 (진행중/완료)") + private String inspectionStatus; + + @Schema(description = "검수 대상 건수 (라벨링 대상과 동일)") + private Long inspectionTotalCount; + + @Schema(description = "검수 완료 건수 (DONE)") + private Long inspectionCompletedCount; + + @Schema(description = "검수 제외 건수 (라벨링 스킵과 동일)") + private Long inspectionSkipCount; + + @Schema(description = "검수 남은 작업 건수") + private Long inspectionRemainingCount; + + @Schema(description = "투입된 검수자 수") + private Long inspectorCount; + + // === 레거시 호환 필드 (Deprecated) === + @Deprecated + @Schema(description = "[Deprecated] labelingProgressRate 사용 권장") + private Double progressRate; + + @Deprecated + @Schema(description = "[Deprecated] labelingTotalCount 사용 권장") + private Long totalAssignedCount; + + @Deprecated + @Schema(description = "[Deprecated] labelingCompletedCount 사용 권장") + private Long completedCount; + + @Deprecated + @Schema(description = "[Deprecated] labelingRemainingCount 사용 권장") + private Long remainingLabelCount; + + @Deprecated + @Schema(description = "[Deprecated] inspectionRemainingCount 사용 권장") + private Long remainingInspectCount; + } + + @Getter + @Setter + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Schema(description = "작업자 목록 응답 (작업 정보 포함)") + public static class WorkerListResponse { + + @Schema(description = "프로젝트 기본 정보 (상단 표시용)") + private ProjectInfo projectInfo; + + @Schema(description = "작업 진행 현황 정보") + private WorkProgressInfo progressInfo; + + // workers 필드는 제거되었습니다 (프로젝트 정보와 진행현황만 반환) + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java new file mode 100644 index 0000000..33fbbc3 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java @@ -0,0 +1,265 @@ +package com.kamco.cd.kamcoback.members.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.kamco.cd.kamcoback.common.enums.RoleType; +import com.kamco.cd.kamcoback.common.enums.StatusType; +import com.kamco.cd.kamcoback.common.utils.enums.Enums; +import com.kamco.cd.kamcoback.common.utils.interfaces.EnumValid; +import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import java.time.ZonedDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +public class MembersDto { + + @Getter + @Setter + public static class Basic { + + private Long id; + private UUID uuid; + private String userRole; + private String userRoleName; + private String name; + private String employeeNo; + private String status; + private String statusName; + @JsonFormatDttm private ZonedDateTime createdDttm; + @JsonFormatDttm private ZonedDateTime firstLoginDttm; + @JsonFormatDttm private ZonedDateTime lastLoginDttm; + @JsonFormatDttm private ZonedDateTime statusChgDttm; + + public Basic( + Long id, + UUID uuid, + String userRole, + String name, + String employeeNo, + String status, + ZonedDateTime createdDttm, + ZonedDateTime firstLoginDttm, + ZonedDateTime lastLoginDttm, + ZonedDateTime statusChgDttm, + Boolean pwdResetYn) { + this.id = id; + this.uuid = uuid; + this.userRole = userRole; + this.userRoleName = getUserRoleName(userRole); + this.name = name; + this.employeeNo = employeeNo; + this.status = status; + this.statusName = getStatusName(status, pwdResetYn); + this.createdDttm = createdDttm; + this.firstLoginDttm = firstLoginDttm; + this.lastLoginDttm = lastLoginDttm; + this.statusChgDttm = statusChgDttm; + } + + private String getUserRoleName(String roleId) { + RoleType type = Enums.fromId(RoleType.class, roleId); + return type.getText(); + } + + private String getStatusName(String status, Boolean pwdResetYn) { + StatusType type = Enums.fromId(StatusType.class, status); + pwdResetYn = pwdResetYn != null && pwdResetYn; + if (type.equals(StatusType.PENDING) && pwdResetYn) { + type = StatusType.ACTIVE; + } + return type.getText(); + } + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class SearchReq { + + @Schema(description = "전체, 관리자(ADMIN), 라벨러(LABELER), 검수자(REVIEWER)", example = "") + private String userRole; + + @Schema(description = "키워드", example = "홍길동") + private String keyword; + + // 페이징 파라미터 + @Schema(description = "페이지 번호 (0부터 시작) ", example = "0") + private int page = 0; + + @Schema(description = "페이지 크기", example = "20") + private int size = 20; + + public Pageable toPageable() { + return PageRequest.of(page, size); + } + } + + @Getter + @Setter + public static class AddReq { + + @Schema(description = "관리자 유형", example = "ADMIN") + @NotBlank + @EnumValid(enumClass = RoleType.class, message = "userRole은 ADMIN, LABELER, REVIEWER 만 가능합니다.") + private String userRole; + + @Schema(description = "사번", example = "123456") + @Size(max = 6) + private String employeeNo; + + @Schema(description = "이름", example = "홍길동") + @NotBlank + @Size(min = 2, max = 100) + private String name; + + @NotBlank + @Schema(description = "패스워드", example = "") + @Size(max = 255) + private String password; + + public AddReq(String userRole, String employeeNo, String name, String password) { + this.userRole = userRole; + this.employeeNo = employeeNo; + this.name = name; + this.password = password; + } + } + + @Getter + @Setter + public static class UpdateReq { + + @Schema(description = "이름", example = "홍길동") + @Size(min = 2, max = 100) + private String name; + + @Schema(description = "상태", example = "ACTIVE") + @EnumValid(enumClass = StatusType.class, message = "status는 ACTIVE, INACTIVE, DELETED 만 가능합니다.") + private String status; + + @Schema(description = "패스워드", example = "") + @Size(max = 255) + private String password; + + public UpdateReq(String name, String status, String password) { + this.name = name; + this.status = status; + this.password = password; + } + } + + @Getter + @Setter + public static class InitReq { + + @Schema(description = "기존 패스워드", example = "") + @Size(max = 255) + @NotBlank + private String oldPassword; + + @Schema(description = "신규 패스워드", example = "") + @Size(max = 255) + @NotBlank + private String newPassword; + } + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class Member { + + private Long id; + private String name; + private String employeeNo; + private String role; + } + + @Getter + public static class RoleEntity { + + private final RoleType type; + private final String name; + + public RoleEntity(RoleType status) { + this.type = status; + this.name = status.getText(); + } + } + + @Getter + public static class StatusEntity { + + private final StatusType type; + private final String name; + + public StatusEntity(StatusType status) { + this.type = status; + this.name = status.getText(); + } + } + + @Getter + public static class EntityData { + + @JsonIgnore private Long id; + private UUID uuid; + private String name; + private String employeeNo; + private RoleEntity role; + private StatusEntity status; + @JsonFormatDttm private ZonedDateTime createdDttm; + @JsonFormatDttm private ZonedDateTime firstLoginDttm; + @JsonFormatDttm private ZonedDateTime lastLoginDttm; + @JsonFormatDttm private ZonedDateTime statusChgDttm; + + private Boolean isReset; + + public EntityData( + Long id, + UUID uuid, + RoleType role, + String name, + String employeeNo, + StatusType status, + ZonedDateTime createdDttm, + ZonedDateTime firstLoginDttm, + ZonedDateTime lastLoginDttm, + ZonedDateTime statusChgDttm, + Boolean isReset) { + this.id = id; + this.uuid = uuid; + this.name = name; + this.employeeNo = employeeNo; + this.status = new StatusEntity(status); + this.createdDttm = createdDttm; + this.firstLoginDttm = firstLoginDttm; + this.lastLoginDttm = lastLoginDttm; + this.statusChgDttm = statusChgDttm; + this.isReset = isReset; + this.role = new RoleEntity(role); + } + + private String getUserRoleName(String roleId) { + RoleType type = Enums.fromId(RoleType.class, roleId); + return type.getText(); + } + + private String getStatusName(String status, Boolean pwdResetYn) { + StatusType type = Enums.fromId(StatusType.class, status); + pwdResetYn = pwdResetYn != null && pwdResetYn; + if (type.equals(StatusType.PENDING) && pwdResetYn) { + type = StatusType.ACTIVE; + } + return type.getText(); + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/members/exception/MemberException.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/members/exception/MemberException.java new file mode 100644 index 0000000..60490c4 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/members/exception/MemberException.java @@ -0,0 +1,50 @@ +package com.kamco.cd.kamcoback.members.exception; + +import lombok.Getter; + +@Getter +public class MemberException { + + // *** Duplicate Member Exception *** + @Getter + public static class DuplicateMemberException extends RuntimeException { + + public enum Field { + USER_ID, + EMPLOYEE_NO, + DEFAULT + } + + private final Field field; + private final String value; + + public DuplicateMemberException(Field field, String value) { + super(field.name() + " duplicate: " + value); + this.field = field; + this.value = value; + } + } + + // *** Member Not Found Exception *** + public static class MemberNotFoundException extends RuntimeException { + + public MemberNotFoundException() { + super("Member not found"); + } + + public MemberNotFoundException(String message) { + super(message); + } + } + + public static class PasswordNotFoundException extends RuntimeException { + + public PasswordNotFoundException() { + super("Password not found"); + } + + public PasswordNotFoundException(String message) { + super(message); + } + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/CommonCreateEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/CommonCreateEntity.java new file mode 100644 index 0000000..701df39 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/CommonCreateEntity.java @@ -0,0 +1,22 @@ +package com.kamco.cd.kamcoback.postgres; + +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.PrePersist; +import java.time.ZonedDateTime; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; + +@Getter +@MappedSuperclass +public class CommonCreateEntity { + + @CreatedDate + @Column(name = "created_dttm", updatable = false, nullable = false) + private ZonedDateTime createdDate; + + @PrePersist + protected void onPersist() { + this.createdDate = ZonedDateTime.now(); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/CommonDateEntity.java similarity index 94% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/CommonDateEntity.java index cb9abe9..b10e54c 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/CommonDateEntity.java @@ -1,4 +1,4 @@ -package com.kamco.cd.kamcoback.postgres.entity; +package com.kamco.cd.kamcoback.postgres; import jakarta.persistence.Column; import jakarta.persistence.MappedSuperclass; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/QuerydslConfig.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/QueryDslConfig.java similarity index 64% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/QuerydslConfig.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/QueryDslConfig.java index 7db36f4..97f24b0 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/config/QuerydslConfig.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/QueryDslConfig.java @@ -1,15 +1,16 @@ -package com.kamco.cd.kamcoback.config; +package com.kamco.cd.kamcoback.postgres; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +@RequiredArgsConstructor @Configuration -public class QuerydslConfig { +public class QueryDslConfig { - @PersistenceContext private EntityManager entityManager; + private final EntityManager entityManager; @Bean public JPAQueryFactory jpaQueryFactory() { diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/QuerydslOrderUtil.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/QuerydslOrderUtil.java new file mode 100644 index 0000000..2eabf5f --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/QuerydslOrderUtil.java @@ -0,0 +1,30 @@ +package com.kamco.cd.kamcoback.postgres; + +import com.querydsl.core.types.Order; +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.PathBuilder; +import org.springframework.data.domain.Pageable; + +public class QuerydslOrderUtil { + /** + * Pageable의 Sort 정보를 QueryDSL OrderSpecifier 배열로 변환 + * + * @param pageable Spring Pageable + * @param entityClass 엔티티 클래스 (예: User.class) + * @param alias Q 엔티티 alias (예: "user") + */ + public static OrderSpecifier[] getOrderSpecifiers( + Pageable pageable, Class entityClass, String alias) { + PathBuilder entityPath = new PathBuilder<>(entityClass, alias); + + return pageable.getSort().stream() + .map( + sort -> { + Order order = sort.isAscending() ? Order.ASC : Order.DESC; + // PathBuilder.get()는 컬럼명(String)을 동적 Path로 반환 + return new OrderSpecifier<>( + order, entityPath.get(sort.getProperty(), Comparable.class)); + }) + .toArray(OrderSpecifier[]::new); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelJobCoreService.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelJobCoreService.java index 578b3da..c90715d 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelJobCoreService.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelJobCoreService.java @@ -1,8 +1,9 @@ package com.kamco.cd.kamcoback.postgres.core; -import com.kamco.cd.kamcoback.dto.TrainingDataReviewJobDto.InspectorPendingDto; -import com.kamco.cd.kamcoback.dto.TrainingDataReviewJobDto.Tasks; import com.kamco.cd.kamcoback.postgres.repository.scheduler.TrainingDataLabelJobRepository; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.InspectorPendingDto; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.Tasks; +import java.time.LocalDate; import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -14,8 +15,8 @@ public class TrainingDataLabelJobCoreService { private final TrainingDataLabelJobRepository trainingDataLabelJobRepository; - public List findCompletedYesterdayUnassigned() { - return trainingDataLabelJobRepository.findCompletedYesterdayUnassigned(); + public List findCompletedYesterdayUnassigned(LocalDate baseDate) { + return trainingDataLabelJobRepository.findCompletedYesterdayUnassigned(baseDate); } public void assignReviewerBatch(List assignmentUids, String reviewerId) { diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/InferenceResultsTestingEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/InferenceResultsTestingEntity.java new file mode 100644 index 0000000..6202c39 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/InferenceResultsTestingEntity.java @@ -0,0 +1,87 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import java.time.ZonedDateTime; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; +import org.locationtech.jts.geom.Geometry; + +@Getter +@Setter +@Entity +@Table(name = "inference_results_testing") +public class InferenceResultsTestingEntity { + + @Column(name = "probability") + private Double probability; + + @Column(name = "before_year") + private Long beforeYear; + + @Column(name = "after_year") + private Long afterYear; + + @Column(name = "map_id", length = Integer.MAX_VALUE) + private String mapId; + + @Column(name = "model_version", length = Integer.MAX_VALUE) + private String modelVersion; + + @Column(name = "cls_model_path", length = Integer.MAX_VALUE) + private String clsModelPath; + + @Column(name = "cls_model_version", length = Integer.MAX_VALUE) + private String clsModelVersion; + + @Column(name = "cd_model_type", length = Integer.MAX_VALUE) + private String cdModelType; + + @Column(name = "id") + private Long id; + + @Column(name = "model_name", length = Integer.MAX_VALUE) + private String modelName; + + @Column(name = "batch_id") + private Long batchId; + + @Column(name = "area") + private Double area; + + @Column(name = "before_c", length = Integer.MAX_VALUE) + private String beforeC; + + @Column(name = "before_p") + private Double beforeP; + + @Column(name = "after_c", length = Integer.MAX_VALUE) + private String afterC; + + @Column(name = "after_p") + private Double afterP; + + @Id + @NotNull + @ColumnDefault("nextval('inference_results_testing_seq_seq')") + @Column(name = "seq", nullable = false) + private Long seq; + + @ColumnDefault("now()") + @Column(name = "created_date") + private ZonedDateTime createdDate; + + @Size(max = 32) + @NotNull + @ColumnDefault("upper(replace((uuid_generate_v4()), '-', ''))") + @Column(name = "uid", nullable = false, length = 32) + private String uid; + + @Column(name = "geometry", columnDefinition = "geometry") + private Geometry geometry; +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.java index 804706c..ea8e689 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.java @@ -1,6 +1,7 @@ package com.kamco.cd.kamcoback.postgres.entity; -import com.kamco.cd.kamcoback.dto.LabelAllocateDto; +import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto; +import com.kamco.cd.kamcoback.postgres.CommonDateEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.java index 6aeee48..5da0a68 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.java @@ -1,6 +1,7 @@ package com.kamco.cd.kamcoback.postgres.entity; -import com.kamco.cd.kamcoback.dto.LabelInspectorDto; +import com.kamco.cd.kamcoback.label.dto.LabelInspectorDto; +import com.kamco.cd.kamcoback.postgres.CommonDateEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java index c483e5c..8719273 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java @@ -1,5 +1,7 @@ package com.kamco.cd.kamcoback.postgres.entity; +import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet; +import com.kamco.cd.kamcoback.postgres.CommonDateEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -45,4 +47,8 @@ public class MapInkx50kEntity extends CommonDateEntity { this.mapidNo = mapidNo; this.geom = geom; } + + public MapSheet toEntity() { + return new MapSheet(mapidcdNo, mapidNm); + } } diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java index 3246924..409aa67 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java @@ -1,8 +1,10 @@ package com.kamco.cd.kamcoback.postgres.entity; -import com.kamco.cd.kamcoback.enums.CommonUseStatus; +import com.kamco.cd.kamcoback.common.enums.CommonUseStatus; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet; +import com.kamco.cd.kamcoback.postgres.CommonDateEntity; +import com.kamco.cd.kamcoback.scene.dto.MapInkxMngDto.MapListEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -53,10 +55,6 @@ public class MapInkx5kEntity extends CommonDateEntity { @Enumerated(EnumType.STRING) private CommonUseStatus useInference; - public InferenceDetailDto.MapSheet toEntity() { - return new MapSheet(mapidcdNo, mapidNm); - } - // Constructor public MapInkx5kEntity( String mapidcdNo, String mapidNm, Geometry geom, MapInkx50kEntity mapInkx50k) { @@ -72,4 +70,18 @@ public class MapInkx5kEntity extends CommonDateEntity { public void updateUseInference(CommonUseStatus useInference) { this.useInference = useInference; } + + public InferenceDetailDto.MapSheet toEntity() { + return new MapSheet(mapidcdNo, mapidNm); + } + + public MapListEntity toDto() { + return MapListEntity.builder() + .scene5k(this.toEntity()) + .scene50k(this.mapInkx50k.toEntity()) + .useInference(useInference) + .createdDttm(super.getCreatedDate()) + .updatedDttm(super.getModifiedDate()) + .build(); + } } diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceEntity.java new file mode 100644 index 0000000..e4d3981 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceEntity.java @@ -0,0 +1,167 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Size; +import java.time.ZonedDateTime; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_anal_data_inference") +public class MapSheetAnalDataInferenceEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "data_uid", nullable = false) + private Long id; + + // @Size(max = 128) + // @Column(name = "data_name", length = 128) + // private String dataName; + // + // @Size(max = 255) + // @Column(name = "data_path") + // private String dataPath; + // + // @Size(max = 128) + // @Column(name = "data_type", length = 128) + // private String dataType; + // + // @Size(max = 128) + // @Column(name = "data_crs_type", length = 128) + // private String dataCrsType; + // + // @Size(max = 255) + // @Column(name = "data_crs_type_name") + // private String dataCrsTypeName; + + @ColumnDefault("now()") + @Column(name = "created_dttm") + private ZonedDateTime createdDttm; + + @Column(name = "created_uid") + private Long createdUid; + + @ColumnDefault("now()") + @Column(name = "updated_dttm") + private ZonedDateTime updatedDttm; + + @Column(name = "updated_uid") + private Long updatedUid; + + @Column(name = "compare_yyyy") + private Integer compareYyyy; + + @Column(name = "target_yyyy") + private Integer targetYyyy; + + // @Column(name = "data_json", length = Integer.MAX_VALUE) + // private String dataJson; + // + // @Size(max = 20) + // @ColumnDefault("'0'") + // @Column(name = "data_state", length = 20) + // private String dataState; + + // @ColumnDefault("now()") + // @Column(name = "data_state_dttm") + // private ZonedDateTime dataStateDttm; + // + // @Column(name = "anal_strt_dttm") + // private ZonedDateTime analStrtDttm; + // + // @Column(name = "anal_end_dttm") + // private ZonedDateTime analEndDttm; + // + // @ColumnDefault("0") + // @Column(name = "anal_sec") + // private Long analSec; + + @Size(max = 20) + @Column(name = "anal_state", length = 20) + private String analState; + + @Column(name = "anal_uid") + private Long analUid; + + @Column(name = "map_sheet_num") + private Long mapSheetNum; + + // @ColumnDefault("0") + // @Column(name = "detecting_cnt") + // private Long detectingCnt; + + // @ColumnDefault("0") + // @Column(name = "pnu") + // private Long pnu; + + // @Size(max = 20) + // @Column(name = "down_state", length = 20) + // private String downState; + // + // @Column(name = "down_state_dttm") + // private ZonedDateTime downStateDttm; + + @Size(max = 20) + @Column(name = "fit_state", length = 20) + private String fitState; + + @Column(name = "fit_state_dttm") + private ZonedDateTime fitStateDttm; + + @Column(name = "labeler_uid") + private Long labelerUid; + + @Size(max = 20) + @ColumnDefault("NULL") + @Column(name = "label_state", length = 20) + private String labelState; + + @Column(name = "label_state_dttm") + private ZonedDateTime labelStateDttm; + + @Column(name = "tester_uid") + private Long testerUid; + + @Size(max = 20) + @Column(name = "test_state", length = 20) + private String testState; + + @Column(name = "test_state_dttm") + private ZonedDateTime testStateDttm; + + @Column(name = "fit_state_cmmnt", length = Integer.MAX_VALUE) + private String fitStateCmmnt; + + @Column(name = "ref_map_sheet_num") + private Long refMapSheetNum; + + @Column(name = "stage") + private Integer stage; + + @Column(name = "file_created_yn") + private Boolean fileCreatedYn; + + @Column(name = "file_created_dttm") + private ZonedDateTime fileCreatedDttm; + // @Size(max = 100) + // @Column(name = "m1", length = 100) + // private String m1; + // + // @Size(max = 100) + // @Column(name = "m2", length = 100) + // private String m2; + // + // @Size(max = 100) + // @Column(name = "m3", length = 100) + // private String m3; + +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java index c0487a1..1877ec3 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java @@ -1,6 +1,6 @@ package com.kamco.cd.kamcoback.postgres.entity; -import com.kamco.cd.kamcoback.inference.dto.DetectionClassification; +import com.kamco.cd.kamcoback.common.enums.DetectionClassification; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.Clazzes; import jakarta.persistence.Column; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalInferenceEntity.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalInferenceEntity.java new file mode 100644 index 0000000..cfbbf42 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalInferenceEntity.java @@ -0,0 +1,165 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Size; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_anal_inference") +public class MapSheetAnalInferenceEntity { + + @Id + @GeneratedValue( + strategy = GenerationType.SEQUENCE, + generator = "tb_map_sheet_anal_inference_id_gen") + @SequenceGenerator( + name = "tb_map_sheet_anal_inference_id_gen", + sequenceName = "tb_map_sheet_anal_inference_uid", + allocationSize = 1) + @Column(name = "anal_uid", nullable = false) + private Long id; + + @Column(name = "compare_yyyy") + private Integer compareYyyy; + + @Column(name = "target_yyyy") + private Integer targetYyyy; + + @Column(name = "model_uid") + private Long modelUid; + + @Size(max = 100) + @Column(name = "server_ids", length = 100) + private String serverIds; + + @Column(name = "anal_strt_dttm") + private ZonedDateTime analStrtDttm; + + @Column(name = "anal_end_dttm") + private ZonedDateTime analEndDttm; + + @Column(name = "anal_sec") + private Long analSec; + + @Size(max = 20) + @Column(name = "anal_state", length = 20) + private String analState; + + @Size(max = 20) + @Column(name = "gukyuin_used", length = 20) + private String gukyuinUsed; + + @Column(name = "accuracy") + private Double accuracy; + + @Size(max = 255) + @Column(name = "result_url") + private String resultUrl; + + @ColumnDefault("now()") + @Column(name = "created_dttm") + private ZonedDateTime createdDttm; + + @Column(name = "created_uid") + private Long createdUid; + + @ColumnDefault("now()") + @Column(name = "updated_dttm") + private ZonedDateTime updatedDttm; + + @Column(name = "updated_uid") + private Long updatedUid; + + @Size(max = 255) + @Column(name = "anal_title") + private String analTitle; + + @Column(name = "detecting_cnt") + private Long detectingCnt; + + @Column(name = "anal_pred_sec") + private Long analPredSec; + + @Column(name = "model_ver_uid") + private Long modelVerUid; + + @Column(name = "hyper_params") + @JdbcTypeCode(SqlTypes.JSON) + private Map hyperParams; + + @Column(name = "tranning_rate") + private List tranningRate; + + @Column(name = "validation_rate") + private List validationRate; + + @Column(name = "test_rate", length = Integer.MAX_VALUE) + private String testRate; + + @Size(max = 128) + @Column(name = "detecting_description", length = 128) + private String detectingDescription; + + @Size(max = 12) + @Column(name = "base_map_sheet_num", length = 12) + private String baseMapSheetNum; + + @ColumnDefault("gen_random_uuid()") + @Column(name = "uuid") + private UUID uuid; + + @Size(max = 50) + @Column(name = "model_m1_ver", length = 50) + private String modelM1Ver; + + @Size(max = 50) + @Column(name = "model_m2_ver", length = 50) + private String modelM2Ver; + + @Size(max = 50) + @Column(name = "model_m3_ver", length = 50) + private String modelM3Ver; + + @Size(max = 20) + @Column(name = "anal_target_type", length = 20) + private String analTargetType; + + @Column(name = "gukyuin_apply_dttm") + private ZonedDateTime gukyuinApplyDttm; + + @Size(max = 20) + @Column(name = "detection_data_option", length = 20) + private String detectionDataOption; + + @Column(name = "stage") + private Integer stage; + + @Size(max = 1) + @ColumnDefault("'N'") + @Column(name = "labeling_closed_yn", length = 1) + private String labelingClosedYn = "N"; + + @Size(max = 1) + @ColumnDefault("'N'") + @Column(name = "inspection_closed_yn", length = 1) + private String inspectionClosedYn = "N"; + + @Column(name = "learn_id") + private Long learnId; +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryCustom.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryCustom.java index 66654fa..923b098 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryCustom.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryCustom.java @@ -1,13 +1,14 @@ package com.kamco.cd.kamcoback.postgres.repository.scheduler; -import com.kamco.cd.kamcoback.dto.TrainingDataReviewJobDto.InspectorPendingDto; -import com.kamco.cd.kamcoback.dto.TrainingDataReviewJobDto.Tasks; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.InspectorPendingDto; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.Tasks; +import java.time.LocalDate; import java.util.List; import java.util.UUID; public interface TrainingDataLabelJobRepositoryCustom { - List findCompletedYesterdayUnassigned(); + List findCompletedYesterdayUnassigned(LocalDate baseDate); List findInspectorPendingByRound(Long analUid); diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryImpl.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryImpl.java index e17e87e..968bc13 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryImpl.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/TrainingDataLabelJobRepositoryImpl.java @@ -4,16 +4,17 @@ import static com.kamco.cd.kamcoback.postgres.entity.QLabelingAssignmentEntity.l import static com.kamco.cd.kamcoback.postgres.entity.QLabelingInspectorEntity.labelingInspectorEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceGeomEntity.mapSheetAnalDataInferenceGeomEntity; -import com.kamco.cd.kamcoback.dto.LabelAllocateDto.InspectState; -import com.kamco.cd.kamcoback.dto.LabelAllocateDto.LabelState; -import com.kamco.cd.kamcoback.dto.TrainingDataReviewJobDto.InspectorPendingDto; -import com.kamco.cd.kamcoback.dto.TrainingDataReviewJobDto.Tasks; +import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.InspectState; +import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.LabelState; import com.kamco.cd.kamcoback.postgres.entity.LabelingAssignmentEntity; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.InspectorPendingDto; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.Tasks; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.StringExpression; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.time.LocalDate; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.List; @@ -34,16 +35,23 @@ public class TrainingDataLabelJobRepositoryImpl extends QuerydslRepositorySuppor } @Override - public List findCompletedYesterdayUnassigned() { + public List findCompletedYesterdayUnassigned(LocalDate baseDate) { ZoneId zone = ZoneId.of("Asia/Seoul"); - ZonedDateTime todayStart = ZonedDateTime.now(zone).toLocalDate().atStartOfDay(zone); - ZonedDateTime yesterdayStart = todayStart.minusDays(1); + + // baseDate가 null이면 "어제"를 타겟으로, 아니면 baseDate + LocalDate targetDate = (baseDate != null) ? baseDate : LocalDate.now(zone).minusDays(1); + + // end: targetDate + 1일 00:00 + ZonedDateTime baseStart = targetDate.plusDays(1).atStartOfDay(zone); + + // start: targetDate 00:00 + ZonedDateTime yesterdayStart = baseStart.minusDays(1); BooleanExpression isYesterday = labelingAssignmentEntity .workStatDttm .goe(yesterdayStart) - .and(labelingAssignmentEntity.workStatDttm.lt(todayStart)); + .and(labelingAssignmentEntity.workStatDttm.lt(baseStart)); return queryFactory .select( diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.java new file mode 100644 index 0000000..af5109b --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.java @@ -0,0 +1,220 @@ +package com.kamco.cd.kamcoback.scene.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.JsonNode; +import com.kamco.cd.kamcoback.common.enums.ApiConfigEnum.EnumDto; +import com.kamco.cd.kamcoback.common.enums.CommonUseStatus; +import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.persistence.EntityNotFoundException; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +public class MapInkxMngDto { + + // CommonUseStatus class로 통합 20251230 + // @CodeExpose + // @Getter + // @AllArgsConstructor + // public enum UseInferenceType implements EnumType { + // USE("사용중"), + // EXCEPT("영구 추론제외"); + // + // private final String desc; + // + // @Override + // public String getId() { + // return name(); + // } + // + // @Override + // public String getText() { + // return desc; + // } + // } + + @Schema(name = "Basic", description = "Basic") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class Basic { + + private Integer fid; + private String mapidcdNo; + private String mapidNm; + private JsonNode geom; + private String useInference; + private ZonedDateTime createdDttm; + private ZonedDateTime updatedDttm; + } + + @Getter + @Schema(name = "MapListEntity", description = "목록 항목") + public static class MapListEntity { + + private InferenceDetailDto.MapSheet scene50k; + private InferenceDetailDto.MapSheet scene5k; + private CommonUseStatus useInference; + + @JsonFormat( + shape = JsonFormat.Shape.STRING, + pattern = "yyyy-MM-dd'T'HH:mm:ssXXX", + timezone = "Asia/Seoul") + private ZonedDateTime createdDttm; + + @JsonFormat( + shape = JsonFormat.Shape.STRING, + pattern = "yyyy-MM-dd'T'HH:mm:ssXXX", + timezone = "Asia/Seoul") + private ZonedDateTime updatedDttm; + + public EnumDto getUseInference() { + EnumDto enumDto = useInference.getEnumDto(); + return enumDto; + } + + @Builder + public MapListEntity( + InferenceDetailDto.MapSheet scene50k, + InferenceDetailDto.MapSheet scene5k, + CommonUseStatus useInference, + ZonedDateTime createdDttm, + ZonedDateTime updatedDttm) { + this.scene50k = scene50k; + this.scene5k = scene5k; + this.useInference = useInference; + this.createdDttm = createdDttm; + this.updatedDttm = updatedDttm; + } + } + + @Schema(name = "MapList", description = "목록 항목") + @Getter + @Setter + @NoArgsConstructor + public static class MapList { + + private Integer rowNum; + private String mapidcdNo5k; + private String mapidcdNo50k; + private String mapidNm; + private String createdDttm; + private String updatedDttm; + private String useInference; + private ZonedDateTime createdDttmTime; + private ZonedDateTime updatedDttmTime; + + // 목록 Querydsl 에서 리턴 받는 건 생성자 기준임 -> 쿼리 컬럼 그대로 받고 여기서 Java 형변환 해서 return 하기 + public MapList( + Integer rowNum, + String mapidcdNo5k, + String mapidcdNo50k, + String mapidNm, + ZonedDateTime createdDttmTime, + ZonedDateTime updatedDttmTime, + CommonUseStatus useInference) { + this.rowNum = rowNum; + this.mapidcdNo5k = mapidcdNo5k; + this.mapidcdNo50k = mapidcdNo50k; + this.mapidNm = mapidNm; + + DateTimeFormatter fmt = + DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.of("Asia/Seoul")); + this.createdDttm = fmt.format(createdDttmTime); + this.updatedDttm = fmt.format(updatedDttmTime); + this.createdDttmTime = createdDttmTime; + this.updatedDttmTime = updatedDttmTime; + this.useInference = useInference.getId(); + } + } + + @Schema(name = "searchReq", description = "검색 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class searchReq { + + // 페이징 파라미터 + private int page = 0; + private int size = 20; + private String sort; + + public Pageable toPageable() { + if (sort != null && !sort.isEmpty()) { + String[] sortParams = sort.split(","); + String property = sortParams[0]; + Sort.Direction direction = + sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC; + return PageRequest.of(page, size, Sort.by(direction, property)); + } + return PageRequest.of(page, size); + } + } + + @Schema(name = "AddMapReq", description = "등록 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class AddMapReq { + + @Schema(description = "도엽번호", example = "31540687") + private String mapidcdNo; + + @Schema(description = "도엽명", example = "공덕") + private String mapidNm; + + @Schema( + description = "좌표 목록 (한 줄에 한 점, '경도 위도' 형식)", + example = + "127.17500001632317 36.17499998262991\n" + + "127.14999995475043 36.17500002877932\n" + + "127.15000004313612 36.199999984012415\n" + + "127.1750000466954 36.20000001863179") + private String coordinates; + } + + @Schema(name = "UseInferReq", description = "추론제외 업데이트 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class UseInferReq { + + private String mapidcdNo; + private CommonUseStatus useInference; // 변경하고자하는 상태 + + public void valid() { + if (mapidcdNo == null || mapidcdNo.isEmpty()) { + throw new IllegalArgumentException("도엽번호는 필수 입력값입니다."); + } + // 공백제거 + mapidcdNo = mapidcdNo.trim(); + + if (!mapidcdNo.matches("^\\d{8}$")) { + throw new EntityNotFoundException("도엽번호는 8자리 숫자로 구성되어야 합니다."); + } + } + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class Search5kReq { + + private String mapidcdNo; + private String useInference; + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scheduler/SchedulerApiController.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scheduler/SchedulerApiController.java new file mode 100644 index 0000000..aa7b853 --- /dev/null +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scheduler/SchedulerApiController.java @@ -0,0 +1,31 @@ +package com.kamco.cd.kamcoback.scheduler; + +import com.kamco.cd.kamcoback.config.api.ApiResponseDto; +import com.kamco.cd.kamcoback.scheduler.service.TrainingDataLabelJobService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.time.LocalDate; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "스케줄링 수동 호출 테스트", description = "스케줄링 수동 호출 테스트 API") +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/schedule") +public class SchedulerApiController { + + private final TrainingDataLabelJobService trainingDataLabelJobService; + + @Operation( + summary = "라벨완료 -> 검수할당 스케줄링", + description = "스케줄링이 실패한 경우 수동 호출하는 API, 어제 라벨링 완료된 것을 해당 검수자들에게 할당함") + @GetMapping("/label-to-review") + public ApiResponseDto runTrainingReviewSchedule( + @RequestParam(required = false) LocalDate baseDate) { + trainingDataLabelJobService.assignReviewerYesterdayLabelComplete(baseDate); + return ApiResponseDto.ok(null); + } +} diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto.java similarity index 95% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto.java index 16d130c..7d452c8 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto.java @@ -1,4 +1,4 @@ -package com.kamco.cd.kamcoback.dto; +package com.kamco.cd.kamcoback.scheduler.dto; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @@ -6,7 +6,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.kamco.cd.kamcoback.dto.TrainingDataReviewJobDto.CompleteLabelData.GeoJsonFeature; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.CompleteLabelData.GeoJsonFeature; import java.util.List; import java.util.UUID; import lombok.AllArgsConstructor; diff --git a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/service/TrainingDataLabelJobService.java b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scheduler/service/TrainingDataLabelJobService.java similarity index 79% rename from label/label-to-review/src/main/java/com/kamco/cd/kamcoback/service/TrainingDataLabelJobService.java rename to label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scheduler/service/TrainingDataLabelJobService.java index d157ea9..375b95f 100644 --- a/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/service/TrainingDataLabelJobService.java +++ b/label/label-to-review/src/main/java/com/kamco/cd/kamcoback/scheduler/service/TrainingDataLabelJobService.java @@ -1,9 +1,10 @@ package com.kamco.cd.kamcoback.scheduler.service; -import com.kamco.cd.kamcoback.dto.TrainingDataReviewJobDto.InspectorPendingDto; -import com.kamco.cd.kamcoback.dto.TrainingDataReviewJobDto.Tasks; import com.kamco.cd.kamcoback.postgres.core.TrainingDataLabelJobCoreService; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.InspectorPendingDto; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.Tasks; import jakarta.transaction.Transactional; +import java.time.LocalDate; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -13,6 +14,7 @@ import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -22,6 +24,7 @@ import org.springframework.stereotype.Service; public class TrainingDataLabelJobService { private final TrainingDataLabelJobCoreService trainingDataLabelJobCoreService; + private final ApplicationContext applicationContext; @Value("${spring.profiles.active}") private String profile; @@ -30,16 +33,24 @@ public class TrainingDataLabelJobService { return "local".equalsIgnoreCase(profile); } - @Transactional - @Scheduled(cron = "0 0 0 * * *") - public void assignReviewerYesterdayLabelComplete() { + @Scheduled(cron = "0 * * * * *") + public void runTask() { + // 프록시를 통해 호출해야 @Transactional이 적용됨 + applicationContext + .getBean(TrainingDataLabelJobService.class) + .assignReviewerYesterdayLabelComplete(null); + } - if (isLocalProfile()) { - return; - } + @Transactional + public void assignReviewerYesterdayLabelComplete(LocalDate baseDate) { + + // if (isLocalProfile()) { + // return; + // } try { - List tasks = trainingDataLabelJobCoreService.findCompletedYesterdayUnassigned(); + List tasks = + trainingDataLabelJobCoreService.findCompletedYesterdayUnassigned(baseDate); if (tasks.isEmpty()) { return; @@ -88,6 +99,7 @@ public class TrainingDataLabelJobService { } } catch (Exception e) { log.error("배치 처리 중 예외", e); + throw e; } } diff --git a/label/label-to-review/src/main/resources/application-dev.yml b/label/label-to-review/src/main/resources/application-dev.yml new file mode 100644 index 0000000..498806e --- /dev/null +++ b/label/label-to-review/src/main/resources/application-dev.yml @@ -0,0 +1,138 @@ +spring: + config: + activate: + on-profile: dev + + jpa: + show-sql: false + hibernate: + ddl-auto: validate + properties: + hibernate: + default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 + order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지 + order_inserts: true + use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용) + format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) + jdbc: + batch_size: 1000 # ✅ 추가 (JDBC batch) + open-in-view: false + mvc: + async: + request-timeout: 300s # 5분 (예: 30s, 120s, 10m 등도 가능) + + datasource: + url: jdbc:postgresql://192.168.2.127:15432/kamco_cds + #url: jdbc:postgresql://localhost:15432/kamco_cds + username: kamco_cds + password: kamco_cds_Q!W@E#R$ + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-timeout: 60000 # 60초 연결 타임아웃 + idle-timeout: 300000 # 5분 유휴 타임아웃 + max-lifetime: 1800000 # 30분 최대 수명 + leak-detection-threshold: 60000 # 연결 누수 감지 + + transaction: + default-timeout: 300 # 5분 트랜잭션 타임아웃 + + data: + redis: + host: 192.168.2.109 + port: 6379 + password: kamco + + servlet: + multipart: + enabled: true + max-file-size: 4GB + max-request-size: 4GB + file-size-threshold: 10MB + +server: + tomcat: + max-swallow-size: 4GB + max-http-form-post-size: 4GB + +jwt: + secret: "kamco_token_9b71e778-19a3-4c1d-97bf-2d687de17d5b" + access-token-validity-in-ms: 86400000 # 1일 + refresh-token-validity-in-ms: 604800000 # 7일 + #access-token-validity-in-ms: 60000 # 1분 + #refresh-token-validity-in-ms: 300000 # 5분 + +token: + refresh-cookie-name: kamco-dev # 개발용 쿠키 이름 + refresh-cookie-secure: false # 로컬 http 테스트면 false + +springdoc: + swagger-ui: + persist-authorization: true # 스웨거 새로고침해도 토큰 유지, 로컬스토리지에 저장 + +logging: + level: + root: INFO + org.springframework.web: DEBUG + org.springframework.security: DEBUG + + # 헬스체크 노이즈 핵심만 다운 + org.springframework.security.web.FilterChainProxy: INFO + org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO + org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO + org.springframework.web.servlet.DispatcherServlet: INFO + + +mapsheet: + upload: + skipGdalValidation: true + shp: + baseurl: /app/tmp/detect/result #현재사용안함 + + + +file: + #sync-root-dir: D:/kamco-nfs/images/ + sync-root-dir: /kamco-nfs/images/ + sync-tmp-dir: /kamco-nfs/requests/temp # image upload temp dir + #sync-tmp-dir: ${file.sync-root-dir}/tmp + sync-file-extention: tfw,tif + sync-auto-exception-start-year: 2024 + sync-auto-exception-before-year-cnt: 3 + + #dataset-dir: D:/kamco-nfs/model_output/ + dataset-dir: /kamco-nfs/model_output/export/ # 마운트경로 AI 추론결과 + dataset-tmp-dir: ${file.dataset-dir}tmp/ + + #model-dir: D:/kamco-nfs/ckpt/model/ + model-dir: /kamco-nfs/ckpt/model/ # 학습서버에서 트레이닝한 모델업로드경로 + model-tmp-dir: ${file.model-dir}tmp/ + model-file-extention: pth,json,py + + pt-path: /kamco-nfs/ckpt/model/v6-cls-checkpoints/ + pt-FileName: yolov8_6th-6m.pt + + dataset-response: /kamco-nfs/dataset/response/ + +inference: + url: http://192.168.2.183:8000/jobs + batch-url: http://192.168.2.183:8000/batches + geojson-dir: /kamco-nfs/requests/ # 추론실행을 위한 파일생성경로 + jar-path: /kamco-nfs/repo/jar/shp-exporter.jar + inference-server-name: server1,server2,server3,server4 + +gukyuin: + #url: http://localhost:8080 + url: http://192.168.2.129:5301 + cdi: ${gukyuin.url}/api/kcd/cdi + +training-data: + geojson-dir: /kamco-nfs/dataset/request/ + +layer: + geoserver-url: https://kamco.geo-dev.gs.dabeeo.com + wms-path: geoserver/cd + wmts-path: geoserver/cd/gwc/service + workspace: cd + + diff --git a/label/label-to-review/src/main/resources/application-prod.yml b/label/label-to-review/src/main/resources/application-prod.yml new file mode 100644 index 0000000..471febd --- /dev/null +++ b/label/label-to-review/src/main/resources/application-prod.yml @@ -0,0 +1,122 @@ +spring: + config: + activate: + on-profile: prod + + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 + order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지 + order_inserts: true + use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용) + format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) + jdbc: + batch_size: 1000 # ✅ 추가 (JDBC batch) + open-in-view: false + mvc: + async: + request-timeout: 300s # 5분 (예: 30s, 120s, 10m 등도 가능) + + datasource: + url: jdbc:postgresql://kamco-cd-postgis:5432/kamco_cds + #url: jdbc:postgresql://localhost:15432/kamco_cds + username: kamco_cds + password: kamco_cds_Q!W@E#R$ + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-timeout: 60000 # 60초 연결 타임아웃 + idle-timeout: 300000 # 5분 유휴 타임아웃 + max-lifetime: 1800000 # 30분 최대 수명 + leak-detection-threshold: 60000 # 연결 누수 감지 + + transaction: + default-timeout: 300 # 5분 트랜잭션 타임아웃 + + data: + redis: + host: 127.0.0.1 + port: 16379 + password: kamco + + servlet: + multipart: + enabled: true + max-file-size: 4GB + max-request-size: 4GB + file-size-threshold: 10MB + +server: + tomcat: + max-swallow-size: 4GB + max-http-form-post-size: 4GB + +jwt: + secret: "kamco_token_9b71e778-19a3-4c1d-97bf-2d687de17d5b" + access-token-validity-in-ms: 86400000 # 1일 + refresh-token-validity-in-ms: 604800000 # 7일 + +token: + refresh-cookie-name: kamco # 개발용 쿠키 이름 + refresh-cookie-secure: true # 로컬 http 테스트면 false + +logging: + level: + root: INFO + org.springframework.web: DEBUG + org.springframework.security: DEBUG + + # 헬스체크 노이즈 핵심만 다운 + org.springframework.security.web.FilterChainProxy: INFO + org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO + org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO + org.springframework.web.servlet.DispatcherServlet: INFO + + +mapsheet: + upload: + skipGdalValidation: true + shp: + baseurl: /app/detect/result #현재사용안함 + +file: + sync-root-dir: /kamco-nfs/images/ + sync-tmp-dir: /kamco-nfs/repo/tmp # image upload temp dir + sync-file-extention: tfw,tif + + #dataset-dir: D:/kamco-nfs/model_output/ #변경 model_output + dataset-dir: /kamco-nfs/model_output/export/ # 마운트경로 AI 추론결과 + dataset-tmp-dir: ${file.dataset-dir}tmp/ + + #model-dir: D:/kamco-nfs/ckpt/model/ + model-dir: /kamco-nfs/ckpt/model/ # 학습서버에서 트레이닝한 모델업로드경로 + model-tmp-dir: ${file.model-dir}tmp/ + model-file-extention: pth,json,py + + pt-path: /kamco-nfs/ckpt/v6-cls-checkpoints/ + pt-FileName: yolov8_6th-6m.pt + dataset-response: /kamco-nfs/dataset/response/ + +inference: + url: http://127.0.0.1:8000/jobs + batch-url: http://127.0.0.1:8000/batches + geojson-dir: /kamco-nfs/requests/ # 학습서버에서 트레이닝한 모델업로드경로 + jar-path: /kamco-nfs/repo/jar/shp-exporter.jar # 추론실행을 위한 파일생성경로 + inference-server-name: server1,server2,server3,server4 + +gukyuin: + url: http://127.0.0.1:5301 + cdi: ${gukyuin.url}/api/kcd/cdi + +training-data: + geojson-dir: /kamco-nfs/dataset/request/ + +layer: + geoserver-url: https://kamco.geo-dev.gs.dabeeo.com + wms-path: geoserver/cd + wmts-path: geoserver/cd/gwc/service + workspace: cd diff --git a/label/label-to-review/src/main/resources/application.yml b/label/label-to-review/src/main/resources/application.yml index 5d1aadc..b6d0803 100644 --- a/label/label-to-review/src/main/resources/application.yml +++ b/label/label-to-review/src/main/resources/application.yml @@ -1,4 +1,69 @@ server: - port: 9080 + port: 8080 +spring: + application: + name: kamco-change-detection-api + profiles: + active: prod # 사용할 프로파일 지정 (ex. dev, prod, test) + + datasource: + driver-class-name: org.postgresql.Driver + hikari: + jdbc: + time_zone: UTC + batch_size: 50 + # 권장 설정 + minimum-idle: 2 + maximum-pool-size: 2 + connection-timeout: 20000 + idle-timeout: 300000 + max-lifetime: 1800000 + leak-detection-threshold: 60000 + + data: + redis: + host: localhost + port: 6379 + password: + jpa: + hibernate: + ddl-auto: update # 테이블이 없으면 생성, 있으면 업데이트 + properties: + hibernate: + jdbc: + batch_size: 50 + default_batch_fetch_size: 100 +logging: + level: + root: INFO + org.springframework.web: DEBUG + org.springframework.security: DEBUG + + # 헬스체크 노이즈 핵심만 다운 + org.springframework.security.web.FilterChainProxy: INFO + org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO + org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO + org.springframework.web.servlet.DispatcherServlet: INFO +# actuator +management: + health: + readinessstate: + enabled: true + livenessstate: + enabled: true + endpoint: + health: + probes: + enabled: true + show-details: always + endpoints: + jmx: + exposure: + exclude: "*" + web: + base-path: /monitor + exposure: + include: + - "health" diff --git a/label/label-to-review/src/main/resources/application_dev.yml b/label/label-to-review/src/main/resources/application_dev.yml deleted file mode 100644 index a5bc4d9..0000000 --- a/label/label-to-review/src/main/resources/application_dev.yml +++ /dev/null @@ -1,67 +0,0 @@ -server: - port: 9080 - -spring: - application: - name: label-to-review - profiles: - active: dev # 사용할 프로파일 지정 (ex. dev, prod, test) - - datasource: - url: jdbc:postgresql://192.168.2.127:15432/kamco_cds - #url: jdbc:postgresql://localhost:5432/kamco_cds - username: kamco_cds - password: kamco_cds_Q!W@E#R$ - hikari: - minimum-idle: 1 - maximum-pool-size: 5 - - jpa: - hibernate: - ddl-auto: update # 테이블이 없으면 생성, 있으면 업데이트 - properties: - hibernate: - jdbc: - batch_size: 50 - default_batch_fetch_size: 100 -logging: - level: - root: INFO - org.springframework.web: DEBUG - org.springframework.security: DEBUG - - # 헬스체크 노이즈 핵심만 다운 - org.springframework.security.web.FilterChainProxy: INFO - org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO - org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO - org.springframework.web.servlet.DispatcherServlet: INFO -# actuator -management: - health: - readinessstate: - enabled: true - livenessstate: - enabled: true - endpoint: - health: - probes: - enabled: true - show-details: always - endpoints: - jmx: - exposure: - exclude: "*" - web: - base-path: /monitor - exposure: - include: - - "health" - -file: - #sync-root-dir: D:/kamco-nfs/images/ - sync-root-dir: /kamco-nfs/images/ - sync-tmp-dir: ${file.sync-root-dir}/tmp - sync-file-extention: tfw,tif - sync-auto-exception-start-year: 2025 - sync-auto-exception-before-year-cnt: 3 - diff --git a/label/label-to-review/src/main/resources/application_local.yml b/label/label-to-review/src/main/resources/application_local.yml deleted file mode 100644 index 328045e..0000000 --- a/label/label-to-review/src/main/resources/application_local.yml +++ /dev/null @@ -1,67 +0,0 @@ -server: - port: 9080 - -spring: - application: - name: imagery-make-dataset - profiles: - active: local # 사용할 프로파일 지정 (ex. dev, prod, test) - - datasource: - url: jdbc:postgresql://192.168.2.127:15432/kamco_cds - #url: jdbc:postgresql://localhost:5432/kamco_cds - username: kamco_cds - password: kamco_cds_Q!W@E#R$ - hikari: - minimum-idle: 1 - maximum-pool-size: 5 - - jpa: - hibernate: - ddl-auto: update # 테이블이 없으면 생성, 있으면 업데이트 - properties: - hibernate: - jdbc: - batch_size: 50 - default_batch_fetch_size: 100 -logging: - level: - root: INFO - org.springframework.web: DEBUG - org.springframework.security: DEBUG - - # 헬스체크 노이즈 핵심만 다운 - org.springframework.security.web.FilterChainProxy: INFO - org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO - org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO - org.springframework.web.servlet.DispatcherServlet: INFO -# actuator -management: - health: - readinessstate: - enabled: true - livenessstate: - enabled: true - endpoint: - health: - probes: - enabled: true - show-details: always - endpoints: - jmx: - exposure: - exclude: "*" - web: - base-path: /monitor - exposure: - include: - - "health" - -file: - #sync-root-dir: D:/kamco-nfs/images/ - sync-root-dir: /kamco-nfs/images/ - sync-tmp-dir: ${file.sync-root-dir}/tmp - sync-file-extention: tfw,tif - sync-auto-exception-start-year: 2025 - sync-auto-exception-before-year-cnt: 3 - diff --git a/label/label-to-review/src/main/resources/application_prod.yml b/label/label-to-review/src/main/resources/application_prod.yml deleted file mode 100644 index 1282d26..0000000 --- a/label/label-to-review/src/main/resources/application_prod.yml +++ /dev/null @@ -1,67 +0,0 @@ -server: - port: 9080 - -spring: - application: - name: imagery-make-dataset - profiles: - active: prod # 사용할 프로파일 지정 (ex. dev, prod, test) - - datasource: - url: jdbc:postgresql://192.168.2.127:15432/kamco_cds - #url: jdbc:postgresql://localhost:5432/kamco_cds - username: kamco_cds - password: kamco_cds_Q!W@E#R$ - hikari: - minimum-idle: 1 - maximum-pool-size: 5 - - jpa: - hibernate: - ddl-auto: update # 테이블이 없으면 생성, 있으면 업데이트 - properties: - hibernate: - jdbc: - batch_size: 50 - default_batch_fetch_size: 100 -logging: - level: - root: INFO - org.springframework.web: DEBUG - org.springframework.security: DEBUG - - # 헬스체크 노이즈 핵심만 다운 - org.springframework.security.web.FilterChainProxy: INFO - org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO - org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO - org.springframework.web.servlet.DispatcherServlet: INFO -# actuator -management: - health: - readinessstate: - enabled: true - livenessstate: - enabled: true - endpoint: - health: - probes: - enabled: true - show-details: always - endpoints: - jmx: - exposure: - exclude: "*" - web: - base-path: /monitor - exposure: - include: - - "health" - -file: - #sync-root-dir: D:/kamco-nfs/images/ - sync-root-dir: /kamco-nfs/images/ - sync-tmp-dir: ${file.sync-root-dir}/tmp - sync-file-extention: tfw,tif - sync-auto-exception-start-year: 2025 - sync-auto-exception-before-year-cnt: 3 - diff --git a/label/label-to-review/src/main/resources/static/download_progress_test.html b/label/label-to-review/src/main/resources/static/download_progress_test.html new file mode 100644 index 0000000..ab4c450 --- /dev/null +++ b/label/label-to-review/src/main/resources/static/download_progress_test.html @@ -0,0 +1,83 @@ + + + + + 라벨 ZIP 다운로드 + + +

라벨 ZIP 다운로드

+ +UUID: + +

+ +JWT Token: + +

+ + + +

+ +
+ + + +