From dc2ffb3a2bd24f6ce6a1f6378be9b359986ec67a Mon Sep 17 00:00:00 2001 From: jihukimme Date: Wed, 10 Sep 2025 15:25:10 +0900 Subject: [PATCH 1/4] feature: FastAPI Ping Test --- .../health/api/HealthCheckController.java | 33 ++++++++++++++++ .../common/health/service/FastApiClient.java | 39 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/common/health/service/FastApiClient.java diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java new file mode 100644 index 00000000..b4f077d9 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java @@ -0,0 +1,33 @@ +package com.gltkorea.icebang.common.health.api; + +import com.gltkorea.icebang.common.health.service.FastApiClient; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api") +@RequiredArgsConstructor +public class HealthCheckController { + + private final FastApiClient fastApiClient; + + /** + * Spring Boot와 FastAPI 서버 간의 연결 상태를 확인하는 헬스 체크 API + * @return FastAPI 서버로부터의 응답 + */ + @GetMapping("/ping") + public ResponseEntity pingFastApi() { + String result = fastApiClient.ping(); + + if (result.startsWith("ERROR")) { + // FastAPI 연결 실패 시 503 Service Unavailable 상태 코드와 함께 에러 메시지 반환 + return ResponseEntity.status(503).body(result); + } + + // 성공 시 200 OK 상태 코드와 함께 FastAPI로부터 받은 응답("PONG" 등) 반환 + return ResponseEntity.ok(result); + } +} \ No newline at end of file diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/service/FastApiClient.java b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/service/FastApiClient.java new file mode 100644 index 00000000..5dbf5143 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/service/FastApiClient.java @@ -0,0 +1,39 @@ +package com.gltkorea.icebang.common.health.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +@Slf4j +@Service +@RequiredArgsConstructor +public class FastApiClient { + + // WebConfig에서 생성하고 타임아웃이 설정된 RestTemplate Bean을 주입받습니다. + private final RestTemplate restTemplate; + + // FastAPI 서버의 ping 엔드포인트 URL을 상수로 하드코딩합니다. + private static final String FASTAPI_PING_URL = "http://localhost:8000/ping"; + + /** + * FastAPI 서버의 /ping 엔드포인트를 호출하여 연결을 테스트합니다. + * @return 연결 성공 시 FastAPI로부터 받은 응답, 실패 시 에러 메시지 + */ + public String ping() { + log.info("Attempting to connect to FastAPI server at: {}", FASTAPI_PING_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; + } catch (RestClientException e) { + // RestClientException은 연결 실패, 타임아웃 등 모든 통신 오류를 포함합니다. + log.error("Failed to connect to FastAPI server at {}. Error: {}", FASTAPI_PING_URL, e.getMessage()); + return "ERROR: Cannot connect to FastAPI"; + } + } +} From e6509482df30dac6cd8c0abb1afbe14b894919e4 Mon Sep 17 00:00:00 2001 From: jihukimme Date: Wed, 10 Sep 2025 15:33:10 +0900 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20API=20url=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/pre-processing-service/app/api/router.py | 2 +- .../icebang/common/health/api/HealthCheckController.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/pre-processing-service/app/api/router.py b/apps/pre-processing-service/app/api/router.py index 683f42a7..dce62c5c 100644 --- a/apps/pre-processing-service/app/api/router.py +++ b/apps/pre-processing-service/app/api/router.py @@ -17,7 +17,7 @@ #모듈 테스터를 위한 endpoint -> 추후 삭제 예정 api_router.include_router(test.router, prefix="/tests", tags=["Test"]) -@api_router.get("/") +@api_router.get("/ping") async def root(): return {"message": "서버 실행중입니다."} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java index b4f077d9..bf83b8be 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java @@ -8,7 +8,6 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/api") @RequiredArgsConstructor public class HealthCheckController { From 67f4ec832d2688eb3a8c960f0f150d91eb43b63a Mon Sep 17 00:00:00 2001 From: jihukimme Date: Wed, 10 Sep 2025 15:38:08 +0900 Subject: [PATCH 3/4] refactor: Code Formatting --- .../health/api/HealthCheckController.java | 40 ++++++++------- .../common/health/service/FastApiClient.java | 49 ++++++++++--------- 2 files changed, 47 insertions(+), 42 deletions(-) diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java index bf83b8be..823272b2 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java @@ -1,32 +1,34 @@ package com.gltkorea.icebang.common.health.api; -import com.gltkorea.icebang.common.health.service.FastApiClient; -import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.gltkorea.icebang.common.health.service.FastApiClient; + +import lombok.RequiredArgsConstructor; + @RestController @RequiredArgsConstructor public class HealthCheckController { - private final FastApiClient fastApiClient; + private final FastApiClient fastApiClient; - /** - * Spring Boot와 FastAPI 서버 간의 연결 상태를 확인하는 헬스 체크 API - * @return FastAPI 서버로부터의 응답 - */ - @GetMapping("/ping") - public ResponseEntity pingFastApi() { - String result = fastApiClient.ping(); + /** + * Spring Boot와 FastAPI 서버 간의 연결 상태를 확인하는 헬스 체크 API + * + * @return FastAPI 서버로부터의 응답 + */ + @GetMapping("/ping") + public ResponseEntity pingFastApi() { + String result = fastApiClient.ping(); - if (result.startsWith("ERROR")) { - // FastAPI 연결 실패 시 503 Service Unavailable 상태 코드와 함께 에러 메시지 반환 - return ResponseEntity.status(503).body(result); - } - - // 성공 시 200 OK 상태 코드와 함께 FastAPI로부터 받은 응답("PONG" 등) 반환 - return ResponseEntity.ok(result); + if (result.startsWith("ERROR")) { + // FastAPI 연결 실패 시 503 Service Unavailable 상태 코드와 함께 에러 메시지 반환 + return ResponseEntity.status(503).body(result); } -} \ No newline at end of file + + // 성공 시 200 OK 상태 코드와 함께 FastAPI로부터 받은 응답("PONG" 등) 반환 + return ResponseEntity.ok(result); + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/service/FastApiClient.java b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/service/FastApiClient.java index 5dbf5143..dac03786 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/service/FastApiClient.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/service/FastApiClient.java @@ -1,39 +1,42 @@ package com.gltkorea.icebang.common.health.service; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + @Slf4j @Service @RequiredArgsConstructor public class FastApiClient { - // WebConfig에서 생성하고 타임아웃이 설정된 RestTemplate Bean을 주입받습니다. - private final RestTemplate restTemplate; + // WebConfig에서 생성하고 타임아웃이 설정된 RestTemplate Bean을 주입받습니다. + private final RestTemplate restTemplate; - // FastAPI 서버의 ping 엔드포인트 URL을 상수로 하드코딩합니다. - private static final String FASTAPI_PING_URL = "http://localhost:8000/ping"; + // FastAPI 서버의 ping 엔드포인트 URL을 상수로 하드코딩합니다. + private static final String FASTAPI_PING_URL = "http://localhost:8000/ping"; - /** - * FastAPI 서버의 /ping 엔드포인트를 호출하여 연결을 테스트합니다. - * @return 연결 성공 시 FastAPI로부터 받은 응답, 실패 시 에러 메시지 - */ - public String ping() { - log.info("Attempting to connect to FastAPI server at: {}", FASTAPI_PING_URL); + /** + * FastAPI 서버의 /ping 엔드포인트를 호출하여 연결을 테스트합니다. + * + * @return 연결 성공 시 FastAPI로부터 받은 응답, 실패 시 에러 메시지 + */ + public String ping() { + log.info("Attempting to connect to FastAPI server at: {}", FASTAPI_PING_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; - } catch (RestClientException e) { - // RestClientException은 연결 실패, 타임아웃 등 모든 통신 오류를 포함합니다. - log.error("Failed to connect to FastAPI server at {}. Error: {}", FASTAPI_PING_URL, e.getMessage()); - return "ERROR: Cannot connect to FastAPI"; - } + 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; + } catch (RestClientException e) { + // RestClientException은 연결 실패, 타임아웃 등 모든 통신 오류를 포함합니다. + log.error( + "Failed to connect to FastAPI server at {}. Error: {}", FASTAPI_PING_URL, e.getMessage()); + return "ERROR: Cannot connect to FastAPI"; } + } } From 7326da0d5a7ec5a248306dccba11cacb0f42db7f Mon Sep 17 00:00:00 2001 From: jihukimme Date: Wed, 10 Sep 2025 15:38:55 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20PUBLIC=20Endpoints=EC=97=90=20/ping?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../icebang/config/security/endpoints/SecurityEndpoints.java | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/config/security/endpoints/SecurityEndpoints.java b/apps/user-service/src/main/java/com/gltkorea/icebang/config/security/endpoints/SecurityEndpoints.java index da658775..5236edef 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/config/security/endpoints/SecurityEndpoints.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/config/security/endpoints/SecurityEndpoints.java @@ -3,6 +3,7 @@ public enum SecurityEndpoints { PUBLIC( "/", + "/ping", "/v0/auth/login", "/api/public/**", "/health",