diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java index 8221a663..4bca5c6a 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java @@ -28,6 +28,7 @@ import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityNotFoundException; +import java.time.OffsetDateTime; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -118,9 +119,9 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto .groupBy(systemMetricEntity.serverName) .fetch(); - List latestGpuIds = + List latestGpuIds = queryFactory - .select(gpuMetricEntity.id1.max()) + .select(gpuMetricEntity.timestamp.max()) .from(gpuMetricEntity) .groupBy(gpuMetricEntity.serverName) .fetch(); @@ -135,12 +136,15 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto systemMetricEntity.cpuSystem, systemMetricEntity.memused, systemMetricEntity.kbmemused, - gpuMetricEntity.gpuUtil)) + gpuMetricEntity.gpuUtil + // gpuMetricEntity.gpuMemUsed, + // gpuMetricEntity.gpuMemTotal + )) .from(systemMetricEntity) .leftJoin(gpuMetricEntity) .on( gpuMetricEntity - .id1 + .timestamp .in(latestGpuIds) .and(gpuMetricEntity.serverName.eq(systemMetricEntity.serverName))) .where(systemMetricEntity.id1.in(latestIds)) // In 절 사용 diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryImpl.java index cb22f514..93d7d7bd 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryImpl.java @@ -772,34 +772,49 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport public TrainingDataLabelDto.CogImageResponse getCogImageUrl( String mapSheetNum, Integer beforeYear, Integer afterYear) { try { - // beforeYear COG URL 조회 - String beforeCogUrl = - queryFactory - .select( - Expressions.stringTemplate( - "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) - .from(imageryEntity) - .where(imageryEntity.scene5k.eq(mapSheetNum), imageryEntity.year.eq(beforeYear)) - .fetchFirst(); + // 최소 하나의 년도는 제공되어야 함 + if (beforeYear == null && afterYear == null) { + throw new IllegalArgumentException( + "At least one year parameter (beforeYear or afterYear) must be provided"); + } - // afterYear COG URL 조회 - String afterCogUrl = - queryFactory - .select( - Expressions.stringTemplate( - "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) - .from(imageryEntity) - .where(imageryEntity.scene5k.eq(mapSheetNum), imageryEntity.year.eq(afterYear)) - .fetchFirst(); + String beforeCogUrl = null; + String afterCogUrl = null; - if (beforeCogUrl == null && afterCogUrl == null) { + // beforeYear가 제공된 경우 COG URL 조회 + if (beforeYear != null) { + beforeCogUrl = + queryFactory + .select( + Expressions.stringTemplate( + "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) + .from(imageryEntity) + .where(imageryEntity.scene5k.eq(mapSheetNum), imageryEntity.year.eq(beforeYear)) + .fetchFirst(); + } + + // afterYear가 제공된 경우 COG URL 조회 + if (afterYear != null) { + afterCogUrl = + queryFactory + .select( + Expressions.stringTemplate( + "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) + .from(imageryEntity) + .where(imageryEntity.scene5k.eq(mapSheetNum), imageryEntity.year.eq(afterYear)) + .fetchFirst(); + } + + // 제공된 년도에 대해 하나도 찾지 못한 경우에만 예외 발생 + if ((beforeYear != null && beforeCogUrl == null) + && (afterYear != null && afterCogUrl == null)) { throw new RuntimeException( "COG images not found for mapSheetNum: " + mapSheetNum + ", years: " - + beforeYear - + ", " - + afterYear); + + (beforeYear != null ? beforeYear : "") + + (beforeYear != null && afterYear != null ? ", " : "") + + (afterYear != null ? afterYear : "")); } return TrainingDataLabelDto.CogImageResponse.builder() @@ -817,9 +832,9 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport "Failed to get COG image URLs for mapSheetNum: " + mapSheetNum + ", years: " - + beforeYear - + ", " - + afterYear, + + (beforeYear != null ? beforeYear : "") + + (beforeYear != null && afterYear != null ? ", " : "") + + (afterYear != null ? afterYear : ""), e); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataReviewRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataReviewRepositoryImpl.java index 956e336b..6ce57794 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataReviewRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataReviewRepositoryImpl.java @@ -776,34 +776,49 @@ public class TrainingDataReviewRepositoryImpl extends QuerydslRepositorySupport public TrainingDataReviewDto.CogImageResponse getCogImageUrl( String mapSheetNum, Integer beforeYear, Integer afterYear) { try { - // beforeYear COG URL 조회 - String beforeCogUrl = - queryFactory - .select( - Expressions.stringTemplate( - "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) - .from(imageryEntity) - .where(imageryEntity.scene5k.eq(mapSheetNum), imageryEntity.year.eq(beforeYear)) - .fetchFirst(); + // 최소 하나의 년도는 제공되어야 함 + if (beforeYear == null && afterYear == null) { + throw new IllegalArgumentException( + "At least one year parameter (beforeYear or afterYear) must be provided"); + } - // afterYear COG URL 조회 - String afterCogUrl = - queryFactory - .select( - Expressions.stringTemplate( - "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) - .from(imageryEntity) - .where(imageryEntity.scene5k.eq(mapSheetNum), imageryEntity.year.eq(afterYear)) - .fetchFirst(); + String beforeCogUrl = null; + String afterCogUrl = null; - if (beforeCogUrl == null && afterCogUrl == null) { + // beforeYear가 제공된 경우 COG URL 조회 + if (beforeYear != null) { + beforeCogUrl = + queryFactory + .select( + Expressions.stringTemplate( + "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) + .from(imageryEntity) + .where(imageryEntity.scene5k.eq(mapSheetNum), imageryEntity.year.eq(beforeYear)) + .fetchFirst(); + } + + // afterYear가 제공된 경우 COG URL 조회 + if (afterYear != null) { + afterCogUrl = + queryFactory + .select( + Expressions.stringTemplate( + "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) + .from(imageryEntity) + .where(imageryEntity.scene5k.eq(mapSheetNum), imageryEntity.year.eq(afterYear)) + .fetchFirst(); + } + + // 제공된 년도에 대해 하나도 찾지 못한 경우에만 예외 발생 + if ((beforeYear != null && beforeCogUrl == null) + && (afterYear != null && afterCogUrl == null)) { throw new RuntimeException( "COG images not found for mapSheetNum: " + mapSheetNum + ", years: " - + beforeYear - + ", " - + afterYear); + + (beforeYear != null ? beforeYear : "") + + (beforeYear != null && afterYear != null ? ", " : "") + + (afterYear != null ? afterYear : "")); } return TrainingDataReviewDto.CogImageResponse.builder() @@ -821,9 +836,9 @@ public class TrainingDataReviewRepositoryImpl extends QuerydslRepositorySupport "Failed to get COG image URLs for mapSheetNum: " + mapSheetNum + ", years: " - + beforeYear - + ", " - + afterYear, + + (beforeYear != null ? beforeYear : "") + + (beforeYear != null && afterYear != null ? ", " : "") + + (afterYear != null ? afterYear : ""), e); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java b/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java index 510f5a20..a1948b18 100644 --- a/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java @@ -465,7 +465,9 @@ public class TrainingDataLabelApiController { return ApiResponseDto.okObject(trainingDataLabelService.saveNewPolygon(request)); } - @Operation(summary = "COG 이미지 URL 조회", description = "변화 전/후 COG 이미지 URL을 함께 조회합니다") + @Operation( + summary = "COG 이미지 URL 조회", + description = "변화 전/후 COG 이미지 URL을 조회합니다. beforeYear와 afterYear 중 최소 하나는 필수입니다.") @ApiResponses( value = { @ApiResponse( @@ -476,6 +478,10 @@ public class TrainingDataLabelApiController { mediaType = "application/json", schema = @Schema(implementation = TrainingDataLabelDto.CogImageResponse.class))), + @ApiResponse( + responseCode = "400", + description = "년도 파라미터가 하나도 제공되지 않음", + content = @Content), @ApiResponse(responseCode = "404", description = "이미지를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @@ -483,9 +489,11 @@ public class TrainingDataLabelApiController { public ApiResponseDto getCogImageUrl( @Parameter(description = "도엽번호", required = true, example = "35905086") @RequestParam String mapSheetNum, - @Parameter(description = "변화 전 년도", required = true, example = "2023") @RequestParam + @Parameter(description = "변화 전 년도", required = false, example = "2023") + @RequestParam(required = false) Integer beforeYear, - @Parameter(description = "변화 후 년도", required = true, example = "2024") @RequestParam + @Parameter(description = "변화 후 년도", required = false, example = "2024") + @RequestParam(required = false) Integer afterYear) { return ApiResponseDto.ok( trainingDataLabelService.getCogImageUrl(mapSheetNum, beforeYear, afterYear)); diff --git a/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataReviewApiController.java b/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataReviewApiController.java index 89d4e37d..376a55a1 100644 --- a/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataReviewApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataReviewApiController.java @@ -465,7 +465,9 @@ public class TrainingDataReviewApiController { return ApiResponseDto.okObject(trainingDataReviewService.saveNewPolygon(request)); } - @Operation(summary = "COG 이미지 URL 조회", description = "변화 전/후 COG 이미지 URL을 함께 조회합니다") + @Operation( + summary = "COG 이미지 URL 조회", + description = "변화 전/후 COG 이미지 URL을 조회합니다. beforeYear와 afterYear 중 최소 하나는 필수입니다.") @ApiResponses( value = { @ApiResponse( @@ -476,6 +478,10 @@ public class TrainingDataReviewApiController { mediaType = "application/json", schema = @Schema(implementation = TrainingDataReviewDto.CogImageResponse.class))), + @ApiResponse( + responseCode = "400", + description = "년도 파라미터가 하나도 제공되지 않음", + content = @Content), @ApiResponse(responseCode = "404", description = "이미지를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @@ -483,9 +489,11 @@ public class TrainingDataReviewApiController { public ApiResponseDto getCogImageUrl( @Parameter(description = "도엽번호", required = true, example = "35905086") @RequestParam String mapSheetNum, - @Parameter(description = "변화 전 년도", required = true, example = "2023") @RequestParam + @Parameter(description = "변화 전 년도", required = false, example = "2023") + @RequestParam(required = false) Integer beforeYear, - @Parameter(description = "변화 후 년도", required = true, example = "2024") @RequestParam + @Parameter(description = "변화 후 년도", required = false, example = "2024") + @RequestParam(required = false) Integer afterYear) { return ApiResponseDto.ok( trainingDataReviewService.getCogImageUrl(mapSheetNum, beforeYear, afterYear)); diff --git a/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataLabelService.java b/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataLabelService.java index 9e31efce..6b5696da 100644 --- a/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataLabelService.java +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataLabelService.java @@ -106,9 +106,9 @@ public class TrainingDataLabelService { * COG 이미지 URL 조회 (변화 전/후) * * @param mapSheetNum 도엽번호 - * @param beforeYear 변화 전 년도 - * @param afterYear 변화 후 년도 - * @return 변화 전/후 COG 이미지 URL + * @param beforeYear 변화 전 년도 (선택적) + * @param afterYear 변화 후 년도 (선택적) + * @return 변화 전/후 COG 이미지 URL (최소 하나의 년도는 제공되어야 함) */ public TrainingDataLabelDto.CogImageResponse getCogImageUrl( String mapSheetNum, Integer beforeYear, Integer afterYear) { diff --git a/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataReviewService.java b/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataReviewService.java index 067fea66..b81f2895 100644 --- a/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataReviewService.java +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataReviewService.java @@ -108,9 +108,9 @@ public class TrainingDataReviewService { * COG 이미지 URL 조회 (변화 전/후) * * @param mapSheetNum 도엽번호 - * @param beforeYear 변화 전 년도 - * @param afterYear 변화 후 년도 - * @return 변화 전/후 COG 이미지 URL + * @param beforeYear 변화 전 년도 (선택적) + * @param afterYear 변화 후 년도 (선택적) + * @return 변화 전/후 COG 이미지 URL (최소 하나의 년도는 제공되어야 함) */ public TrainingDataReviewDto.CogImageResponse getCogImageUrl( String mapSheetNum, Integer beforeYear, Integer afterYear) {