본문 바로가기

백엔드 스터디

Python FastAPI와 스프링 부트 연동하기

안녕하세요! 1편에서는 Python FastAPI를 이용해 텍스트를 벡터로 변환하는 AI API 서버를 구축했습니다. 이번 2편에서는 Java Spring Boot 웹 서버에서 이 AI 서버를 호출하여 연동하는 과정을 자세히 알아보겠습니다.

1. Spring Boot 프로젝트 설정

먼저 AI 서버를 호출할 Java 웹 서버가 필요합니다. GitHub 저장소(hjk7902/java2ai)의 Web_Server 폴더가 이 역할을 합니다. 외부 API 호출을 위해 Spring Web 의존성이 필수적입니다.

 2. AI 서버 통신 로직 구현 (RestTemplate)

Spring Boot에서 외부 API를 호출할 때는 주로 RestTemplate이나 WebClient를 사용합니다. 여기서는 RestTemplate을 이용해 AI 서버와 통신하는 로직을 구현합니다.

application.yml 먼저, 호출할 AI 서버의 주소를 application.yml 파일에 정의하여 관리의 편의성을 높입니다.

YAML
 
ai:
  api:
    url: http://localhost:8001/emotion  # 1편에서 만든 AI 서버 주소

AiApiService.java (Service 계층) 실제로 AI 서버와 통신하는 서비스 클래스를 작성합니다.

Java
 
@Service
public class AiApiService {

    private final RestTemplate restTemplate = new RestTemplate();

    @Value("${ai.api.url}")
    private String aiApiUrl;

    // 텍스트를 받아 벡터를 반환하는 메서드
    public Map<String, Object> getVectorFromAiServer(String text) {
        // 1. AI 서버로 보낼 요청 데이터(Body) 생성
        Map<String, String> requestBody = new HashMap<>();
        requestBody.put("text", text);

        // 2. HTTP 헤더 설정 (JSON 타입 명시)
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // 3. HTTP 요청 엔티티(헤더 + Body) 생성
        HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);

        // 4. AI 서버에 POST 요청 보내고 응답 받기
        ResponseEntity<Map> response = restTemplate.postForEntity(aiApiUrl, entity, Map.class);

        // 5. 응답에서 Body만 추출하여 반환
        return response.getBody();
    }
}

코드 설명:

  • RestTemplate을 사용하여 지정된 aiApiUrl로 POST 요청을 보냅니다.
  • 요청 시 HttpEntity에 Body와 Content-Type: application/json 헤더를 담아 보냅니다.
  • AI 서버로부터 받은 응답({"vector": [...]})을 Map 형태로 반환합니다.

 3. Controller 작성 및 전체 흐름 연결

이제 클라이언트의 요청을 받아 AiApiService를 호출하고, 최종 결과를 반환하는 컨트롤러를 작성합니다.

ApiController.java (Controller 계층)

Java
 
@RestController
@RequiredArgsConstructor
public class ApiController {

    private final AiApiService aiApiService;

    @PostMapping("/java-service/vectorize")
    public Map<String, Object> vectorizeText(@RequestBody Map<String, String> requestData) {
        String textToVectorize = requestData.get("text");

        // AiApiService를 통해 Python AI 서버 호출
        return aiApiService.getVectorFromAiServer(textToVectorize);
    }
}
  • 클라이언트로부터 /java-service/vectorize 경로로 {"text": "..."} 형식의 POST 요청을 받습니다.
  • AiApiService의 메서드를 호출하여 AI 서버와 통신하고, 그 결과를 클라이언트에게 그대로 반환합니다.

 4. 전체 시스템 연동 테스트

이제 두 서버를 모두 실행하여 최종 연동 테스트를 진행합니다.

1. AI 서버 실행 (Python) 1편에서 만든 FastAPI 서버를 8001번 포트로 실행합니다.

Bash
 
# AI_Vector_Server 폴더로 이동 후
uvicorn main:app --host 0.0.0.0 --port 8001

2. 웹 서버 실행 (Java) Spring Boot 애플리케이션을 8080번 포트로 실행합니다.

3. 최종 테스트 (Postman) Postman으로 Java 서버의 /java-service/vectorize 엔드포인트를 호출합니다.

  • 메서드: POST
  • 주소: http://localhost:8080/java-service/vectorize
  • Body: raw, JSON 형식으로 아래 내용 입력
  • JSON
     
    {
        "text": "오늘 너무 우울해."
    }

요청을 보내면, Java 서버가 Python AI 서버를 호출하고 받은 벡터 결과를 우리에게 그대로 전달해주는 것을 확인할 수 있습니다.

 

이것으로 Java Spring Boot와 Python FastAPI AI 서버를 연동하는 전체 과정이 마무리되었습니다.