프로젝트를 Spring Boot(기본) + Flask(모델링) 조합으로 진행하려 했는데, 아무래도 모델링 기능이 주가 되다 보니 FastAPI로 통합하기로 했다. 현재는 Flask에서 구현했던 배경제거작업을 FastAPI로 옮겨놓은 상태다.
처음 Spring Boot를 선택한 이유는 이전 프로젝트에서 사용했던 경험이 있어 익숙했기 때문이다. 모델링 부분만 Flask로 가볍게 구현한 뒤 API로 데이터를 전달하려고 했다. 그러나 두 서버를 각각 배포하고 연결하는 것보다 FastAPI 하나로 통합하는 편이 여러 면에서 더 효율적이라고 판단해 비교적 초기에 프레임워크를 변경했다. 그래서 이번 글에서는 세 가지 프레임워크를 비교해보려고 한다.
0. 주요 특징 비교
Springboot | FastAPI | Flask | |
언어 | Java/Kotlin | Python | Python |
사용 | 대규모 애플리케이션, 엔터프라이즈 서비스 | 빠른 API 개발, 머신러닝 모델 배포 | 간단한 웹 애플리케이션, 프로토타입 개발 |
ORM | JPA(Hibernate) | SQLAlchemy | SQLAlchemy |
1. 디렉토리 구조 비교
Spring Boot처럼 정형화된 디렉토리 구조를 예상하며 FastAPI의 디렉토리 구조를 조사해본 결과, FastAPI는 특정 구조를 강제하지 않고 유연한 설계를 지원한다. 일반적으로는 API 엔드포인트를 정의하는 routers, 애플리케이션 진입점을 담당하는 main.py, 그리고 데이터 모델을 정의하는 models 등으로 크게 구분하여 구성한다.
Springboot: 명확한 표준 구조(계층적 설계 권장); 계층적 설계(Service, Repository, Controller)를 권장하며, 기본적인 Maven/Gradle 프로젝트 구조를 따른다. (대규모 프로젝트에서 유지보수성과 확장성이 뛰어나다.)
├── src/main/java
├── com.example.project
├── controller
├── service
└── repository
FastAPI, Flask: 최소한의 구조 제공하며 단순, 사용자가 구조를 자유롭게 정의 가능
├── main.py
├── routers/
└── models/
2. 비동기 지원
- Spring Boot:
동기적 처리 방식이 기본이며, 비동기 작업은 추가 설정 및 라이브러리가 필요하다. 상대적으로 무거운 JVM 기반으로 성능은 낮지만 안정성과 확장성이 강점이다. - Flask:
기본적으로 동기적 요청 처리를 한다. 비동기 작업이 필요한 경우 외부 라이브러리나 설정이 필요하며, 속도가 제한적이다. - FastAPI:
ASGI 기반으로 비동기 처리를 기본적으로 지원한다. Python의 async/await 키워드를 활용하여 대규모 트래픽을 효율적으로 처리하며, 특히 실시간 API와 모델 배포에 최적화되어 있다. ->모델링에 시간이 많이걸리는 우리 프로젝트에 적합
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/async-example")
async def async_example():
await asyncio.sleep(2) # 비동기적으로 2초 대기
return {"message": "This response is asynchronous!"}
3. 우리 프로젝트와의 적합성
- FastAPI는 비동기 처리 성능, 경량화된 배포, 그리고 자동화된 API 문서화(OpenAPI/Swagger)를 통해 생산성을 극대화한다.
- 두 서버(Spring Boot와 Flask)를 분리하지 않고 하나로 통합함으로써 배포와 유지보수가 단순화되며, 머신러닝 모델과의 긴밀한 통합이 가능하다.
FastAPI는 비동기 I/O를 지원하므로, 배경제거와 같은 긴 작업이 진행되는 동안 다른 요청을 동시에 처리할 수 있다고 한다. 예를 들어, 이미지 배경제거 작업이 진행되는 동안 다른 사용자 요청을 처리하거나, 추가적인 모델링 작업을 병렬로 실행할 수 있다. 이로 인해 시스템 전체의 처리 성능이 향상되며, 사용자 대기 시간을 최소화할 수 있다.
반면, WSGI 기반 프레임워크는 요청을 순차적으로 처리하므로, 한 요청에 대해 느린 작업이 발생하면 그 이후의 요청들이 지연되거나 차단될 수 있다. 즉, 하나의 긴 작업이 끝날 때까지 다른 요청을 처리하지 못하는 병목 현상이 발생할 수 있다.
우리 프로젝트에서도 모델링과 파일 추출 작업이 끝난 후, 결과 데이터를 실시간으로 사용자에게 제공해야 할 경우가 많다. FastAPI는 이를 비동기적으로 처리할 수 있어, 응답 시간을 최소화하고 효율적인 리소스 활용이 가능할 것으로 기대하고 있다.
결론: 확실히 Springboot에 비해 python기반의 FastAPI가 이름답게 자유로운 것이 느껴진다. 시간적 여유를 가지고는 Springboot를 들여다보며 공부하고, 빠르게 구현해야한다면 FastAPI로 입문을 추천한다. 나는 아직 Springboot가 더 익숙하지만 FastAPI 로 프로젝트를 다 완성한 후에 후기도 이곳에 추가로 남겨볼 것이다.!
'캡스톤' 카테고리의 다른 글
[PIFuHD] 2D 이미지 to 3D 모델링(.obj) 2024.Ver (2) | 2024.12.02 |
---|---|
[OpenCV] 사진/동영상 배경제거 작업 (6) | 2024.11.03 |