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..ae383000 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,47 @@ 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 +830,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..46d3b466 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,47 @@ 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 +834,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..7b61329b 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,7 @@ 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 +476,7 @@ 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 +484,9 @@ 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..425bb741 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,7 @@ 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 +476,7 @@ 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 +484,9 @@ 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) {