본문 바로가기
프로젝트/개인 프로젝트

[개인 프로젝트] - 아키텍처 구상

by 윈디개 2026. 1. 28.

데이터베이스는 NoSQL 중 MongoDB를 사용할 것까지 정했다. 이제 본격적으로 아키텍처를 구상하려고 한다.


1. 사용 언어

우선, Agentic AI 코드는 Visual Studio Code에서 Python으로 구현한 상태이다. 로컬 테스트까지 성공했으며, 외부에서 호출할 수 있는 API만 완성하면 되는 상태다.

 

결과물을 내놓기에 괜찮은 코드이지만, 연구 프로젝트에서는 웹 서비스 형태로 출시하기를 원해 대략적인 와이어프레임을 바이브 코딩으로 제작했고, 이제 본격적으로 백엔드 쪽 아키텍처를 구상하려고 한다.

 

웹 API 호출을 처리하는 것은 그동안 웹/앱 개발에 주로 사용해왔던 Spring Boot(Java)로 구현할 예정이다. 그런데 이때 문제는 Java 서버에서 Python 코드를 실행/호출해야 하는 상황이 발생한다는 점이다. 즉, "Spring Boot가 요청을 받고, Agentic AI(Python)를 트리거하며, 결과를 저장하고, 다시 조회해서 사용자에게 보여주는" 흐름을 설계해야 한다.


2. 아키텍처 구조

2.1. 떠올랐던 구조

 

그림에 대해서 설명하면 다음과 같다.

  • 사용자는 웹에서 여러 API를 호출한다.
  • 그중 'Agentic AI 실행하기' 버튼을 클릭하면 실행 API 요청이 들어온다.
  • Spring Boot는 해당 요청을 받으면, Python 코드 실행을 트리거한다.
    • Java가 직접 Python을 실행하거나, Python 서비스에 실행 요청을 보낸다.
  • Python 코드는 실행된 뒤, 결과들을 MongoDB에 저장한다.
  • MongoDB는 Java와 Python이 모두 접근 가능한 동일 네트워크 환경(VPC 등)에 존재한다고 가정한다.
  • 이후 Agentic AI(Python 코드) 실행이 완료되면 자동으로 결과 페이지로 이동하며 GET 요청이 들어온다.
  • Spring Boot는 GET 요청을 처리하면서 MongoDB에서 Python이 저장한 결과를 조회해 화면에 보여준다.

정리하면, Agentic AI 실행은 Python, API/화면 라우팅과 조회는 Spring Boot, 저장소는 MongoDB인 구조이다.

2.2. 처음 떠올린 구조 보완점

위에서는 러프하게 단순히 어떻게 진행되는지만 고려한 결과이고, 이제 구체적으로 어떤 점이 문제인지, 수정해야하는 점이 어떤 것들인지 구체적으로 생각해야 될 단계이다.

 

2.2.1. Spring Boot가 Python을 호출하는 방법

먼저 고려해야 될 점은 Spring Boot가 Python을 호출하는 방법에 대해서 생각해봐야 한다. 떠올릴 수 있는 방법은 다음과 같다.

  • Java에서 subprocess로 직접 실행하기
  • Python을 별도 서버(FastAPI 등)로 띄워 HTTP로 호출하기
  • 작업 큐(SQS/RabbitMQ/Kafka 등)로 비동기 실행하기

각 방법의 장단점에 대해서 정리해 보려고 한다.

 

1. Java에서 subprocess로 직접 실행하기

  • 장점
    • 다른 코드로 분리할 필요가 없으며, 하나의 서버를 통해 한 번에 배포 가능한 특징이 있다.
    • 초기 구현이 빠르다.
  • 단점
    • 코드가 깔끔할 거라고 단정짓긴 어렵다.
    • 서버 안정성 측면에서 리스크가 크다.
      • 파이썬 실행이 오래 걸리면 해당 요청 thread가 막히거나 타임아웃이 쉽게 난다.
      • 동시 요청이 들어오면 프로세스가 여러 개 떠서 서버가 터질 가능성이 커진다.
    • 운영 난이도가 올라간다.
      • 파이썬 런타임/패키지/모델 파일/환경변수 등 자바 서버 배포에 파이썬 환경까지 섞이게 된다.
      • 로그/에러 추적이 어려워 질 것으로 예상되고, 재시도나 중단 같은 제어가 어려워 질 것이다.
    • 결론적으로 "데모/프로토타입"에는 적합하지만, "서비스 운영"에서는 고려해보아야 할 방법이다.

