From bd1d5a624780256d88a731560082eb22304dc27e Mon Sep 17 00:00:00 2001 From: jihukimme Date: Wed, 10 Sep 2025 18:09:29 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20health=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EB=B0=8F=20=ED=8C=8C=EC=9D=BC=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../health/{api => controller}/HealthCheckController.java | 8 ++++---- .../{FastApiClient.java => HealthCheckService.java} | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) rename apps/user-service/src/main/java/site/icebang/common/health/{api => controller}/HealthCheckController.java (80%) rename apps/user-service/src/main/java/site/icebang/common/health/service/{FastApiClient.java => HealthCheckService.java} (97%) diff --git a/apps/user-service/src/main/java/site/icebang/common/health/api/HealthCheckController.java b/apps/user-service/src/main/java/site/icebang/common/health/controller/HealthCheckController.java similarity index 80% rename from apps/user-service/src/main/java/site/icebang/common/health/api/HealthCheckController.java rename to apps/user-service/src/main/java/site/icebang/common/health/controller/HealthCheckController.java index 8b65e7a0..62365cd6 100644 --- a/apps/user-service/src/main/java/site/icebang/common/health/api/HealthCheckController.java +++ b/apps/user-service/src/main/java/site/icebang/common/health/controller/HealthCheckController.java @@ -1,4 +1,4 @@ -package site.icebang.common.health.api; +package site.icebang.common.health.controller; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -6,13 +6,13 @@ import lombok.RequiredArgsConstructor; -import site.icebang.common.health.service.FastApiClient; +import site.icebang.common.health.service.HealthCheckService; @RestController @RequiredArgsConstructor public class HealthCheckController { - private final FastApiClient fastApiClient; + private final HealthCheckService healthCheckService; /** * Spring Boot와 FastAPI 서버 간의 연결 상태를 확인하는 헬스 체크 API @@ -21,7 +21,7 @@ public class HealthCheckController { */ @GetMapping("/ping") public ResponseEntity pingFastApi() { - String result = fastApiClient.ping(); + String result = healthCheckService.ping(); if (result.startsWith("ERROR")) { // FastAPI 연결 실패 시 503 Service Unavailable 상태 코드와 함께 에러 메시지 반환 diff --git a/apps/user-service/src/main/java/site/icebang/common/health/service/FastApiClient.java b/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java similarity index 97% rename from apps/user-service/src/main/java/site/icebang/common/health/service/FastApiClient.java rename to apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java index 8d8ff496..98366f11 100644 --- a/apps/user-service/src/main/java/site/icebang/common/health/service/FastApiClient.java +++ b/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java @@ -10,7 +10,7 @@ @Slf4j @Service @RequiredArgsConstructor -public class FastApiClient { +public class HealthCheckService { // WebConfig에서 생성하고 타임아웃이 설정된 RestTemplate Bean을 주입받습니다. private final RestTemplate restTemplate; From eee8bf3e23b457d4bc6d8d1ce79eb7f2bc8b4a76 Mon Sep 17 00:00:00 2001 From: jihukimme Date: Thu, 11 Sep 2025 16:32:43 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat(config):=20@ConfigurationProperties?= =?UTF-8?q?=EB=A1=9C=20=ED=83=80=EC=9E=85-=EC=95=88=EC=A0=84=ED=95=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EA=B4=80=EB=A6=AC=20=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존의 @Value나 하드코딩 방식은 오타에 취약하고, 설정값 누락 시 런타임 오류를 유발할 수 있는 타입 불안전성 문제가 있었습니다. 이를 해결하기 위해 @ConfigurationProperties를 사용하는 `FastApiProperties` 클래스를 도입하여 FastAPI 연동 설정을 중앙화하고, 애플리케이션 시작 시점에 설정값의 타입과 유효성을 검증하도록 개선했습니다. 이를 통해 잠재적인 런타임 장애를 원천 차단하고, 코드의 안정성과 유지보수성을 크게 향상시켰습니다. --- .../health/service/HealthCheckService.java | 20 ++++--------- .../config/properties/FastApiProperties.java | 30 +++++++++++++++++++ .../src/main/resources/application.yml | 8 ++++- 3 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 apps/user-service/src/main/java/site/icebang/global/config/properties/FastApiProperties.java diff --git a/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java b/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java index 98366f11..b6a1ab75 100644 --- a/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java +++ b/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java @@ -3,6 +3,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import site.icebang.global.config.properties.FastApiProperties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -12,30 +13,21 @@ @RequiredArgsConstructor public class HealthCheckService { - // WebConfig에서 생성하고 타임아웃이 설정된 RestTemplate Bean을 주입받습니다. private final RestTemplate restTemplate; - // FastAPI 서버의 ping 엔드포인트 URL을 상수로 하드코딩합니다. - private static final String FASTAPI_PING_URL = "http://localhost:8000/ping"; + private final FastApiProperties fastApiProperties; /** * FastAPI 서버의 /ping 엔드포인트를 호출하여 연결을 테스트합니다. - * - * @return 연결 성공 시 FastAPI로부터 받은 응답, 실패 시 에러 메시지 */ public String ping() { - log.info("Attempting to connect to FastAPI server at: {}", FASTAPI_PING_URL); + String url = fastApiProperties.getUrl() + "/ping"; + log.info("Attempting to connect to FastAPI server at: {}", url); try { - // FastAPI 서버에 GET 요청을 보내고, 응답을 String으로 받습니다. - // WebConfig에 설정된 5초 타임아웃이 여기서 적용됩니다. - String response = restTemplate.getForObject(FASTAPI_PING_URL, String.class); - log.info("Successfully received response from FastAPI: {}", response); - return response; + return restTemplate.getForObject(url, String.class); } catch (RestClientException e) { - // RestClientException은 연결 실패, 타임아웃 등 모든 통신 오류를 포함합니다. - log.error( - "Failed to connect to FastAPI server at {}. Error: {}", FASTAPI_PING_URL, e.getMessage()); + log.error("Failed to connect to FastAPI server at {}. Error: {}", url, e.getMessage()); return "ERROR: Cannot connect to FastAPI"; } } diff --git a/apps/user-service/src/main/java/site/icebang/global/config/properties/FastApiProperties.java b/apps/user-service/src/main/java/site/icebang/global/config/properties/FastApiProperties.java new file mode 100644 index 00000000..c5ccbee5 --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/global/config/properties/FastApiProperties.java @@ -0,0 +1,30 @@ +package site.icebang.global.config.properties; + +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; + +/** + * FastAPI 연동을 위한 설정값을 application.yml에서 바인딩하는 클래스 + */ +@Getter +@Setter +@Component // Component로 등록하여 Spring이 Bean으로 관리하도록 함 +@ConfigurationProperties(prefix = "api.fastapi") // yml의 "api.fastapi" 접두사를 가진 설정을 매핑 +@Validated // 아래의 유효성 검사 어노테이션을 활성화 +public class FastApiProperties { + + /** + * FastAPI 서버의 기본 URL + */ + @NotBlank // 값이 비어있을 수 없음을 검증 + private String url; + + /** + * API 호출 시 적용될 타임아웃 (밀리초 단위) + */ + private int timeout = 5000; // 기본값 5초 설정 +} diff --git a/apps/user-service/src/main/resources/application.yml b/apps/user-service/src/main/resources/application.yml index d0357684..d6f68b0e 100644 --- a/apps/user-service/src/main/resources/application.yml +++ b/apps/user-service/src/main/resources/application.yml @@ -10,4 +10,10 @@ spring: mybatis: # Mapper XML 파일 위치 mapper-locations: classpath:mapper/**/*.xml - type-handlers-package: site.icebang.config.mybatis.typehandler \ No newline at end of file + type-handlers-package: site.icebang.config.mybatis.typehandler + +# 외부 API 연동을 위한 설정 섹션 +api: + fastapi: + url: http://pre-processing-service:8000 # FastAPI 서버의 기본 URL + timeout: 10000 # API 요청 타임아웃 (밀리초 단위) \ No newline at end of file From b83bf0723079a12307ffed184104ed383e939dd4 Mon Sep 17 00:00:00 2001 From: jihukimme Date: Thu, 11 Sep 2025 16:51:17 +0900 Subject: [PATCH 3/3] refactor: Code Formatting --- .../health/service/HealthCheckService.java | 7 +++--- .../config/properties/FastApiProperties.java | 25 ++++++++----------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java b/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java index b6a1ab75..30dc6373 100644 --- a/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java +++ b/apps/user-service/src/main/java/site/icebang/common/health/service/HealthCheckService.java @@ -3,11 +3,12 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -import site.icebang.global.config.properties.FastApiProperties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import site.icebang.global.config.properties.FastApiProperties; + @Slf4j @Service @RequiredArgsConstructor @@ -17,9 +18,7 @@ public class HealthCheckService { private final FastApiProperties fastApiProperties; - /** - * FastAPI 서버의 /ping 엔드포인트를 호출하여 연결을 테스트합니다. - */ + /** FastAPI 서버의 /ping 엔드포인트를 호출하여 연결을 테스트합니다. */ public String ping() { String url = fastApiProperties.getUrl() + "/ping"; log.info("Attempting to connect to FastAPI server at: {}", url); diff --git a/apps/user-service/src/main/java/site/icebang/global/config/properties/FastApiProperties.java b/apps/user-service/src/main/java/site/icebang/global/config/properties/FastApiProperties.java index c5ccbee5..24fa309d 100644 --- a/apps/user-service/src/main/java/site/icebang/global/config/properties/FastApiProperties.java +++ b/apps/user-service/src/main/java/site/icebang/global/config/properties/FastApiProperties.java @@ -1,15 +1,14 @@ package site.icebang.global.config.properties; -import jakarta.validation.constraints.NotBlank; -import lombok.Getter; -import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; -/** - * FastAPI 연동을 위한 설정값을 application.yml에서 바인딩하는 클래스 - */ +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +/** FastAPI 연동을 위한 설정값을 application.yml에서 바인딩하는 클래스 */ @Getter @Setter @Component // Component로 등록하여 Spring이 Bean으로 관리하도록 함 @@ -17,14 +16,10 @@ @Validated // 아래의 유효성 검사 어노테이션을 활성화 public class FastApiProperties { - /** - * FastAPI 서버의 기본 URL - */ - @NotBlank // 값이 비어있을 수 없음을 검증 - private String url; + /** FastAPI 서버의 기본 URL */ + @NotBlank // 값이 비어있을 수 없음을 검증 + private String url; - /** - * API 호출 시 적용될 타임아웃 (밀리초 단위) - */ - private int timeout = 5000; // 기본값 5초 설정 + /** API 호출 시 적용될 타임아웃 (밀리초 단위) */ + private int timeout = 5000; // 기본값 5초 설정 }