diff --git a/src/main/java/com/kamco/cd/kamcoback/config/OpenApiConfig.java b/src/main/java/com/kamco/cd/kamcoback/config/OpenApiConfig.java new file mode 100644 index 00000000..afd6e60b --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/config/OpenApiConfig.java @@ -0,0 +1,38 @@ +package com.kamco.cd.kamcoback.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.servers.Server; +import java.util.List; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class OpenApiConfig { + + @Bean + public OpenAPI kamcoOpenAPI() { + return new OpenAPI() + .info( + new Info() + .title("KAMCO Change Detection API") + .description( + "KAMCO 변화 탐지 시스템 API 문서\n\n" + + "이 API는 지리공간 데이터를 활용한 변화 탐지 시스템을 제공합니다.\n" + + "GeoJSON 형식의 공간 데이터를 처리하며, PostgreSQL/PostGIS 기반으로 동작합니다.") + .version("v1.0.0") + // .contact(new Contact().name("KAMCO Development + // Team").email("dev@kamco.com").url("https://kamco.com")) + // .license(new License().name("Proprietary").url("https://kamco.com/license")) + ) + .servers( + List.of( + new Server().url("http://localhost:8080").description("로컬 개발 서버") + + // , new Server().url("https://dev-api.kamco.com").description("개발 서버") + // , new Server().url("https://api.kamco.com").description("운영 서버") + )) + .components(new Components()); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java b/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java new file mode 100644 index 00000000..eb8cc764 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java @@ -0,0 +1,42 @@ +package com.kamco.cd.kamcoback.config.api; + +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +/** + * ApiResponseDto의 내장된 HTTP 상태 코드를 실제 HTTP 응답에 적용하는 Advice + * + *

createOK() → 201 CREATED ok() → 200 OK deleteOk() → 204 NO_CONTENT + */ +@RestControllerAdvice +public class ApiResponseAdvice implements ResponseBodyAdvice { + + @Override + public boolean supports( + MethodParameter returnType, Class> converterType) { + // ApiResponseDto를 반환하는 경우에만 적용 + return returnType.getParameterType().equals(ApiResponseDto.class); + } + + @Override + public Object beforeBodyWrite( + Object body, + MethodParameter returnType, + MediaType selectedContentType, + Class> selectedConverterType, + ServerHttpRequest request, + ServerHttpResponse response) { + + if (body instanceof ApiResponseDto apiResponse) { + // ApiResponseDto에 설정된 httpStatus를 실제 HTTP 응답에 적용 + response.setStatusCode(apiResponse.getHttpStatus()); + } + + return body; + } +}