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 new file mode 100644 index 00000000..823272b2 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/api/HealthCheckController.java @@ -0,0 +1,34 @@ +package com.gltkorea.icebang.common.health.api; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +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; + + /** + * 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); + } +} 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..dac03786 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/common/health/service/FastApiClient.java @@ -0,0 +1,42 @@ +package com.gltkorea.icebang.common.health.service; + +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; + + // 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"; + } + } +} 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",