From e69eccc82b4cecdea5cadb4ec17bd392c806a70f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dean=5B=EB=B0=B1=EB=B3=91=EB=82=A8=5D?= Date: Thu, 12 Mar 2026 07:57:14 +0900 Subject: [PATCH] =?UTF-8?q?shp=ED=8C=8C=EC=9D=BC=20=EB=B0=94=EA=BE=B8?= =?UTF-8?q?=EB=8A=94=EB=A1=9C=EC=A7=81=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/kamcoback/config/SecurityConfig.java | 11 +++- .../test/TestShapeApiController.java | 53 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/kamco/cd/kamcoback/test/TestShapeApiController.java diff --git a/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java b/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java index f08ad5c9..d0461691 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/SecurityConfig.java @@ -48,7 +48,9 @@ public class SecurityConfig { auth // .requestMatchers("/chunk_upload_test.html").authenticated() - .requestMatchers("/monitor/health", "/monitor/health/**") + .requestMatchers("/monitor/health" + , "/monitor/health/**" + ) .permitAll() // 맵시트 영역 전체 허용 (우선순위 최상단) @@ -71,6 +73,10 @@ public class SecurityConfig { .requestMatchers("/api/test/review") .hasAnyRole("ADMIN", "REVIEWER") + // shapefile 생성 테스트 API - 인증 없이 접근 가능 + .requestMatchers("/api/test/make-shapefile") + .permitAll() + // ASYNC/ERROR 재디스패치는 막지 않기 (다운로드/스트리밍에서 필수) .dispatcherTypeMatchers(DispatcherType.ASYNC, DispatcherType.ERROR) .permitAll() @@ -113,7 +119,8 @@ public class SecurityConfig { "/api/user/**", "/api/my/menus", "/api/training-data/label/**", - "/api/training-data/review/**") + "/api/training-data/review/**" + ) .authenticated() // 나머지는 메뉴권한 diff --git a/src/main/java/com/kamco/cd/kamcoback/test/TestShapeApiController.java b/src/main/java/com/kamco/cd/kamcoback/test/TestShapeApiController.java new file mode 100644 index 00000000..ee589af9 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/test/TestShapeApiController.java @@ -0,0 +1,53 @@ +package com.kamco.cd.kamcoback.test; + +import com.kamco.cd.kamcoback.config.api.ApiResponseDto; +import com.kamco.cd.kamcoback.scheduler.service.ShpPipelineService; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.ErrorResponse; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Hidden +@Tag(name = "test shape api", description = "test shape api") +@RestController +@RequiredArgsConstructor + +@RequestMapping("/api/test") +public class TestShapeApiController { + + private final ShpPipelineService shpPipelineService; + + @Operation(summary = "shapefile 생성 테스트", description = "지정된 inference ID와 batch ID 목록으로 shapefile을 생성합니다.") + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "shapefile 생성 요청 성공", + content = @Content(schema = @Schema(implementation = String.class))), + @ApiResponse( + responseCode = "400", + description = "잘못된 요청 데이터", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))) + }) + @GetMapping("/make-shapefile") + public ApiResponseDto makeShapeFile( + @RequestParam String inferenceId, + @RequestParam List batchIds) { + shpPipelineService.makeShapeFile(inferenceId, batchIds); + return ApiResponseDto.ok("Shapefile 생성이 시작되었습니다. inferenceId: " + inferenceId); + } +}