서버 간 통신 (FastAPI ↔ Spring)

유자·2026년 2월 21일

multi-modal-fraud-project

목록 보기
1/16

안녕하세요. 오늘은 자바로 만든 메인 서버와 파이썬으로 만든 AI 서버를 서로 통신하게 만드는 방법을 정리해 보겠습니다. 프로젝트를 진행하다 보면 비즈니스 로직은 spring boot로 처리하고, 인공지능 모델이나 복잡한 데이터 분석은 파이썬의 FastAPI로 처리해야 하는 경우가 많습니다. 이때 두 서버가 어떻게 대화하는지 아주 기초적인 단계부터 차근차근 알아보겠습니다.


1. 파이썬 서버 준비하기

먼저 인공지능 모델이 돌아갈 파이썬 서버를 구축합니다. 이 서버는 자바 서버의 요청을 기다렸다가 답장을 주는 역할을 합니다.

가장 먼저 터미널을 열고 가상환경을 세팅한 뒤 필요한 라이브러리를 설치합니다. 명령어는 다음과 같습니다.

pip install fastapi uvicorn

설치가 완료되면 main.py 파일을 만들고 아래 코드를 작성합니다. 서버 구동을 위해 코드 내부에는 부득이하게 문법상 필요한 기호를 사용했습니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/test")
def test_api():
    return {"message": "파이썬 서버가 성공적으로 응답했습니다"}

이제 터미널에서 서버를 실행합니다. 명령어는 uvicorn main:app --reload 입니다. 서버가 8000번 포트에서 실행되면 파이썬 쪽 준비는 끝납니다.


2. 스프링 부트 프로젝트 생성하기

이제 메인 서버인 자바 스프링 부트 프로젝트를 만듭니다. intelliJ의 spring boot initializer를 사용하면 편리하게 뼈대를 잡을 수 있습니다.

프로젝트 생성 시 추가해야 할 필수 라이브러리는 두 가지입니다. 외부와 웹으로 통신하기 위한 Spring Web 라이브러리와 코드를 간결하게 만들어주는 Lombok 라이브러리입니다. 자바 버전은 본인의 학습 환경에 맞는 버전을 선택하시면 됩니다. 설정이 끝나고 생성을 누른 뒤, 화면 우측 하단의 그레이들 빌드가 완전히 끝날 때까지 기다려줍니다.


3. 통신을 담당할 컨트롤러 만들기

스프링 부트 프로젝트 안에 있는 src 폴더, main 폴더, java 폴더를 차례로 열어줍니다. 본인이 설정한 패키지 경로를 따라 들어가서 controllers 라는 이름의 패키지 즉 폴더를 하나 새로 만듭니다. 자바에서 패키지 이름은 소문자로 작성하는 것이 규칙입니다.

스프링 부트 메인 서버와 파이썬 인공지능 서버를 연결하는 과정에서 가장 중요한 부분은 자바 진영의 컨트롤러를 구성하는 일입니다. 이 컨트롤러가 사용자의 요청을 가장 먼저 받아 파이썬 서버로 전달하는 안내데스크 역할을 하기 때문입니다.

생성한 폴더 안에 TestController.java 파일을 만들고 아래와 같이 코드를 작성합니다.

package com.fraud.detection.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class TestController {

    @GetMapping("/call-python")
    public String callPython() {
        String url = "http://localhost:8000/test";

        RestTemplate restTemplate = new RestTemplate();

        String response = restTemplate.getForObject(url, String.class);

        return response;
    }
}

