diff --git a/gukyuin/pnu-update/.gradle/8.14/executionHistory/executionHistory.bin b/gukyuin/pnu-update/.gradle/8.14/executionHistory/executionHistory.bin
index b2f1be6..0088c3d 100644
Binary files a/gukyuin/pnu-update/.gradle/8.14/executionHistory/executionHistory.bin and b/gukyuin/pnu-update/.gradle/8.14/executionHistory/executionHistory.bin differ
diff --git a/gukyuin/pnu-update/.gradle/8.14/executionHistory/executionHistory.lock b/gukyuin/pnu-update/.gradle/8.14/executionHistory/executionHistory.lock
index 077aef9..087bfc1 100644
Binary files a/gukyuin/pnu-update/.gradle/8.14/executionHistory/executionHistory.lock and b/gukyuin/pnu-update/.gradle/8.14/executionHistory/executionHistory.lock differ
diff --git a/gukyuin/pnu-update/.gradle/8.14/fileHashes/fileHashes.bin b/gukyuin/pnu-update/.gradle/8.14/fileHashes/fileHashes.bin
index 93034a4..0a0cd9b 100644
Binary files a/gukyuin/pnu-update/.gradle/8.14/fileHashes/fileHashes.bin and b/gukyuin/pnu-update/.gradle/8.14/fileHashes/fileHashes.bin differ
diff --git a/gukyuin/pnu-update/.gradle/8.14/fileHashes/fileHashes.lock b/gukyuin/pnu-update/.gradle/8.14/fileHashes/fileHashes.lock
index 0c4960e..7326f74 100644
Binary files a/gukyuin/pnu-update/.gradle/8.14/fileHashes/fileHashes.lock and b/gukyuin/pnu-update/.gradle/8.14/fileHashes/fileHashes.lock differ
diff --git a/gukyuin/pnu-update/.gradle/8.14/fileHashes/resourceHashesCache.bin b/gukyuin/pnu-update/.gradle/8.14/fileHashes/resourceHashesCache.bin
index 2ea1283..69643ff 100644
Binary files a/gukyuin/pnu-update/.gradle/8.14/fileHashes/resourceHashesCache.bin and b/gukyuin/pnu-update/.gradle/8.14/fileHashes/resourceHashesCache.bin differ
diff --git a/gukyuin/pnu-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/gukyuin/pnu-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock
index b58ffba..15297f4 100644
Binary files a/gukyuin/pnu-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/gukyuin/pnu-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/gukyuin/pnu-update/.gradle/buildOutputCleanup/outputFiles.bin b/gukyuin/pnu-update/.gradle/buildOutputCleanup/outputFiles.bin
index 9613d23..87b74b3 100644
Binary files a/gukyuin/pnu-update/.gradle/buildOutputCleanup/outputFiles.bin and b/gukyuin/pnu-update/.gradle/buildOutputCleanup/outputFiles.bin differ
diff --git a/gukyuin/pnu-update/.gradle/file-system.probe b/gukyuin/pnu-update/.gradle/file-system.probe
index 54bd075..1d779fb 100644
Binary files a/gukyuin/pnu-update/.gradle/file-system.probe and b/gukyuin/pnu-update/.gradle/file-system.probe differ
diff --git a/gukyuin/pnu-update/.idea/.gitignore b/gukyuin/pnu-update/.idea/.gitignore
new file mode 100644
index 0000000..c3f502a
--- /dev/null
+++ b/gukyuin/pnu-update/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 디폴트 무시된 파일
+/shelf/
+/workspace.xml
+# 에디터 기반 HTTP 클라이언트 요청
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/gukyuin/pnu-update/.idea/.name b/gukyuin/pnu-update/.idea/.name
new file mode 100644
index 0000000..f085b82
--- /dev/null
+++ b/gukyuin/pnu-update/.idea/.name
@@ -0,0 +1 @@
+kamco-pnu-update-job
\ No newline at end of file
diff --git a/gukyuin/pnu-update/.idea/compiler.xml b/gukyuin/pnu-update/.idea/compiler.xml
new file mode 100644
index 0000000..3536884
--- /dev/null
+++ b/gukyuin/pnu-update/.idea/compiler.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gukyuin/pnu-update/.idea/gradle.xml b/gukyuin/pnu-update/.idea/gradle.xml
new file mode 100644
index 0000000..ce1c62c
--- /dev/null
+++ b/gukyuin/pnu-update/.idea/gradle.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gukyuin/pnu-update/.idea/misc.xml b/gukyuin/pnu-update/.idea/misc.xml
new file mode 100644
index 0000000..ab8d4ac
--- /dev/null
+++ b/gukyuin/pnu-update/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gukyuin/pnu-update/.idea/modules.xml b/gukyuin/pnu-update/.idea/modules.xml
new file mode 100644
index 0000000..7a17569
--- /dev/null
+++ b/gukyuin/pnu-update/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gukyuin/pnu-update/.idea/modules/kamco-pnu-update-job.main.iml b/gukyuin/pnu-update/.idea/modules/kamco-pnu-update-job.main.iml
new file mode 100644
index 0000000..afc1871
--- /dev/null
+++ b/gukyuin/pnu-update/.idea/modules/kamco-pnu-update-job.main.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/RestTemplateConfig.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/RestTemplateConfig.class
new file mode 100644
index 0000000..af8bfce
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/RestTemplateConfig.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ApiResponseCode.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ApiResponseCode.class
new file mode 100644
index 0000000..2219089
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ApiResponseCode.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$Error.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$Error.class
new file mode 100644
index 0000000..d41d4bb
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$Error.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ResponseObj.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ResponseObj.class
new file mode 100644
index 0000000..1958e9a
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ResponseObj.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto.class
new file mode 100644
index 0000000..6eec4e3
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ReqInfo.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ReqInfo.class
new file mode 100644
index 0000000..4c6294b
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ReqInfo.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultLabelDto.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultLabelDto.class
new file mode 100644
index 0000000..e65d3c4
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultLabelDto.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$StbltResult.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$StbltResult.class
new file mode 100644
index 0000000..6bf6277
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$StbltResult.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.class
index 76ff8b4..3419471 100644
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.class and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RemoveResDto.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RemoveResDto.class
new file mode 100644
index 0000000..15e965d
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RemoveResDto.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.class
index ebe4afa..74c7f0e 100644
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.class and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.class
new file mode 100644
index 0000000..f649cb8
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuJobCoreService.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuJobCoreService.class
index 6608e0a..01673ce 100644
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuJobCoreService.class and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuJobCoreService.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class
index b910f80..75cc76b 100644
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class
index 487388e..98b5812 100644
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.class
index 637fcac..dbe76a0 100644
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.class and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.class
index bab8207..04c84fc 100644
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.class and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryCustom.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryCustom.class
index 5e7ee13..70c1434 100644
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryCustom.class and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryCustom.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryImpl.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryImpl.class
index 413eeb2..5ed528c 100644
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryImpl.class and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryImpl.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.class
new file mode 100644
index 0000000..f7119d1
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.class
new file mode 100644
index 0000000..b4a6030
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.class
new file mode 100644
index 0000000..e4f57f1
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$AddMapReq.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$AddMapReq.class
new file mode 100644
index 0000000..f29388c
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$AddMapReq.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Basic.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Basic.class
new file mode 100644
index 0000000..7c5c3fd
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Basic.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapList.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapList.class
new file mode 100644
index 0000000..afee85a
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapList.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity$MapListEntityBuilder.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity$MapListEntityBuilder.class
new file mode 100644
index 0000000..55035ee
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity$MapListEntityBuilder.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity.class
new file mode 100644
index 0000000..09c41b8
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Search5kReq.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Search5kReq.class
new file mode 100644
index 0000000..a7f4847
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Search5kReq.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$UseInferReq.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$UseInferReq.class
new file mode 100644
index 0000000..6a9be6d
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$UseInferReq.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$searchReq.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$searchReq.class
new file mode 100644
index 0000000..911727c
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$searchReq.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.class
new file mode 100644
index 0000000..d876673
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/service/GukYuinApiPnuJobService.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/service/GukYuinApiPnuJobService.class
deleted file mode 100644
index 5561548..0000000
Binary files a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/service/GukYuinApiPnuJobService.class and /dev/null differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiPnuJobService.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiPnuJobService.class
new file mode 100644
index 0000000..a45120f
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiPnuJobService.class differ
diff --git a/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiService.class b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiService.class
new file mode 100644
index 0000000..d2e40f7
Binary files /dev/null and b/gukyuin/pnu-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiService.class differ
diff --git a/gukyuin/pnu-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.java b/gukyuin/pnu-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.java
index ed1b33c..06510ac 100644
--- a/gukyuin/pnu-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.java
+++ b/gukyuin/pnu-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.java
@@ -22,18 +22,86 @@ public class QPnuEntity extends EntityPathBase {
public static final QPnuEntity pnuEntity = new QPnuEntity("pnuEntity");
- public final DateTimePath createdDttm = createDateTime("createdDttm", java.time.OffsetDateTime.class);
+ public final StringPath afClsCd = createString("afClsCd");
+
+ public final StringPath afClsProb = createString("afClsProb");
+
+ public final StringPath bfClsCd = createString("bfClsCd");
+
+ public final StringPath bfClsProb = createString("bfClsProb");
+
+ public final StringPath chgDt = createString("chgDt");
+
+ public final StringPath chgEpno = createString("chgEpno");
+
+ public final StringPath chgIp = createString("chgIp");
+
+ public final StringPath chgYn = createString("chgYn");
+
+ public final StringPath chnCd = createString("chnCd");
+
+ public final StringPath chnDtctContId = createString("chnDtctContId");
+
+ public final StringPath chnDtctId = createString("chnDtctId");
+
+ public final StringPath chnDtctMstId = createString("chnDtctMstId");
+
+ public final StringPath chnDtctObjtId = createString("chnDtctObjtId");
+
+ public final StringPath chnDtctProb = createString("chnDtctProb");
+
+ public final StringPath chnDtctSno = createString("chnDtctSno");
+
+ public final StringPath chnDtctSqms = createString("chnDtctSqms");
+
+ public final StringPath cprsYr = createString("cprsYr");
+
+ public final DateTimePath createdDttm = createDateTime("createdDttm", java.time.ZonedDateTime.class);
public final NumberPath createdUid = createNumber("createdUid", Long.class);
+ public final StringPath crtDt = createString("crtDt");
+
+ public final StringPath crtEpno = createString("crtEpno");
+
+ public final StringPath crtIp = createString("crtIp");
+
+ public final StringPath crtrYr = createString("crtrYr");
+
public final BooleanPath delYn = createBoolean("delYn");
public final QMapSheetAnalDataInferenceGeomEntity geo;
public final NumberPath id = createNumber("id", Long.class);
+ public final StringPath incyCd = createString("incyCd");
+
+ public final StringPath incyRsnCont = createString("incyRsnCont");
+
+ public final StringPath lblYn = createString("lblYn");
+
+ public final StringPath lockYn = createString("lockYn");
+
+ public final StringPath lrmSyncYmd = createString("lrmSyncYmd");
+
+ public final StringPath mpqdNo = createString("mpqdNo");
+
public final StringPath pnu = createString("pnu");
+ public final StringPath pnuDtctId = createString("pnuDtctId");
+
+ public final StringPath pnuDtctSqms = createString("pnuDtctSqms");
+
+ public final StringPath pnuSqms = createString("pnuSqms");
+
+ public final StringPath pnuSyncYmd = createString("pnuSyncYmd");
+
+ public final StringPath rmk = createString("rmk");
+
+ public final StringPath rsatctNo = createString("rsatctNo");
+
+ public final StringPath stbltYn = createString("stbltYn");
+
public QPnuEntity(String variable) {
this(PnuEntity.class, forVariable(variable), INITS);
}
diff --git a/gukyuin/pnu-update/build/libs/pnu-update.jar b/gukyuin/pnu-update/build/libs/pnu-update.jar
index 9dd0127..b43a305 100644
Binary files a/gukyuin/pnu-update/build/libs/pnu-update.jar and b/gukyuin/pnu-update/build/libs/pnu-update.jar differ
diff --git a/gukyuin/pnu-update/build/reports/problems/problems-report.html b/gukyuin/pnu-update/build/reports/problems/problems-report.html
index 7ee1a2a..5efb93a 100644
--- a/gukyuin/pnu-update/build/reports/problems/problems-report.html
+++ b/gukyuin/pnu-update/build/reports/problems/problems-report.html
@@ -650,7 +650,7 @@ code + .copy-button {
diff --git a/gukyuin/pnu-update/build/resources/main/application-dev.yml b/gukyuin/pnu-update/build/resources/main/application-dev.yml
new file mode 100644
index 0000000..d7611e7
--- /dev/null
+++ b/gukyuin/pnu-update/build/resources/main/application-dev.yml
@@ -0,0 +1,136 @@
+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/gukyuin/pnu-update/build/resources/main/application-local.yml b/gukyuin/pnu-update/build/resources/main/application-local.yml
new file mode 100644
index 0000000..cb09429
--- /dev/null
+++ b/gukyuin/pnu-update/build/resources/main/application-local.yml
@@ -0,0 +1,114 @@
+spring:
+ config:
+ activate:
+ on-profile: local
+
+ jpa:
+ show-sql: false
+ hibernate:
+ ddl-auto: validate # 로컬만 완화(시킬려면 update으로 변경)
+ properties:
+ hibernate:
+ default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지
+ order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지
+ use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용)
+ format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성)
+
+ datasource:
+ url: jdbc:postgresql://192.168.2.127:15432/kamco_cds
+ # url: jdbc:postgresql://localhost:5432/local_0128
+ username: kamco_cds
+ password: kamco_cds_Q!W@E#R$
+ # username: postgres
+ # password: 1234
+ hikari:
+ minimum-idle: 1
+ maximum-pool-size: 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일
+
+token:
+ refresh-cookie-name: kamco-local # 개발용 쿠키 이름
+ refresh-cookie-secure: false # 로컬 http 테스트면 false
+
+springdoc:
+ swagger-ui:
+ persist-authorization: true # 스웨거 새로고침해도 토큰 유지, 로컬스토리지에 저장
+
+logging:
+ level:
+ org.hibernate.SQL: debug
+ org.hibernate.orm.jdbc.bind: trace
+
+mapsheet:
+ upload:
+ skipGdalValidation: true
+ shp:
+ baseurl: /Users/bokmin/detect/result
+
+
+
+file:
+ sync-root-dir: C:/Users/gypark/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
+
+ dataset-dir: C:/Users/gypark/kamco-nfs/dataset/
+ #dataset-dir: /kamco-nfs/dataset/export/
+ dataset-tmp-dir: ${file.dataset-dir}tmp/
+
+ model-dir: C:/Users/gypark/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/classification/
+ pt-FileName: v5-best.pt
+
+ dataset-response: /kamco-nfs/dataset/response/
+
+inference:
+ url: http://10.100.0.11:8000/jobs
+ batch-url: http://10.100.0.11:8000/batches
+ geojson-dir: /kamco-nfs/requests/
+ jar-path: jar/makeshp-1.0.0.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/model_output/labeling/
+
+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/gukyuin/pnu-update/build/resources/main/application-prod.yml b/gukyuin/pnu-update/build/resources/main/application-prod.yml
new file mode 100644
index 0000000..471febd
--- /dev/null
+++ b/gukyuin/pnu-update/build/resources/main/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/gukyuin/pnu-update/build/resources/main/application.yml b/gukyuin/pnu-update/build/resources/main/application.yml
index 5d1aadc..12f24e0 100644
--- a/gukyuin/pnu-update/build/resources/main/application.yml
+++ b/gukyuin/pnu-update/build/resources/main/application.yml
@@ -1,4 +1,8 @@
server:
- port: 9080
-
+ port: 8080
+spring:
+ application:
+ name: kamco-pnu-update-job
+ profiles:
+ active: prod # 사용할 프로파일 지정 (ex. dev, prod, test)
diff --git a/gukyuin/pnu-update/build/resources/main/application_dev.yml b/gukyuin/pnu-update/build/resources/main/application_dev.yml
deleted file mode 100644
index 80d48c2..0000000
--- a/gukyuin/pnu-update/build/resources/main/application_dev.yml
+++ /dev/null
@@ -1,71 +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
-
-gukyuin:
- #url: http://localhost:8080
- url: http://192.168.2.129:5301
- cdi: ${gukyuin.url}/api/kcd/cdi
\ No newline at end of file
diff --git a/gukyuin/pnu-update/build/resources/main/application_local.yml b/gukyuin/pnu-update/build/resources/main/application_local.yml
deleted file mode 100644
index a5a4da3..0000000
--- a/gukyuin/pnu-update/build/resources/main/application_local.yml
+++ /dev/null
@@ -1,71 +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
-
-gukyuin:
- #url: http://localhost:8080
- url: http://192.168.2.129:5301
- cdi: ${gukyuin.url}/api/kcd/cdi
\ No newline at end of file
diff --git a/gukyuin/pnu-update/build/resources/main/application_prod.yml b/gukyuin/pnu-update/build/resources/main/application_prod.yml
deleted file mode 100644
index ea3d329..0000000
--- a/gukyuin/pnu-update/build/resources/main/application_prod.yml
+++ /dev/null
@@ -1,71 +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
-
-gukyuin:
- #url: http://localhost:8080
- url: http://192.168.2.129:5301
- cdi: ${gukyuin.url}/api/kcd/cdi
\ No newline at end of file
diff --git a/gukyuin/pnu-update/build/tmp/compileJava/previous-compilation-data.bin b/gukyuin/pnu-update/build/tmp/compileJava/previous-compilation-data.bin
index aecf611..c56429a 100644
Binary files a/gukyuin/pnu-update/build/tmp/compileJava/previous-compilation-data.bin and b/gukyuin/pnu-update/build/tmp/compileJava/previous-compilation-data.bin differ
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/config/RestTemplateConfig.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/config/RestTemplateConfig.java
new file mode 100644
index 0000000..c1e1a87
--- /dev/null
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/config/RestTemplateConfig.java
@@ -0,0 +1,15 @@
+package com.kamco.cd.kamcoback.config;
+
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+
+ @Bean
+ public RestTemplate restTemplate(RestTemplateBuilder builder) {
+ return builder.build();
+ }
+}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseDto.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseDto.java
new file mode 100644
index 0000000..c32c958
--- /dev/null
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseDto.java
@@ -0,0 +1,223 @@
+package com.kamco.cd.kamcoback.config.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.kamco.cd.kamcoback.common.utils.enums.EnumType;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.ToString;
+import org.springframework.http.HttpStatus;
+
+@Getter
+@ToString
+public class ApiResponseDto {
+
+ private T data;
+
+ @JsonInclude(JsonInclude.Include.NON_NULL)
+ private Error error;
+
+ @JsonInclude(JsonInclude.Include.NON_NULL)
+ private T errorData;
+
+ @JsonIgnore private HttpStatus httpStatus;
+
+ @JsonIgnore private Long errorLogUid;
+
+ public ApiResponseDto(T data) {
+ this.data = data;
+ }
+
+ private ApiResponseDto(T data, HttpStatus httpStatus) {
+ this.data = data;
+ this.httpStatus = httpStatus;
+ }
+
+ public ApiResponseDto(ApiResponseCode code) {
+ this.error = new Error(code.getId(), code.getMessage());
+ }
+
+ public ApiResponseDto(ApiResponseCode code, String message) {
+ this.error = new Error(code.getId(), message);
+ }
+
+ public ApiResponseDto(ApiResponseCode code, String message, HttpStatus httpStatus) {
+ this.error = new Error(code.getId(), message);
+ this.httpStatus = httpStatus;
+ }
+
+ public ApiResponseDto(
+ ApiResponseCode code, String message, HttpStatus httpStatus, Long errorLogUid) {
+ this.error = new Error(code.getId(), message);
+ this.httpStatus = httpStatus;
+ this.errorLogUid = errorLogUid;
+ }
+
+ public ApiResponseDto(ApiResponseCode code, String message, T errorData) {
+ this.error = new Error(code.getId(), message);
+ this.errorData = errorData;
+ }
+
+ // HTTP 상태 코드가 내장된 ApiResponseDto 반환 메서드들
+ public static ApiResponseDto createOK(T data) {
+ return new ApiResponseDto<>(data, HttpStatus.CREATED);
+ }
+
+ public static ApiResponseDto ok(T data) {
+ return new ApiResponseDto<>(data, HttpStatus.OK);
+ }
+
+ public static ApiResponseDto okObject(ResponseObj data) {
+ if (data.getCode().equals(ApiResponseCode.OK)) {
+ return new ApiResponseDto<>(data, HttpStatus.NO_CONTENT);
+ } else {
+ return new ApiResponseDto<>(data.getCode(), data.getMessage(), HttpStatus.CONFLICT);
+ }
+ }
+
+ public static ApiResponseDto deleteOk(T data) {
+ return new ApiResponseDto<>(data, HttpStatus.NO_CONTENT);
+ }
+
+ public static ApiResponseDto createException(ApiResponseCode code) {
+ return new ApiResponseDto<>(code);
+ }
+
+ public static ApiResponseDto createException(ApiResponseCode code, String message) {
+ return new ApiResponseDto<>(code, message);
+ }
+
+ public static ApiResponseDto createException(
+ ApiResponseCode code, String message, HttpStatus httpStatus) {
+ return new ApiResponseDto<>(code, message, httpStatus);
+ }
+
+ public static ApiResponseDto createException(
+ ApiResponseCode code, String message, HttpStatus httpStatus, Long errorLogUid) {
+ return new ApiResponseDto<>(code, message, httpStatus, errorLogUid);
+ }
+
+ public static ApiResponseDto createException(
+ ApiResponseCode code, String message, T data) {
+ return new ApiResponseDto<>(code, message, data);
+ }
+
+ @Getter
+ public static class Error {
+
+ private final String code;
+ private final String message;
+
+ public Error(String code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+ }
+
+ /** Error가 아닌 Business상 성공이거나 실패인 경우, 메세지 함께 전달하기 위한 object */
+ @Getter
+ public static class ResponseObj {
+
+ private final ApiResponseCode code;
+ private final String message;
+
+ public ResponseObj(ApiResponseCode code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+ }
+
+ @Getter
+ @RequiredArgsConstructor
+ public enum ApiResponseCode implements EnumType {
+
+ // @formatter:off
+ OK("요청이 성공하였습니다."),
+ BAD_REQUEST("요청 파라미터가 잘못되었습니다."),
+ BAD_GATEWAY("네트워크 상태가 불안정합니다."),
+ ALREADY_EXIST_MALL("이미 등록된 쇼핑센터입니다."),
+ NOT_FOUND_MAP("지도를 찾을 수 없습니다."),
+ UNAUTHORIZED("권한이 없습니다."),
+ CONFLICT("이미 등록된 컨텐츠입니다."),
+ NOT_FOUND("Resource를 찾을 수 없습니다."),
+ NOT_FOUND_DATA("데이터를 찾을 수 없습니다."),
+ NOT_FOUND_WEATHER_DATA("날씨 데이터를 찾을 수 없습니다."),
+ FAIL_SEND_MESSAGE("메시지를 전송하지 못했습니다."),
+ TOO_MANY_CONNECTED_MACHINES("연결된 기기가 너무 많습니다."),
+ UNAUTHENTICATED("인증에 실패하였습니다."),
+ INVALID_TOKEN("잘못된 토큰입니다."),
+ EXPIRED_TOKEN("만료된 토큰입니다."),
+ INTERNAL_SERVER_ERROR("서버에 문제가 발생 하였습니다."),
+ FORBIDDEN("권한을 확인해주세요."),
+ INVALID_PASSWORD("잘못된 비밀번호 입니다."),
+ NOT_FOUND_CAR_IN("입차정보가 없습니다."),
+ WRONG_STATUS("잘못된 상태입니다."),
+ FAIL_VERIFICATION("인증에 실패하였습니다."),
+ INVALID_EMAIL("잘못된 형식의 이메일입니다."),
+ REQUIRED_EMAIL("이메일은 필수 항목입니다."),
+ WRONG_PASSWORD("잘못된 패스워드입니다."),
+ DUPLICATE_EMAIL("이미 가입된 이메일입니다."),
+ DUPLICATE_DATA("이미 등록되어 있습니다."),
+ DATA_INTEGRITY_ERROR("데이터 무결성이 위반되어 요청을 처리할수 없습니다."),
+ FOREIGN_KEY_ERROR("참조 중인 데이터가 있어 삭제할 수 없습니다."),
+ DUPLICATE_EMPLOYEEID("이미 가입된 사번입니다."),
+ NOT_FOUND_USER_FOR_EMAIL("이메일로 유저를 찾을 수 없습니다."),
+ NOT_FOUND_USER("사용자를 찾을 수 없습니다."),
+ UNPROCESSABLE_ENTITY("이 데이터는 삭제할 수 없습니다."),
+ LOGIN_ID_NOT_FOUND("아이디를 잘못 입력하셨습니다."),
+ LOGIN_PASSWORD_MISMATCH("비밀번호를 잘못 입력하셨습니다."),
+ LOGIN_PASSWORD_EXCEEDED("비밀번호 오류 횟수를 초과하여 이용하실 수 없습니다.\n로그인 오류에 대해 관리자에게 문의하시기 바랍니다."),
+ INACTIVE_ID("사용할 수 없는 계정입니다."),
+ INVALID_EMAIL_TOKEN(
+ "You can only reset your password within 24 hours from when the email was sent.\n"
+ + "To reset your password again, please submit a new request through \"Forgot"
+ + " Password.\""),
+ PAYLOAD_TOO_LARGE("업로드 용량 제한을 초과했습니다."),
+ NOT_FOUND_TARGET_YEAR("기준년도 도엽을 찾을 수 없습니다."),
+ NOT_FOUND_COMPARE_YEAR("비교년도 도엽을 찾을 수 없습니다."),
+ FAIL_SAVE_MAP_SHEET("도엽 저장 중 오류가 발생했습니다."),
+ FAIL_CREATE_MAP_SHEET_FILE("도엽 설정파일 생성 중 오류가 발생했습니다."),
+ ;
+ // @formatter:on
+ private final String message;
+
+ @Override
+ public String getId() {
+ return name();
+ }
+
+ @Override
+ public String getText() {
+ return message;
+ }
+
+ public static ApiResponseCode getCode(String name) {
+ return ApiResponseCode.valueOf(name.toUpperCase());
+ }
+
+ public static String getMessage(String name) {
+ return ApiResponseCode.valueOf(name.toUpperCase()).getText();
+ }
+
+ public static ApiResponseCode from(String codeName, HttpStatus status) {
+
+ if (codeName != null && !codeName.isBlank()) {
+ try {
+ return ApiResponseCode.valueOf(codeName.toUpperCase());
+ } catch (IllegalArgumentException ignore) {
+ // fallback
+ }
+ }
+
+ if (status != null) {
+ try {
+ return ApiResponseCode.valueOf(status.name());
+ } catch (IllegalArgumentException ignore) {
+ // fallback
+ }
+ }
+
+ return INTERNAL_SERVER_ERROR;
+ }
+ }
+}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.java
index 57df805..1e11806 100644
--- a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.java
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.java
@@ -114,4 +114,38 @@ public class ChngDetectContDto {
private List result;
private Boolean success;
}
+
+ @Schema(name = "ResultLabelDto", description = "ResultLabelDto list 리턴 형태")
+ @Getter
+ @Setter
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class ResultLabelDto {
+
+ private Integer code;
+ private String message;
+ private DtoPnuDetectMpng result;
+ private Boolean success;
+ }
+
+ @Getter
+ @Setter
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class ReqInfo {
+
+ private String reqIp;
+ private String reqEpno;
+ }
+
+ @Getter
+ @Setter
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class StbltResult {
+
+ private String stbltYn;
+ private String incyCd;
+ private String incyCmnt;
+ }
}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.java
index 644b77b..67ab78d 100644
--- a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.java
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.java
@@ -247,45 +247,58 @@ public class ChngDetectMastDto {
@AllArgsConstructor
public static class RlbDtctMastDto {
- private String pnuDtctId;
- private String pnu;
- private String lrmSyncYmd;
- private String pnuSyncYmd;
- private String mpqdNo; // 도엽번호
+ private String pnuDtctId; // PNU탐지ID
+ private String pnu; // PNU코드(19자리)
+ private String lrmSyncYmd; // 지적도동기화일자(YYYYMMDD)
+ private String pnuSyncYmd; // PNU동기화일자(YYYYMMDD)
+ private String mpqdNo; // 도곽번호
private String cprsYr; // 비교년도
private String crtrYr; // 기준년도
- private String chnDtctSno; // 회차
- private String chnDtctId;
+ private String chnDtctSno; // 회차, 변화탐지순번
+ private String chnDtctId; // 변화탐지ID(UUID)
- private String chnDtctMstId;
- private String chnDtctObjtId;
- private String chnDtctContId;
- private String chnCd;
- private String chnDtctProb;
+ private String chnDtctMstId; // 변화탐지마스터ID
+ private String chnDtctObjtId; // 변화탐지객체ID
+ private String chnDtctContId; // 변화탐지내용ID
+ private String chnCd; // 변화코드
+ private String chnDtctProb; // 변화탐지정확도(0~1)
private String bfClsCd; // 이전분류코드
- private String bfClsProb; // 이전분류정확도
+ private String bfClsProb; // 이전분류정확도(0~1)
private String afClsCd; // 이후분류코드
- private String afClsProb; // 이후분류정확도
+ private String afClsProb; // 이후분류정확도(0~1)
- private String pnuSqms;
- private String pnuDtctSqms;
- private String chnDtctSqms;
- private String stbltYn;
- private String incyCd;
- private String incyRsnCont;
- private String lockYn;
- private String lblYn;
- private String chgYn;
- private String rsatctNo;
- private String rmk;
+ private String pnuSqms; // PNU면적(㎡)
+ private String pnuDtctSqms; // PNU탐지면적(㎡)
+ private String chnDtctSqms; // 변화탐지면적(㎡)
+ private String stbltYn; // 적합여부(Y/N) - 안정성 (Y:부적합, N:적합)
+ private String incyCd; // 부적합코드
+ private String incyRsnCont; // 부적합사유내용
+ private String lockYn; // 잠금여부(Y/N)
+ private String lblYn; // 라벨여부(Y/N)
+ private String chgYn; // 변경여부(Y/N)
+ private String rsatctNo; // 부동산등기번호
+ private String rmk; // 비고
private String crtDt; // 생성일시
private String crtEpno; // 생성사원번호
private String crtIp; // 생성사원아이피
- private String chgDt;
- private String chgEpno;
- private String chgIp;
+ private String chgDt; // 변경일시
+ private String chgEpno; // 변경자사번
+ private String chgIp; // 변경자IP
private String delYn; // 삭제여부
}
+
+ @Schema(name = "RemoveResDto", description = "remove 후 리턴 형태")
+ @Getter
+ @Setter
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class RemoveResDto {
+
+ private Integer code;
+ private String message;
+ private Boolean result;
+ private Boolean success;
+ }
}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java
new file mode 100644
index 0000000..ec0f0f6
--- /dev/null
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java
@@ -0,0 +1,67 @@
+package com.kamco.cd.kamcoback.postgres.core;
+
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.Basic;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LabelSendDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.LearnInfo;
+import com.kamco.cd.kamcoback.postgres.repository.gukyuin.GukYuinRepository;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.UUID;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class GukYuinCoreService {
+
+ private final GukYuinRepository gukYuinRepository;
+
+ public void updateGukYuinMastRegResult(Basic resultBody) {
+ gukYuinRepository.updateGukYuinMastRegResult(resultBody);
+ }
+
+ public void updateGukYuinMastRegRemove(String chnDtctId) {
+ gukYuinRepository.updateGukYuinMastRegRemove(chnDtctId);
+ }
+
+ public void updateInferenceGeomDataPnuCnt(String chnDtctObjtId, long pnuCnt) {
+ gukYuinRepository.updateInferenceGeomDataPnuCnt(chnDtctObjtId, pnuCnt);
+ }
+
+ public Long findMapSheetAnalDataInferenceGeomUid(String chnDtctObjtId) {
+ return gukYuinRepository.findMapSheetAnalDataInferenceGeomUid(chnDtctObjtId);
+ }
+
+ public void insertGeoUidPnuData(Long geoUid, String[] pnuList, String chnDtctObjtId) {
+ gukYuinRepository.insertGeoUidPnuData(geoUid, pnuList, chnDtctObjtId);
+ }
+
+ public LearnInfo findMapSheetLearnInfo(UUID uuid) {
+ return gukYuinRepository.findMapSheetLearnInfo(uuid);
+ }
+
+ public Integer findMapSheetLearnYearStage(Integer compareYyyy, Integer targetYyyy) {
+ return gukYuinRepository.findMapSheetLearnYearStage(compareYyyy, targetYyyy);
+ }
+
+ public void updateAnalInferenceApplyDttm(Basic registRes) {
+ gukYuinRepository.updateAnalInferenceApplyDttm(registRes);
+ }
+
+ public List findLabelingCompleteSendList(LocalDate yesterday) {
+ return gukYuinRepository.findLabelingCompleteSendList(yesterday);
+ }
+
+ public Long findMapSheetLearnInfoByYyyy(
+ Integer compareYyyy, Integer targetYyyy, Integer maxStage) {
+ return gukYuinRepository.findMapSheetLearnInfoByYyyy(compareYyyy, targetYyyy, maxStage);
+ }
+
+ public void updateMapSheetLearnGukyuinEndStatus(Long learnId) {
+ gukYuinRepository.updateMapSheetLearnGukyuinEndStatus(learnId);
+ }
+
+ public void updateMapSheetInferenceLabelEndStatus(Long learnId) {
+ gukYuinRepository.updateMapSheetInferenceLabelEndStatus(learnId);
+ }
+}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuJobCoreService.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuJobCoreService.java
index 1b32d43..0d83603 100644
--- a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuJobCoreService.java
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuJobCoreService.java
@@ -5,6 +5,7 @@ import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinStatus;
import com.kamco.cd.kamcoback.postgres.repository.gukyuin.GukYuinPnuJobRepository;
import java.util.List;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
@Service
public class GukYuinPnuJobCoreService {
@@ -27,6 +28,7 @@ public class GukYuinPnuJobCoreService {
return gukYuinPnuRepository.upsertMapSheetDataAnalGeomPnu(chnDtctObjtId, pnuList);
}
+ @Transactional
public void updateInferenceGeomDataPnuCnt(String chnDtctObjtId, long pnuCnt) {
gukYuinPnuRepository.updateInferenceGeomDataPnuCnt(chnDtctObjtId, pnuCnt);
}
@@ -35,7 +37,8 @@ public class GukYuinPnuJobCoreService {
return gukYuinPnuRepository.findMapSheetAnalDataInferenceGeomUid(chnDtctObjtId);
}
- public void insertGeoUidPnuData(Long geoUid, String[] pnuList) {
- gukYuinPnuRepository.insertGeoUidPnuData(geoUid, pnuList);
+ @Transactional
+ public void insertGeoUidPnuData(Long geoUid, String[] pnuList, String chnDtctObjtId) {
+ gukYuinPnuRepository.insertGeoUidPnuData(geoUid, pnuList, chnDtctObjtId);
}
}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java
index c483e5c..39b2de4 100644
--- a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java
@@ -1,5 +1,6 @@
package com.kamco.cd.kamcoback.postgres.entity;
+import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
@@ -45,4 +46,8 @@ public class MapInkx50kEntity extends CommonDateEntity {
this.mapidNo = mapidNo;
this.geom = geom;
}
+
+ public MapSheet toEntity() {
+ return new MapSheet(mapidcdNo, mapidNm);
+ }
}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java
index 3246924..5efc3df 100644
--- a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java
@@ -3,6 +3,7 @@ package com.kamco.cd.kamcoback.postgres.entity;
import com.kamco.cd.kamcoback.enums.CommonUseStatus;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet;
+import com.kamco.cd.kamcoback.scene.dto.MapInkxMngDto.MapListEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
@@ -53,10 +54,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 +69,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/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.java
index 46daada..26f9c8e 100644
--- a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.java
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.java
@@ -12,7 +12,7 @@ import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
-import java.time.OffsetDateTime;
+import java.time.ZonedDateTime;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
@@ -39,7 +39,7 @@ public class PnuEntity {
private String pnu;
@Column(name = "created_dttm")
- private OffsetDateTime createdDttm;
+ private ZonedDateTime createdDttm;
@Column(name = "created_uid")
private Long createdUid;
@@ -47,4 +47,140 @@ public class PnuEntity {
@ColumnDefault("false")
@Column(name = "del_yn")
private Boolean delYn;
+
+ @Size(max = 40)
+ @Column(name = "pnu_dtct_id", length = 40)
+ private String pnuDtctId;
+
+ @Size(max = 10)
+ @Column(name = "lrm_sync_ymd", length = 10)
+ private String lrmSyncYmd;
+
+ @Size(max = 10)
+ @Column(name = "pnu_sync_ymd", length = 10)
+ private String pnuSyncYmd;
+
+ @Size(max = 20)
+ @Column(name = "mpqd_no", length = 20)
+ private String mpqdNo;
+
+ @Size(max = 10)
+ @Column(name = "cprs_yr", length = 10)
+ private String cprsYr;
+
+ @Size(max = 10)
+ @Column(name = "crtr_yr", length = 10)
+ private String crtrYr;
+
+ @Size(max = 255)
+ @Column(name = "chn_dtct_id")
+ private String chnDtctId;
+
+ @Size(max = 10)
+ @Column(name = "chn_dtct_mst_id", length = 10)
+ private String chnDtctMstId;
+
+ @Size(max = 255)
+ @Column(name = "chn_dtct_objt_id")
+ private String chnDtctObjtId;
+
+ @Size(max = 255)
+ @Column(name = "chn_dtct_cont_id")
+ private String chnDtctContId;
+
+ @Size(max = 50)
+ @Column(name = "chn_cd", length = 50)
+ private String chnCd;
+
+ @Size(max = 50)
+ @Column(name = "chn_dtct_prob", length = 50)
+ private String chnDtctProb;
+
+ @Size(max = 50)
+ @Column(name = "bf_cls_cd", length = 50)
+ private String bfClsCd;
+
+ @Size(max = 50)
+ @Column(name = "bf_cls_prob", length = 50)
+ private String bfClsProb;
+
+ @Size(max = 50)
+ @Column(name = "af_cls_cd", length = 50)
+ private String afClsCd;
+
+ @Size(max = 50)
+ @Column(name = "af_cls_prob", length = 50)
+ private String afClsProb;
+
+ @Size(max = 100)
+ @Column(name = "pnu_sqms", length = 100)
+ private String pnuSqms;
+
+ @Size(max = 100)
+ @Column(name = "pnu_dtct_sqms", length = 100)
+ private String pnuDtctSqms;
+
+ @Size(max = 100)
+ @Column(name = "chn_dtct_sqms", length = 100)
+ private String chnDtctSqms;
+
+ @Size(max = 1)
+ @Column(name = "stblt_yn", length = 1)
+ private String stbltYn;
+
+ @Size(max = 30)
+ @Column(name = "incy_cd", length = 30)
+ private String incyCd;
+
+ @Size(max = 255)
+ @Column(name = "incy_rsn_cont")
+ private String incyRsnCont;
+
+ @Size(max = 1)
+ @Column(name = "lock_yn", length = 1)
+ private String lockYn;
+
+ @Size(max = 1)
+ @Column(name = "lbl_yn", length = 1)
+ private String lblYn;
+
+ @Size(max = 1)
+ @Column(name = "chg_yn", length = 1)
+ private String chgYn;
+
+ @Size(max = 50)
+ @Column(name = "rsatct_no", length = 50)
+ private String rsatctNo;
+
+ @Size(max = 100)
+ @Column(name = "rmk", length = 100)
+ private String rmk;
+
+ @Size(max = 20)
+ @Column(name = "crt_dt", length = 20)
+ private String crtDt;
+
+ @Size(max = 20)
+ @Column(name = "crt_epno", length = 20)
+ private String crtEpno;
+
+ @Size(max = 20)
+ @Column(name = "crt_ip", length = 20)
+ private String crtIp;
+
+ @Size(max = 20)
+ @Column(name = "chg_dt", length = 20)
+ private String chgDt;
+
+ @Size(max = 20)
+ @Column(name = "chg_epno", length = 20)
+ private String chgEpno;
+
+ @Size(max = 20)
+ @Column(name = "chg_ip", length = 20)
+ private String chgIp;
+
+ @Size(max = 10)
+ @Column(name = "chn_dtct_sno", length = 10)
+ private String chnDtctSno;
}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryCustom.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryCustom.java
index bb5b66c..de4d3b2 100644
--- a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryCustom.java
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryCustom.java
@@ -10,7 +10,7 @@ public interface GukYuinPnuJobRepositoryCustom {
Long findMapSheetAnalDataInferenceGeomUid(String chnDtctObjtId);
- void insertGeoUidPnuData(Long geoUid, String[] pnuList);
+ void insertGeoUidPnuData(Long geoUid, String[] pnuList, String chnDtctObjtId);
void updateGukYuinApplyStateComplete(Long id, GukYuinStatus status);
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryImpl.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryImpl.java
index 19eb94f..ae812a3 100644
--- a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryImpl.java
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuJobRepositoryImpl.java
@@ -6,6 +6,7 @@ import static com.kamco.cd.kamcoback.postgres.entity.QPnuEntity.pnuEntity;
import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LearnKeyDto;
import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinStatus;
+import com.kamco.cd.kamcoback.postgres.entity.PnuEntity;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
@@ -42,13 +43,21 @@ public class GukYuinPnuJobRepositoryImpl implements GukYuinPnuJobRepositoryCusto
}
@Override
- public void insertGeoUidPnuData(Long geoUid, String[] pnuList) {
+ public void insertGeoUidPnuData(Long geoUid, String[] pnuList, String chnDtctObjtId) {
for (String pnu : pnuList) {
- queryFactory
- .insert(pnuEntity)
- .columns(pnuEntity.geo.geoUid, pnuEntity.pnu, pnuEntity.createdDttm)
- .values(geoUid, pnu, ZonedDateTime.now())
- .execute();
+ PnuEntity entity =
+ queryFactory
+ .selectFrom(pnuEntity)
+ .where(pnuEntity.pnu.eq(pnu), pnuEntity.chnDtctObjtId.eq(chnDtctObjtId))
+ .fetchOne();
+ if (entity == null) {
+ queryFactory
+ .insert(pnuEntity)
+ .columns(
+ pnuEntity.geo.geoUid, pnuEntity.pnu, pnuEntity.createdDttm, pnuEntity.chnDtctObjtId)
+ .values(geoUid, pnu, ZonedDateTime.now(), chnDtctObjtId)
+ .execute();
+ }
}
}
@@ -87,8 +96,12 @@ public class GukYuinPnuJobRepositoryImpl implements GukYuinPnuJobRepositoryCusto
long result =
queryFactory
.insert(pnuEntity)
- .columns(pnuEntity.geo.geoUid, pnuEntity.pnu, pnuEntity.createdDttm)
- .values(geoUid, pnu, ZonedDateTime.now())
+ .columns(
+ pnuEntity.geo.geoUid,
+ pnuEntity.pnu,
+ pnuEntity.createdDttm,
+ pnuEntity.chnDtctObjtId)
+ .values(geoUid, pnu, ZonedDateTime.now(), chnDtctObjtId)
.execute();
if (result > 0) {
succCnt++;
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.java
new file mode 100644
index 0000000..83a1e07
--- /dev/null
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.java
@@ -0,0 +1,7 @@
+package com.kamco.cd.kamcoback.postgres.repository.gukyuin;
+
+import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface GukYuinRepository
+ extends JpaRepository, GukYuinRepositoryCustom {}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.java
new file mode 100644
index 0000000..84d92ff
--- /dev/null
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.java
@@ -0,0 +1,48 @@
+package com.kamco.cd.kamcoback.postgres.repository.gukyuin;
+
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.Basic;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LabelSendDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LearnKeyDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.GeomUidDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.LearnInfo;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinStatus;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.UUID;
+
+public interface GukYuinRepositoryCustom {
+
+ void updateGukYuinMastRegResult(Basic resultBody);
+
+ void updateGukYuinMastRegRemove(String chnDtctId);
+
+ void updateInferenceGeomDataPnuCnt(String chnDtctObjtId, long pnuCnt);
+
+ Long findMapSheetAnalDataInferenceGeomUid(String chnDtctObjtId);
+
+ void insertGeoUidPnuData(Long geoUid, String[] pnuList, String chnDtctObjtId);
+
+ void updateGukYuinApplyStateComplete(Long id, GukYuinStatus status);
+
+ List findGukyuinApplyStatusUidList(List gukYuinStatus);
+
+ long upsertMapSheetDataAnalGeomPnu(String uid, String[] pnuList);
+
+ LearnInfo findMapSheetLearnInfo(UUID uuid);
+
+ Integer findMapSheetLearnYearStage(Integer compareYyyy, Integer targetYyyy);
+
+ void updateAnalInferenceApplyDttm(Basic registRes);
+
+ List findYesterdayLabelingCompleteList();
+
+ void updateAnalDataInferenceGeomSendDttm(Long geoUid);
+
+ List findLabelingCompleteSendList(LocalDate yesterday);
+
+ Long findMapSheetLearnInfoByYyyy(Integer compareYyyy, Integer targetYyyy, Integer maxStage);
+
+ void updateMapSheetLearnGukyuinEndStatus(Long learnId);
+
+ void updateMapSheetInferenceLabelEndStatus(Long learnId);
+}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.java
new file mode 100644
index 0000000..d274d85
--- /dev/null
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.java
@@ -0,0 +1,331 @@
+package com.kamco.cd.kamcoback.postgres.repository.gukyuin;
+
+import static com.kamco.cd.kamcoback.postgres.entity.QLabelingAssignmentEntity.labelingAssignmentEntity;
+import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceGeomEntity.mapSheetAnalDataInferenceGeomEntity;
+import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity.mapSheetAnalInferenceEntity;
+import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity;
+import static com.kamco.cd.kamcoback.postgres.entity.QPnuEntity.pnuEntity;
+
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.Basic;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LabelSendDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LearnKeyDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.GeomUidDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.LearnInfo;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinStatus;
+import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.InspectState;
+import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.LabelMngState;
+import com.kamco.cd.kamcoback.postgres.entity.PnuEntity;
+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.NumberExpression;
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.transaction.Transactional;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.List;
+import java.util.UUID;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+@RequiredArgsConstructor
+public class GukYuinRepositoryImpl implements GukYuinRepositoryCustom {
+
+ private final JPAQueryFactory queryFactory;
+ @PersistenceContext private EntityManager em;
+
+ @Override
+ public void updateGukYuinMastRegResult(Basic resultBody) {
+
+ int excnPgrt = Integer.parseInt(resultBody.getExcnPgrt());
+ int stage = Integer.parseInt(resultBody.getChnDtctSno());
+ GukYuinStatus status = GukYuinStatus.IN_PROGRESS;
+ if (excnPgrt == 100) {
+ status = GukYuinStatus.GUK_COMPLETED;
+ }
+
+ queryFactory
+ .update(mapSheetLearnEntity)
+ .set(mapSheetLearnEntity.stage, stage)
+ .set(mapSheetLearnEntity.applyStatus, status.getId())
+ .set(mapSheetLearnEntity.applyStatusDttm, ZonedDateTime.now())
+ .set(mapSheetLearnEntity.chnDtctMstId, resultBody.getChnDtctMstId())
+ .set(mapSheetLearnEntity.applyYn, true)
+ .set(mapSheetLearnEntity.applyDttm, ZonedDateTime.now())
+ .where(mapSheetLearnEntity.uid.eq(resultBody.getChnDtctId()))
+ .execute();
+ }
+
+ @Override
+ public void updateGukYuinMastRegRemove(String chnDtctId) {
+ queryFactory
+ .update(mapSheetLearnEntity)
+ .set(mapSheetLearnEntity.applyStatus, GukYuinStatus.CANCELED.getId())
+ .set(mapSheetLearnEntity.applyStatusDttm, ZonedDateTime.now())
+ .set(mapSheetLearnEntity.applyYn, false)
+ .where(mapSheetLearnEntity.uid.eq(chnDtctId))
+ .execute();
+ }
+
+ @Override
+ public void updateInferenceGeomDataPnuCnt(String chnDtctObjtId, long pnuCnt) {
+ queryFactory
+ .update(mapSheetAnalDataInferenceGeomEntity)
+ .set(mapSheetAnalDataInferenceGeomEntity.pnu, pnuCnt)
+ .where(mapSheetAnalDataInferenceGeomEntity.resultUid.eq(chnDtctObjtId))
+ .execute();
+ }
+
+ @Override
+ public Long findMapSheetAnalDataInferenceGeomUid(String chnDtctObjtId) {
+ return queryFactory
+ .select(mapSheetAnalDataInferenceGeomEntity.geoUid)
+ .from(mapSheetAnalDataInferenceGeomEntity)
+ .where(mapSheetAnalDataInferenceGeomEntity.resultUid.eq(chnDtctObjtId))
+ .fetchOne();
+ }
+
+ @Override
+ public void insertGeoUidPnuData(Long geoUid, String[] pnuList, String chnDtctObjtId) {
+ for (String pnu : pnuList) {
+ PnuEntity entity =
+ queryFactory
+ .selectFrom(pnuEntity)
+ .where(
+ pnuEntity.geo.geoUid.eq(geoUid),
+ pnuEntity.pnu.eq(pnu),
+ pnuEntity.chnDtctObjtId.eq(chnDtctObjtId))
+ .fetchOne();
+
+ if (entity == null) {
+ queryFactory
+ .insert(pnuEntity)
+ .columns(
+ pnuEntity.geo.geoUid, pnuEntity.pnu, pnuEntity.createdDttm, pnuEntity.chnDtctObjtId)
+ .values(geoUid, pnu, ZonedDateTime.now(), chnDtctObjtId)
+ .execute();
+ }
+ }
+ }
+
+ @Override
+ public List findGukyuinApplyStatusUidList(List status) {
+ return queryFactory
+ .select(
+ Projections.constructor(
+ LearnKeyDto.class,
+ mapSheetLearnEntity.id,
+ mapSheetLearnEntity.uid,
+ mapSheetLearnEntity.chnDtctMstId))
+ .from(mapSheetLearnEntity)
+ .where(mapSheetLearnEntity.applyStatus.in(status))
+ .fetch();
+ }
+
+ @Override
+ public long upsertMapSheetDataAnalGeomPnu(String chnDtctObjtId, String[] pnuList) {
+ long length = pnuList.length;
+ queryFactory
+ .update(mapSheetAnalDataInferenceGeomEntity)
+ .set(mapSheetAnalDataInferenceGeomEntity.pnu, length)
+ .where(mapSheetAnalDataInferenceGeomEntity.resultUid.eq(chnDtctObjtId))
+ .execute();
+
+ Long geoUid =
+ queryFactory
+ .select(mapSheetAnalDataInferenceGeomEntity.geoUid)
+ .from(mapSheetAnalDataInferenceGeomEntity)
+ .where(mapSheetAnalDataInferenceGeomEntity.resultUid.eq(chnDtctObjtId))
+ .fetchOne();
+
+ long succCnt = 0;
+ for (String pnu : pnuList) {
+ long result =
+ queryFactory
+ .insert(pnuEntity)
+ .columns(pnuEntity.geo.geoUid, pnuEntity.pnu, pnuEntity.createdDttm)
+ .values(geoUid, pnu, ZonedDateTime.now())
+ .execute();
+ if (result > 0) {
+ succCnt++;
+ }
+ }
+ return succCnt;
+ }
+
+ @Override
+ public LearnInfo findMapSheetLearnInfo(UUID uuid) {
+ return queryFactory
+ .select(
+ Projections.constructor(
+ LearnInfo.class,
+ mapSheetLearnEntity.id,
+ mapSheetLearnEntity.uuid,
+ mapSheetLearnEntity.compareYyyy,
+ mapSheetLearnEntity.targetYyyy,
+ mapSheetLearnEntity.stage,
+ mapSheetLearnEntity.uid,
+ mapSheetLearnEntity.applyStatus,
+ mapSheetLearnEntity.applyYn))
+ .from(mapSheetLearnEntity)
+ .where(mapSheetLearnEntity.uuid.eq(uuid))
+ .fetchOne();
+ }
+
+ @Override
+ public Integer findMapSheetLearnYearStage(Integer compareYyyy, Integer targetYyyy) {
+ NumberExpression stageExpr =
+ Expressions.numberTemplate(Integer.class, "coalesce({0}, 0)", mapSheetLearnEntity.stage);
+
+ return queryFactory
+ .select(stageExpr.max().coalesce(0))
+ .from(mapSheetLearnEntity)
+ .where(
+ mapSheetLearnEntity.compareYyyy.eq(compareYyyy),
+ mapSheetLearnEntity.targetYyyy.eq(targetYyyy),
+ mapSheetLearnEntity.applyStatus.isNotNull(),
+ mapSheetLearnEntity.applyStatus.ne(GukYuinStatus.PENDING.getId()))
+ .fetchOne();
+ }
+
+ @Override
+ public void updateAnalInferenceApplyDttm(Basic registRes) {
+ Long learnId =
+ queryFactory
+ .select(mapSheetLearnEntity.id)
+ .from(mapSheetLearnEntity)
+ .where(mapSheetLearnEntity.uid.eq(registRes.getChnDtctId()))
+ .fetchOne();
+
+ queryFactory
+ .update(mapSheetAnalInferenceEntity)
+ .set(mapSheetAnalInferenceEntity.gukyuinUsed, "Y")
+ .set(mapSheetAnalInferenceEntity.gukyuinApplyDttm, ZonedDateTime.now())
+ .set(mapSheetAnalInferenceEntity.stage, Integer.parseInt(registRes.getChnDtctSno()))
+ .where(mapSheetAnalInferenceEntity.learnId.eq(learnId))
+ .execute();
+ }
+
+ @Override
+ public List findYesterdayLabelingCompleteList() {
+ ZoneId zone = ZoneId.of("Asia/Seoul");
+ ZonedDateTime todayStart = ZonedDateTime.now(zone).toLocalDate().atStartOfDay(zone);
+ ZonedDateTime yesterdayStart = todayStart.minusDays(1);
+
+ BooleanExpression isYesterday =
+ labelingAssignmentEntity
+ .inspectStatDttm
+ .goe(yesterdayStart)
+ .and(labelingAssignmentEntity.inspectStatDttm.lt(todayStart));
+
+ return queryFactory
+ .select(
+ Projections.constructor(
+ GeomUidDto.class,
+ labelingAssignmentEntity.inferenceGeomUid,
+ mapSheetAnalDataInferenceGeomEntity.resultUid))
+ .from(labelingAssignmentEntity)
+ .innerJoin(mapSheetAnalDataInferenceGeomEntity)
+ .on(
+ labelingAssignmentEntity.inferenceGeomUid.eq(
+ mapSheetAnalDataInferenceGeomEntity.geoUid))
+ .innerJoin(mapSheetAnalInferenceEntity)
+ .on(labelingAssignmentEntity.analUid.eq(mapSheetAnalInferenceEntity.id))
+ .innerJoin(mapSheetLearnEntity)
+ .on(
+ mapSheetAnalInferenceEntity.learnId.eq(mapSheetLearnEntity.id),
+ mapSheetLearnEntity.applyStatus.in(
+ GukYuinStatus.GUK_COMPLETED.getId(), GukYuinStatus.PNU_COMPLETED.getId()))
+ .where(labelingAssignmentEntity.inspectState.eq(InspectState.COMPLETE.getId()), isYesterday)
+ .fetch();
+ }
+
+ @Override
+ public void updateAnalDataInferenceGeomSendDttm(Long geoUid) {
+ queryFactory
+ .update(mapSheetAnalDataInferenceGeomEntity)
+ .set(mapSheetAnalDataInferenceGeomEntity.labelSendDttm, ZonedDateTime.now())
+ .where(mapSheetAnalDataInferenceGeomEntity.geoUid.eq(geoUid))
+ .execute();
+ }
+
+ @Override
+ public List findLabelingCompleteSendList(LocalDate yesterday) {
+
+ ZoneId zone = ZoneId.of("Asia/Seoul");
+ ZonedDateTime from = yesterday.atStartOfDay(zone);
+ ZonedDateTime to = from.plusDays(1);
+
+ BooleanExpression isYesterday =
+ labelingAssignmentEntity
+ .inspectStatDttm
+ .goe(from)
+ .and(labelingAssignmentEntity.inspectStatDttm.lt(to));
+
+ return queryFactory
+ .select(
+ Projections.constructor(
+ LabelSendDto.class,
+ mapSheetAnalDataInferenceGeomEntity.resultUid,
+ labelingAssignmentEntity.workerUid,
+ labelingAssignmentEntity.workStatDttm,
+ labelingAssignmentEntity.inspectorUid,
+ labelingAssignmentEntity.inspectStatDttm,
+ mapSheetAnalDataInferenceGeomEntity.labelSendDttm))
+ .from(labelingAssignmentEntity)
+ .innerJoin(mapSheetAnalDataInferenceGeomEntity)
+ .on(
+ labelingAssignmentEntity.inferenceGeomUid.eq(
+ mapSheetAnalDataInferenceGeomEntity.geoUid))
+ .where(labelingAssignmentEntity.inspectState.eq(InspectState.COMPLETE.getId()), isYesterday)
+ .fetch();
+ }
+
+ @Override
+ public Long findMapSheetLearnInfoByYyyy(
+ Integer compareYyyy, Integer targetYyyy, Integer maxStage) {
+ return queryFactory
+ .select(mapSheetLearnEntity.id)
+ .from(mapSheetLearnEntity)
+ .where(
+ mapSheetLearnEntity.compareYyyy.eq(compareYyyy),
+ mapSheetLearnEntity.targetYyyy.eq(targetYyyy),
+ mapSheetLearnEntity.stage.eq(maxStage))
+ .fetchOne();
+ }
+
+ @Override
+ public void updateMapSheetLearnGukyuinEndStatus(Long learnId) {
+ queryFactory
+ .update(mapSheetLearnEntity)
+ .set(mapSheetLearnEntity.applyStatus, GukYuinStatus.END.getId())
+ .set(mapSheetLearnEntity.applyStatusDttm, ZonedDateTime.now())
+ .where(mapSheetLearnEntity.id.eq(learnId))
+ .execute();
+ }
+
+ @Override
+ public void updateMapSheetInferenceLabelEndStatus(Long learnId) {
+ queryFactory
+ .update(mapSheetAnalInferenceEntity)
+ .set(mapSheetAnalInferenceEntity.analState, LabelMngState.FINISH.getId())
+ .set(mapSheetAnalInferenceEntity.updatedDttm, ZonedDateTime.now())
+ .where(mapSheetAnalInferenceEntity.learnId.eq(learnId))
+ .execute();
+ }
+
+ @Override
+ @Transactional
+ public void updateGukYuinApplyStateComplete(Long id, GukYuinStatus status) {
+ queryFactory
+ .update(mapSheetLearnEntity)
+ .set(mapSheetLearnEntity.applyStatus, status.getId())
+ .set(mapSheetLearnEntity.applyStatusDttm, ZonedDateTime.now())
+ .where(mapSheetLearnEntity.id.eq(id))
+ .execute();
+ }
+}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.java
new file mode 100644
index 0000000..26b0986
--- /dev/null
+++ b/gukyuin/pnu-update/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.enums.ApiConfigEnum.EnumDto;
+import com.kamco.cd.kamcoback.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/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiPnuJobService.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiPnuJobService.java
index eac9a52..dffdef4 100644
--- a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiPnuJobService.java
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiPnuJobService.java
@@ -1,9 +1,5 @@
-package com.kamco.cd.kamcoback.scheduler.service;
+package com.kamco.cd.kamcoback.service;
-import com.kamco.cd.kamcoback.common.utils.NetUtils;
-import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient;
-import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient.ExternalCallResult;
-import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto;
import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ContBasic;
import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ResultContDto;
import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto;
@@ -15,8 +11,6 @@ import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpMethod;
-import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Log4j2
@@ -25,18 +19,11 @@ import org.springframework.stereotype.Service;
public class GukYuinApiPnuJobService {
private final GukYuinPnuJobCoreService gukYuinPnuJobCoreService;
- private final ExternalHttpClient externalHttpClient;
- private final NetUtils netUtils = new NetUtils();
+ private final GukYuinApiService gukYuinApiService;
@Value("${spring.profiles.active}")
private String profile;
- @Value("${gukyuin.url}")
- private String gukyuinUrl;
-
- @Value("${gukyuin.cdi}")
- private String gukyuinCdiUrl;
-
/**
* 실행중인 profile
*
@@ -47,11 +34,11 @@ public class GukYuinApiPnuJobService {
}
/** 국유인 등록 완료 후, 탐지객체 조회해서 PNU 업데이트 하는 스케줄링 하루 1번 새벽 1시에 실행 */
- @Scheduled(cron = "0 0 1 * * *")
+ // @Scheduled(cron = "0 * * * * *")
public void findGukYuinContListPnuUpdate() {
- if (isLocalProfile()) {
- return;
- }
+ // if (isLocalProfile()) {
+ // return;
+ // }
List list =
gukYuinPnuJobCoreService.findGukyuinApplyStatusUidList(
@@ -62,14 +49,9 @@ public class GukYuinApiPnuJobService {
for (LearnKeyDto dto : list) {
try {
- long succCnt = processUid(dto.getChnDtctMstId(), dto.getUid());
- if (succCnt > 0) {
- gukYuinPnuJobCoreService.updateGukYuinApplyStateComplete(
- dto.getId(), GukYuinStatus.PNU_COMPLETED);
- } else {
- gukYuinPnuJobCoreService.updateGukYuinApplyStateComplete(
- dto.getId(), GukYuinStatus.PNU_FAILED);
- }
+ processUid(dto.getUid(), dto.getUid());
+ gukYuinPnuJobCoreService.updateGukYuinApplyStateComplete(
+ dto.getId(), GukYuinStatus.PNU_COMPLETED);
} catch (Exception e) {
log.error("[GUKYUIN] failed uid={}", dto.getUid(), e);
gukYuinPnuJobCoreService.updateGukYuinApplyStateComplete(
@@ -78,23 +60,16 @@ public class GukYuinApiPnuJobService {
}
}
- private long processUid(String chnDtctMstId, String uid) {
- long succCnt = 0;
- String url = gukyuinCdiUrl + "/chn/mast/list/" + chnDtctMstId;
-
- ExternalCallResult response =
- externalHttpClient.call(
- url, HttpMethod.GET, null, netUtils.jsonHeaders(), ChngDetectMastDto.ResultDto.class);
-
- ResultDto result = response.body();
+ private void processUid(String chnDtctId, String uid) {
+ ResultDto result = gukYuinApiService.listChnDtctId(chnDtctId, "Y");
if (result == null || result.getResult() == null || result.getResult().isEmpty()) {
- return succCnt;
+ return;
}
ChngDetectMastDto.Basic basic = result.getResult().get(0);
String chnDtctCnt = basic.getChnDtctCnt();
if (chnDtctCnt == null || chnDtctCnt.isEmpty()) {
- return succCnt;
+ return;
}
// page 계산
@@ -103,30 +78,18 @@ public class GukYuinApiPnuJobService {
int totalPages = (totalCount + pageSize - 1) / pageSize;
for (int page = 0; page < totalPages; page++) {
- succCnt += processPage(uid, page, pageSize);
+ processPage(uid, page, pageSize);
}
-
- return succCnt;
}
- private long processPage(String uid, int page, int pageSize) {
- long result = 0;
- String url =
- gukyuinCdiUrl + "/chn/cont/" + uid + "?pageIndex=" + page + "&pageSize=" + pageSize;
+ private void processPage(String uid, int page, int pageSize) {
+ ResultContDto resContList = gukYuinApiService.findChnContList(uid, page, pageSize, "Y");
- ExternalCallResult response =
- externalHttpClient.call(
- url,
- HttpMethod.GET,
- null,
- netUtils.jsonHeaders(),
- ChngDetectContDto.ResultContDto.class);
-
- List contList = response.body().getResult();
- if (contList == null || contList.isEmpty()) {
- return 0;
+ if (resContList.getResult() == null || resContList.getResult().isEmpty()) {
+ return; // 외부 API 이상 방어
}
+ List contList = resContList.getResult();
for (ContBasic cont : contList) {
String[] pnuList = cont.getPnuList();
long pnuCnt = pnuList == null ? 0 : pnuList.length;
@@ -137,28 +100,9 @@ public class GukYuinApiPnuJobService {
Long geoUid =
gukYuinPnuJobCoreService.findMapSheetAnalDataInferenceGeomUid(
cont.getChnDtctObjtId());
- gukYuinPnuJobCoreService.insertGeoUidPnuData(geoUid, pnuList);
+ gukYuinPnuJobCoreService.insertGeoUidPnuData(geoUid, pnuList, cont.getChnDtctObjtId());
}
}
}
-
- ResultContDto cont = response.body();
- if (cont == null || cont.getResult().isEmpty()) {
- return result; // 외부 API 이상 방어
- }
-
- // pnuList 업데이트
- for (ChngDetectContDto.ContBasic contBasic : cont.getResult()) {
- if (contBasic.getPnuList() == null || contBasic.getChnDtctObjtId() == null) {
- return 0;
- }
-
- long upsertCnt =
- gukYuinPnuJobCoreService.upsertMapSheetDataAnalGeomPnu(
- contBasic.getChnDtctObjtId(), contBasic.getPnuList());
- result += upsertCnt;
- }
-
- return result;
}
}
diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiService.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiService.java
new file mode 100644
index 0000000..48c0a7d
--- /dev/null
+++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiService.java
@@ -0,0 +1,390 @@
+package com.kamco.cd.kamcoback.service;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.kamco.cd.kamcoback.common.utils.NetUtils;
+import com.kamco.cd.kamcoback.config.api.ApiResponseDto.ApiResponseCode;
+import com.kamco.cd.kamcoback.config.api.ApiResponseDto.ResponseObj;
+import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient;
+import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient.ExternalCallResult;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ContBasic;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ReqInfo;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ResultContDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ResultPnuDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.ChnDetectMastReqDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.ErrorResDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LabelSendDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.ResultDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.RlbDtctDto;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.GukYuinLinkFacts;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.GukYuinLinkFailCode;
+import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.LearnInfo;
+import com.kamco.cd.kamcoback.postgres.core.GukYuinCoreService;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.UUID;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Slf4j
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class GukYuinApiService {
+
+ private final GukYuinCoreService gukyuinCoreService;
+ private final ExternalHttpClient externalHttpClient;
+ private final NetUtils netUtils = new NetUtils();
+
+ private final ObjectMapper objectMapper;
+ private final String myip = netUtils.getLocalIP();
+
+ @Value("${spring.profiles.active:local}")
+ private String profile;
+
+ @Value("${gukyuin.url}")
+ private String gukyuinUrl;
+
+ @Value("${gukyuin.cdi}")
+ private String gukyuinCdiUrl;
+
+ @Value("${file.dataset-dir}")
+ private String datasetDir;
+
+ @Transactional
+ public ChngDetectMastDto.RegistResDto regist(ChnDetectMastReqDto chnDetectMastReq) {
+
+ String url = gukyuinCdiUrl + "/chn/mast/regist";
+
+ chnDetectMastReq.setReqIp(myip);
+ chnDetectMastReq.setReqEpno("BATCH");
+
+ ExternalCallResult result =
+ externalHttpClient.call(
+ url,
+ HttpMethod.POST,
+ chnDetectMastReq,
+ netUtils.jsonHeaders(),
+ ChngDetectMastDto.RegistResDto.class);
+
+ ChngDetectMastDto.RegistResDto resultBody = result.body();
+ boolean success = false;
+ if (resultBody != null && resultBody.getSuccess() != null) {
+ ChngDetectMastDto.Basic registRes = resultBody.getResult();
+
+ success = resultBody.getSuccess();
+
+ // 이미 등록한 경우에는 result가 없음
+ if (resultBody.getResult() == null) {
+ return resultBody;
+ }
+
+ // 추론 회차에 applyStatus, applyStatusDttm 업데이트
+ gukyuinCoreService.updateGukYuinMastRegResult(registRes);
+
+ // anal_inference 에도 국유인 반영여부, applyDttm 업데이트
+ gukyuinCoreService.updateAnalInferenceApplyDttm(registRes);
+ } else {
+ String errBody = result.errBody();
+ ErrorResDto error = null;
+ try {
+ error = objectMapper.readValue(errBody, ErrorResDto.class);
+ return new ChngDetectMastDto.RegistResDto(error.getStatus(), error.getError(), null, false);
+ } catch (JsonProcessingException e) {
+ log.error("에러 응답 파싱 실패. rawBody={}", errBody, e);
+ return new ChngDetectMastDto.RegistResDto(
+ result.statusCode(), // HTTP status
+ errBody, // 원문 그대로
+ null,
+ false);
+ }
+ }
+
+ return resultBody;
+ }
+
+ @Transactional
+ public ChngDetectMastDto.RemoveResDto remove(ChnDetectMastReqDto chnDetectMastReq) {
+ String url = gukyuinCdiUrl + "/chn/mast/remove";
+
+ chnDetectMastReq.setReqIp(myip);
+ chnDetectMastReq.setReqEpno("BATCH");
+
+ boolean success = false;
+ ExternalCallResult result =
+ externalHttpClient.call(
+ url,
+ HttpMethod.POST,
+ chnDetectMastReq,
+ netUtils.jsonHeaders(),
+ ChngDetectMastDto.RemoveResDto.class);
+
+ ChngDetectMastDto.RemoveResDto resultBody = result.body();
+ if (resultBody != null && resultBody.getSuccess() != null) {
+
+ success = resultBody.getSuccess();
+ if (resultBody.getSuccess()) {
+ gukyuinCoreService.updateGukYuinMastRegRemove(chnDetectMastReq.getChnDtctId());
+ }
+ }
+
+ return resultBody;
+ }
+
+ // 등록목록 1개 확인
+ public ResultDto detail(String chnDtctMstId) {
+
+ String url =
+ gukyuinCdiUrl + "/chn/mast/list/" + chnDtctMstId + "?reqIp=" + myip + "&reqEpno=" + "BATCH";
+
+ ExternalCallResult result =
+ externalHttpClient.call(url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultDto.class);
+
+ return result.body();
+ }
+
+ // 등록목록 비교년도,기준년도,차수 조합해서 n개 확인
+ public ResultDto listYearStage(ChngDetectMastDto.ChngDetectMastSearchDto searchDto) {
+ String queryString = netUtils.dtoToQueryString(searchDto, null);
+ String url =
+ gukyuinCdiUrl + "/chn/mast" + queryString + "&reqIp=" + myip + "&reqEpno=" + "BATCH";
+
+ ExternalCallResult result =
+ externalHttpClient.call(url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultDto.class);
+
+ return result.body();
+ }
+
+ private GukYuinLinkFailCode decideCode(GukYuinLinkFacts f) {
+
+ if (!f.existsLearn()) {
+ return GukYuinLinkFailCode.NOT_FOUND;
+ }
+
+ if (f.isPartScope()) {
+ return GukYuinLinkFailCode.SCOPE_PART_NOT_ALLOWED;
+ }
+
+ if (f.hasRunningInference()) {
+ return GukYuinLinkFailCode.HAS_RUNNING_INFERENCE;
+ }
+
+ if (f.hasOtherUnfinishedGukYuin()) {
+ return GukYuinLinkFailCode.OTHER_GUKYUIN_IN_PROGRESS;
+ }
+
+ return GukYuinLinkFailCode.OK;
+ }
+
+ // 탐지객체 리스트 조회
+ public ResultContDto findChnContList(
+ String chnDtctId, Integer pageIndex, Integer pageSize, String batchYn) {
+
+ String url =
+ gukyuinCdiUrl
+ + "/chn/cont/"
+ + chnDtctId
+ + "?pageIndex="
+ + pageIndex
+ + "&pageSize="
+ + pageSize
+ + "&reqIp="
+ + myip
+ + "&reqEpno="
+ + "BATCH";
+
+ ExternalCallResult result =
+ externalHttpClient.call(
+ url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultContDto.class);
+
+ List contList = result.body().getResult();
+ if (contList == null || contList.isEmpty()) {
+ return new ResultContDto(
+ result.body().getCode(),
+ result.body().getMessage(),
+ result.body().getResult(),
+ result.body().getSuccess());
+ }
+
+ return result.body();
+ }
+
+ public ResultPnuDto findPnuObjMgmtList(String chnDtctId, String chnDtctObjtId) {
+ String url =
+ gukyuinCdiUrl
+ + "/chn/pnu/"
+ + chnDtctId
+ + "/objt/"
+ + chnDtctObjtId
+ + "?reqIp="
+ + myip
+ + "&reqEpno="
+ + "BATCH";
+
+ ExternalCallResult result =
+ externalHttpClient.call(
+ url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultPnuDto.class);
+
+ return result.body();
+ }
+
+ public ChngDetectContDto.ResultLabelDto updateChnDtctObjtLabelingYn(
+ String chnDtctObjtId, String lblYn, String batchYn) {
+ String url = gukyuinCdiUrl + "/rlb/objt/" + chnDtctObjtId + "/lbl/" + lblYn;
+
+ ReqInfo info = new ReqInfo();
+ info.setReqIp(myip);
+ info.setReqEpno("BATCH");
+
+ ExternalCallResult result =
+ externalHttpClient.call(
+ url,
+ HttpMethod.POST,
+ info,
+ netUtils.jsonHeaders(),
+ ChngDetectContDto.ResultLabelDto.class);
+
+ return result.body();
+ }
+
+ public ResultContDto findChnPnuToContList(String chnDtctId, String pnu) {
+
+ String url =
+ gukyuinCdiUrl
+ + "/chn/cont/"
+ + chnDtctId
+ + "/pnu/"
+ + pnu
+ + "?reqIp="
+ + myip
+ + "&reqEpno="
+ + "BATCH";
+
+ ExternalCallResult result =
+ externalHttpClient.call(
+ url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultContDto.class);
+
+ return result.body();
+ }
+
+ public ResultDto listChnDtctId(String chnDtctId, String batchYn) {
+ String url =
+ gukyuinCdiUrl + "/chn/mast/" + chnDtctId + "?reqIp=" + myip + "&reqEpno=" + "BATCH";
+
+ ExternalCallResult result =
+ externalHttpClient.call(url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultDto.class);
+
+ return result.body();
+ }
+
+ public ResponseObj connectChnMastRegist(UUID uuid) {
+ // uuid로 추론 회차 조회
+ LearnInfo info = gukyuinCoreService.findMapSheetLearnInfo(uuid);
+ if (info.getApplyYn() != null && info.getApplyYn()) {
+ return new ResponseObj(ApiResponseCode.DUPLICATE_DATA, "이미 국유인 연동을 한 회차입니다.");
+ }
+
+ if (!Files.isDirectory(Path.of("/kamco-nfs/dataset/export/" + info.getUid()))) {
+ return new ResponseObj(
+ ApiResponseCode.NOT_FOUND_DATA, "파일 경로에 회차 실행 파일이 생성되지 않았습니다. 확인 부탁드립니다.");
+ }
+
+ // 비교년도,기준년도로 전송한 데이터 있는지 확인 후 회차 번호 생성
+ Integer maxStage =
+ gukyuinCoreService.findMapSheetLearnYearStage(info.getCompareYyyy(), info.getTargetYyyy());
+
+ // reqDto 셋팅
+ ChnDetectMastReqDto reqDto = new ChnDetectMastReqDto();
+ reqDto.setCprsYr(String.valueOf(info.getCompareYyyy()));
+ reqDto.setCrtrYr(String.valueOf(info.getTargetYyyy()));
+ reqDto.setChnDtctSno(String.valueOf(maxStage + 1));
+ reqDto.setChnDtctId(info.getUid());
+ reqDto.setPathNm("/kamco-nfs/dataset/export/" + info.getUid());
+
+ // 1회차를 종료 상태로 처리하고 2회차를 보내야 함
+ // 추론(learn), 학습데이터(inference) 둘 다 종료 처리
+ if (maxStage > 0) {
+ Long learnId =
+ gukyuinCoreService.findMapSheetLearnInfoByYyyy(
+ info.getCompareYyyy(), info.getTargetYyyy(), maxStage);
+ gukyuinCoreService.updateMapSheetLearnGukyuinEndStatus(learnId);
+ gukyuinCoreService.updateMapSheetInferenceLabelEndStatus(learnId);
+ }
+
+ // 국유인 /chn/mast/regist 전송
+ ChngDetectMastDto.RegistResDto result = this.regist(reqDto);
+ if (result.getSuccess()) {
+ return new ResponseObj(ApiResponseCode.OK, "연동되었습니다.");
+ } else {
+ return new ResponseObj(ApiResponseCode.INTERNAL_SERVER_ERROR, result.getMessage());
+ }
+ }
+
+ public List findLabelingCompleteSendList(LocalDate yesterday) {
+ return gukyuinCoreService.findLabelingCompleteSendList(yesterday);
+ }
+
+ public ResultContDto findChnPnuToContObject(
+ String chnDtctId, String chnDtctObjtId, Integer pageIndex, Integer pageSize) {
+
+ String url =
+ gukyuinCdiUrl
+ + "/chn/cont/"
+ + chnDtctId
+ + "/chnDtctObjtId/"
+ + chnDtctObjtId
+ + "?pageIndex="
+ + pageIndex
+ + "&pageSize="
+ + pageSize
+ + "&reqIp="
+ + myip
+ + "&reqEpno="
+ + "BATCH";
+
+ ExternalCallResult result =
+ externalHttpClient.call(
+ url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultContDto.class);
+
+ return result.body();
+ }
+
+ public RlbDtctDto findRlbDtctList(String chnDtctId, String yyyymmdd, String batchYn) {
+
+ String url =
+ gukyuinCdiUrl
+ + "/rlb/dtct/"
+ + chnDtctId
+ + "?reqIp="
+ + myip
+ + "&reqEpno="
+ + "BATCH"
+ + "&yyyymmdd="
+ + yyyymmdd;
+
+ ExternalCallResult result =
+ externalHttpClient.call(
+ url, HttpMethod.GET, null, netUtils.jsonHeaders(), RlbDtctDto.class);
+
+ return result.body();
+ }
+
+ public RlbDtctDto findRlbDtctObject(String chnDtctObjtId) {
+ String url =
+ gukyuinCdiUrl + "/rlb/objt/" + chnDtctObjtId + "?reqIp=" + myip + "&reqEpno=" + "BATCH";
+
+ ExternalCallResult result =
+ externalHttpClient.call(
+ url, HttpMethod.GET, null, netUtils.jsonHeaders(), RlbDtctDto.class);
+
+ return result.body();
+ }
+}
diff --git a/gukyuin/pnu-update/src/main/resources/application-dev.yml b/gukyuin/pnu-update/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..d7611e7
--- /dev/null
+++ b/gukyuin/pnu-update/src/main/resources/application-dev.yml
@@ -0,0 +1,136 @@
+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/gukyuin/pnu-update/src/main/resources/application-local.yml b/gukyuin/pnu-update/src/main/resources/application-local.yml
new file mode 100644
index 0000000..cb09429
--- /dev/null
+++ b/gukyuin/pnu-update/src/main/resources/application-local.yml
@@ -0,0 +1,114 @@
+spring:
+ config:
+ activate:
+ on-profile: local
+
+ jpa:
+ show-sql: false
+ hibernate:
+ ddl-auto: validate # 로컬만 완화(시킬려면 update으로 변경)
+ properties:
+ hibernate:
+ default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지
+ order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지
+ use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용)
+ format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성)
+
+ datasource:
+ url: jdbc:postgresql://192.168.2.127:15432/kamco_cds
+ # url: jdbc:postgresql://localhost:5432/local_0128
+ username: kamco_cds
+ password: kamco_cds_Q!W@E#R$
+ # username: postgres
+ # password: 1234
+ hikari:
+ minimum-idle: 1
+ maximum-pool-size: 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일
+
+token:
+ refresh-cookie-name: kamco-local # 개발용 쿠키 이름
+ refresh-cookie-secure: false # 로컬 http 테스트면 false
+
+springdoc:
+ swagger-ui:
+ persist-authorization: true # 스웨거 새로고침해도 토큰 유지, 로컬스토리지에 저장
+
+logging:
+ level:
+ org.hibernate.SQL: debug
+ org.hibernate.orm.jdbc.bind: trace
+
+mapsheet:
+ upload:
+ skipGdalValidation: true
+ shp:
+ baseurl: /Users/bokmin/detect/result
+
+
+
+file:
+ sync-root-dir: C:/Users/gypark/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
+
+ dataset-dir: C:/Users/gypark/kamco-nfs/dataset/
+ #dataset-dir: /kamco-nfs/dataset/export/
+ dataset-tmp-dir: ${file.dataset-dir}tmp/
+
+ model-dir: C:/Users/gypark/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/classification/
+ pt-FileName: v5-best.pt
+
+ dataset-response: /kamco-nfs/dataset/response/
+
+inference:
+ url: http://10.100.0.11:8000/jobs
+ batch-url: http://10.100.0.11:8000/batches
+ geojson-dir: /kamco-nfs/requests/
+ jar-path: jar/makeshp-1.0.0.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/model_output/labeling/
+
+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/gukyuin/pnu-update/src/main/resources/application-prod.yml b/gukyuin/pnu-update/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..471febd
--- /dev/null
+++ b/gukyuin/pnu-update/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/gukyuin/pnu-update/src/main/resources/application.yml b/gukyuin/pnu-update/src/main/resources/application.yml
index 5d1aadc..12f24e0 100644
--- a/gukyuin/pnu-update/src/main/resources/application.yml
+++ b/gukyuin/pnu-update/src/main/resources/application.yml
@@ -1,4 +1,8 @@
server:
- port: 9080
-
+ port: 8080
+spring:
+ application:
+ name: kamco-pnu-update-job
+ profiles:
+ active: prod # 사용할 프로파일 지정 (ex. dev, prod, test)
diff --git a/gukyuin/pnu-update/src/main/resources/application_dev.yml b/gukyuin/pnu-update/src/main/resources/application_dev.yml
deleted file mode 100644
index 80d48c2..0000000
--- a/gukyuin/pnu-update/src/main/resources/application_dev.yml
+++ /dev/null
@@ -1,71 +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
-
-gukyuin:
- #url: http://localhost:8080
- url: http://192.168.2.129:5301
- cdi: ${gukyuin.url}/api/kcd/cdi
\ No newline at end of file
diff --git a/gukyuin/pnu-update/src/main/resources/application_local.yml b/gukyuin/pnu-update/src/main/resources/application_local.yml
deleted file mode 100644
index a5a4da3..0000000
--- a/gukyuin/pnu-update/src/main/resources/application_local.yml
+++ /dev/null
@@ -1,71 +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
-
-gukyuin:
- #url: http://localhost:8080
- url: http://192.168.2.129:5301
- cdi: ${gukyuin.url}/api/kcd/cdi
\ No newline at end of file
diff --git a/gukyuin/pnu-update/src/main/resources/application_prod.yml b/gukyuin/pnu-update/src/main/resources/application_prod.yml
deleted file mode 100644
index ea3d329..0000000
--- a/gukyuin/pnu-update/src/main/resources/application_prod.yml
+++ /dev/null
@@ -1,71 +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
-
-gukyuin:
- #url: http://localhost:8080
- url: http://192.168.2.129:5301
- cdi: ${gukyuin.url}/api/kcd/cdi
\ No newline at end of file