2. Python을 별도 서버(FastAPI 등)로 띄워 HTTP로 호출하기

  • 장점
    • 파이썬을 별도 서버로 두기 때문에 역할 완전 분리가 가능해진다.
    • API 계약이 명확해진다.
      • Spring Boot는 "요청/응답"만 보면 되고, 파이썬은 "실행/저장"만 책임지면 된다.
    • 배포/확장/장애 격리가 쉬워진다.
      • 파이썬 쪽만 스케일 아웃하거나 장애가 나도 자바 서버까지 같이 죽을 확률이 줄어든다.
    • 가장 현실적인 서비스 구조로 판단된다.
  • 단점
    • 별도의 서버 비용이 발생할 가능성이 있다.
      • 다만 실제로는 큰 비용이라기 보다는 인스턴스 1개(또는 컨테이너 1개) 정도 더 늘리는 수준일 것 같다.
      • +) 또 다른 방법으로는 EC2 1대에 Docker 컨테이너를 이용해 Spring Boot 컨테이너, FastAPI 컨테이너로 분리하는 방법이 있다.
    • 네트워크/보안/인증(토큰)을 설계할 필요가 있을 것 같다.

3. 작업 큐(SQS/RabbitMQ/Kafka 등)로 비동기 실행하기

  • 장점
    • 긴 작업(Agentic AI)에 가장 잘 맞는 구조로 판단된다.
      • Agentic AI에 요청 -> 작업 등록 -> job_id 반환 -> 상태 조회 -> 완료 시 결과 조회
    • 재시도, 장애 복구, 트래픽 폭주 대응에 좋다.
  • 단점
    • 한번도 사용해보지 않은 서비스로, 조사 및 구현 난이도가 가장 높다.
    • 모니터링/메시지 포맷/중복 처리 같은 운영 고려사항이 필수로 따라온다.
    • 지금 단계에서는 과한 설계가 될 수 있다.

결과적으로, 작업 큐를 비동기적으로 실행하여 Java에서는 다른 요청이 들어와도 독립적으로 처리할 수 있게 하는 방법이 서비스 측면에서는 가장 이상적인 구조로 판단된다.

 

다만, 현실적으로 2월 11일까지 구현해야 하는 단계에서는 과설계가 될 가능성이 높다. 따라서 현재 단계에서는 "독립적으로 처리한다"는 목적을 달성하면서도 구현 난이도를 낮추고 Agentic AI 코드 자체의 안정화 및 리팩토링에 더 집중할 수 있는 별도의 FastAPI 서버를 두고, 필요할 때만 HTTP 요청을 통해 Python 코드를 실행하는 두 번째 방법이 가장 현실적인 선택으로 판단된다.

 

또한, 차후 서비스 규모가 확장되거나 요청 수가 증가하고, Agentic AI 실행 시간이 길어지는 경우에는 SQS, RabbitMQ, Kafka와 같은 작업 큐 기반 비동기 구조로 인프라를 확장, 전환하는 것도 충분히 고려할 수 있을 것이라 판단된다. 이를 통해 실행 작업의 안정성, 재시도 처리, 트래픽 제어 측면에서 보다 성숙한 서비스 구조로 발전시킬 수 있을 것으로 기대된다.

 

2.2.2. Java/Python이 MongoDB를 공유할 때 발생할 수 있는 문제점

그 다음으로 고려해야 할 점은 Java와 Python이 동일한 MongoDB를 공유할 경우 책임 분리를 어떻게 가져갈 것인지에 대한 문제이다.

 

우선, Java와 Python이 같은 VPC 내에서 하나의 MongoDB를 공유한다면, 각 컴포넌트가 어떤 역할로 DB에 접근하는지에 대한 명확한 기준이 필요하다고 판단된다. 현재 서비스는 사용자를 한 명으로 가정하고 연구 결과를 보여주는 것이 목적이기 때문에, 로그인 및 회원가입과 같은 사용자 관리 기능은 존재하지 않는다. 따라서 DB에 쓰기(write) 작업이 필요한 데이터는 Agentic AI 실행 로그 및 실행 결과 데이터 정도로 한정된다.

 

이러한 상황을 고려했을 때, Agentic AI를 실제로 수행하는 Python 쪽에서 실행 결과와 로그를 MongoDB에 저장하고, Java(Spring Boot)는 사용자 요청에 따라 저장된 결과를 조회(read)하여 화면에 전달하는 역할만 수행하는 구조가 적절하다고 판단된다.

 

차후 서비스가 확장되어 로그인 및 회원가입 기능이 추가되는 경우에도, 소셜 로그인 기반 구조를 채택한다면 Python을 활용한 Lambda 기반 처리 등을 통해 사용자 관련 데이터의 책임을 별도로 분리하는 방식이 가능할 것으로 보인다. 이는 Agentic AI 실행 로직과 사용자 인증-인가 로직을 분리하는 데에도 도움이 될 것이다.

 

정리하면, 현재 단계에서는 Java는 MongoDB에 대해 Read 역할만 담당하고, Python은 Write 역할을 담당하는 방식으로 책임을 분리하는 것이 가장 단순하면서도 명확한 구조라고 판단된다.