더 깊이 파고들어, 코드를 복사해서 붙여넣는 것을 넘어 각 코드가 어떤 역할을 하는지 한 줄씩 자세히 분해해 보겠습니다.

  1. RestController 어노테이션 선언
    방금 만든 클래스 선언부 바로 윗줄에 골뱅이 기호와 함께 RestController 를 작성합니다. 이것은 스프링 프레임워크에게 이 자바 파일이 일반적인 객체가 아니라, 웹 브라우저나 외부 서버와 통신하며 데이터를 주고받는 특별한 안내데스크임을 알려주는 표지판 역할을 합니다.

  2. GetMapping으로 접속 경로 뚫기
    서버에 기능을 만들었으면 외부에서 찾아올 수 있는 주소인 엔드포인트가 필요합니다. 메서드 윗줄에 GetMapping 을 적고 괄호 안에 /call-python 이라는 경로를 지정합니다. 누군가 브라우저 주소창에 이 경로를 입력하고 접속하면, 스프링은 자동으로 그 아래에 작성된 메서드를 실행하게 됩니다.

  3. 통신 대상의 주소 설정
    이제 자바 서버가 파이썬 서버로 통신을 시도할 차례입니다. 자바가 전화를 걸기 위해서는 상대방의 번호를 알아야 합니다. 파이썬 서버가 실행 중인 로컬호스트 8000번 포트의 주소를 url 이라는 문자열 변수에 담아둡니다.

  4. RestTemplate을 이용한 외부 서버 호출 및 결과 반환
    스프링이 제공하는 RestTemplate 이라는 도구를 사용할 순서입니다. 이 도구는 자바 코드가 직접 HTTP 요청을 생성하고 다른 서버로 전송할 수 있게 해주는 아주 유용한 객체입니다. 먼저 객체를 새로 생성한 뒤 getForObject 라는 메서드를 실행합니다.
    이 메서드의 파라미터 중 하나인 .class는 해당 클래스의 메타데이터 즉 설계도를 의미합니다. 따라서 String.class를 전달하는 것은 파이썬 서버로부터 받은 JSON 혹은 텍스트 데이터를 자바의 String 객체로 변환하여 수신하겠다는 의사를 명확히 전달하는 과정입니다.
    결과적으로 getForObject는 앞서 저장한 파이썬 서버 주소로 GET 요청을 날리고, 파이썬 서버가 응답으로 돌려주는 JSON 데이터를 자바의 문자열 형태로 변환해서 가져오는 작업을 단 한 줄로 처리해 줍니다. 마지막으로 이렇게 가져온 결과값을 반환하면 클라이언트의 화면에 출력됩니다.

  5. 결과 반환 및 코드 최적화
    파이썬 서버로부터 받은 응답값은 response라는 변수에 담아 클라이언트에게 반환합니다. intelliJ에서는 이 변수를 생략하고 즉시 반환하는 인라인(Inline) 방식을 권장하기도 하지만, 코드의 흐름을 명확히 보여주기 위해 변수 할당 방식을 유지하였습니다.

이 구조를 완벽히 이해하면 추후 이미지 파일이나 복잡한 분석 데이터를 주고받는 아키텍처로 쉽게 확장할 수 있습니다.


4. 연동 테스트 진행하기

이제 모든 설정이 끝났습니다. 두 서버가 실제로 잘 대화하는지 확인해 볼 차례입니다.

첫째, 파이썬 서버가 터미널에서 정상적으로 돌아가고 있는지 확인합니다.
둘째, intelliJ에서 spring boot 메인 application 파일을 실행하여 서버를 켭니다.
셋째, 인터넷 브라우저 주소창에 localhost:8080/call-python 을 입력하고 접속합니다.

브라우저 화면에 파이썬 서버가 보낸 메시지가 정상적으로 출력된다면 두 서버 간의 통신에 성공한 것입니다.


이 과정을 통해 서로 다른 언어로 작성된 두 서버가 http 요청을 통해 데이터를 주고받는 기본 원리를 이해할 수 있습니다.

다음 포스팅에서는 단순한 텍스트 통신을 넘어, 멀티모달 프로젝트의 핵심인 이미지 파일을 서버 간에 주고받는 Multipart 요청 구현 방법을 다뤄보겠습니다.

0개의 댓글