스크래치부터 실시간 AI 기반 웹 플랫폼 구축: 복잡성과 규모에 대한 교훈
Source: Dev.to

왜 이 프로젝트를 만들었는가
AI는 어디에나 있지만, 실제 웹 애플리케이션에 대규모로 통합하는 일은 여전히 복잡합니다. 대부분의 튜토리얼은 장난감 예시만 보여줍니다: “AI + 웹 = 마법.” 실제로 배포하고, 보안하고, 최적화하려고 하면 전혀 다른 난관이 나타납니다.
저는 반응형이며 AI 기반이고 완전 웹 네이티브인 플랫폼을 만들고 싶었지만, 동시에 유지보수 가능하고 성능도 뛰어나야 했습니다. 이 글에서는 제가 취한 접근 방식, 저지른 실수들, 그리고 발견한 해결책들을 다룹니다.
아키텍처 도전 과제
전체적으로 시스템은 다음을 만족해야 했습니다:
- 수천 명의 동시 사용자가 실시간 UI를 사용할 수 있어야 함.
- 서버에 과부하를 주지 않으면서 AI 기반 요청을 처리해야 함.
- 모든 사용자 인터랙션에 대해 지연 시간을 150 ms 이하로 유지해야 함.
- 프론트엔드와 AI 파이프라인이 독립적으로 진화할 수 있도록 모듈화되어야 함.
기술 스택
- 프론트엔드: React + Next.js
- 백엔드: Node.js + Fastify
- AI 워크로드: Python + PyTorch
핵심 설계 결정
AI 추론을 백엔드에 밀접하게 결합하는 대신, AI를 마이크로서비스 파이프라인으로 분리하고 WebSocket 및 Redis Pub/Sub을 통해 통신하도록 했습니다. 이를 통해 웹 트래픽과 별개로 AI 워크로드를 독립적으로 확장할 수 있었습니다.
AI 파이프라인 설계
flowchart TD
A[User Request] --> B[Frontend: React + WebSockets]
B --> C[Backend: Fastify + API Gateway]
C --> D[AI Microservice (Python + PyTorch)]
D --> E[Redis Pub/Sub Queue]
E --> F[Response Aggregator]
F --> B
핵심 교훈
- 비동기 추론은 메인 API 스레드가 블로킹되는 것을 방지합니다.
- Redis Pub/Sub은 AI 요청 처리와 API 요청을 분리합니다.
- AI 요청을 배치하면 GPU 활용도가 약 3배 향상됩니다.
확장 문제 및 해결책
| 문제 | 해결책 |
|---|---|
| AI 추론 중 메모리 누수 | 자동 가비지 컬렉션 훅을 구현하고 사용되지 않는 텐서를 즉시 해제했습니다. |
| 높은 동시성에서 WebSocket 업데이트 지연 | 메시지 압축 + 클라이언트별 스로틀링을 추가했습니다. 지연 시간이 350 ms → 120 ms 로 감소했습니다. |
| 스트리밍 AI 응답 중 프론트엔드 재렌더링으로 UI가 끊김 | React Suspense와 메모이제이션을 사용하고, 토큰 배치가 도착할 때만 DOM을 업데이트하는 스트리밍 컴포넌트를 도입했습니다. |
AI + 웹 통합 팁
- AI는 서비스로 취급하고, 백엔드에 단일 모놀리식으로 두지 마세요.
- 가시성은 절대 타협할 수 없습니다: 로깅, 트레이싱, 메트릭, 헬스 체크가 시간을 절약해 줍니다.
- 엣지 캐싱은 정적인 AI 결과에 큰 효과를 발휘합니다.
배운 점
- 복잡성은 피할 수 없으니 모듈화를 받아들이세요.
- 비동기 파이프라인이 최고의 친구입니다.
- 실시간 AI가 모든 곳에서 실시간일 필요는 없습니다—핵심 경로만 최적화하세요.
- 일찍 배포하고, 빠르게 반복하며, 모든 것을 로깅하세요.
TL;DR
AI를 웹 앱에 통합하면서 서버가 다운되지 않게 하려면:
- AI는 마이크로서비스로 분리하세요.
- 요청을 배치하고 스로틀링하세요.
- 적절한 가시성을 갖춘 비동기 파이프라인을 사용하세요.
- 프론트엔드 스트리밍을 최적화하세요.
이 아키텍처 덕분에 수천 명의 동시 사용자를 낮은 지연 시간으로 서비스할 수 있었으며, 시스템은 이제 프로덕션 수준으로 준비되었습니다.