SoundView

SoundView

2026년 2월 23일 - 2026년 3월 30일

Tech Stack

python
python
java
java
springboot
springboot
fastapi
fastapi

📋 [SoundView]

청각장애인을 위한 AI 기반 영상 자막 생성 및 햅틱 변환 서비스. 소리의 감각을 시각과 촉각으로 변환해서 청각장애인이 영상을 실감나게 시청할 수 있도록 도와줍니다.

👤 내 역할

역할백엔드(FastAPI), 팀장, 발표
담당 파트FastAPI를 활용한 GPU 서버 구축, 학습된 AI 모델 서빙

🛠️ 기술 스택

BackendJava 17, Spring Boot 3.5.9, Spring Data JPA, Spring Security (OAuth2), JWT (0.12.3), WebSocket
FrontendReact 19.2.0, TypeScript, Node.js v24.12.0
AIPython 3.9.23, FastAPI
Database & MessagingMySQL 8.0.43, Redis (Alpine), RabbitMQ 3 (Management)
InfrastructureAWS (EC2, S3, CloudFront), Docker / Docker Compose v3.8, Jenkins LTS, Nginx

⚠️ 트러블 슈팅

🚨 메세지 큐를 활용한 시스템 무결성 확보 및 종속성 개선

구분상세 내용
🛑 문제 : 장애 발생 시 데이터 유실 리스크
AI 서버(SoundView 오디오 처리)에 일시적인 장애나 지연이 발생할 경우, 백엔드에서 전송한 핵심 데이터가 그대로 유실될 수 있는 위험 존재
🔍 원인 : 서버 간의 강한 종속성
백엔드 서버와 AI 서버가 직접적으로 연결되어 있어 한쪽의 장애가 다른 쪽의 정상적인 비즈니스 로직 수행까지 방해하는 구조적 한계
🛠️ 해결 : RabbitMQ 기반의 비동기 메시지 큐 아키텍처 도입
대규모 인프라에 적합하지만 오버헤드가 큰 Kafka 대신, 작업 할당 패턴에 최적화되고 처리 상태(ACK/Nack) 관리가 직관적인 RabbitMQ를 선택하여 각 서버의 기능을 독립적으로 분리
✨ 결과 : 결합도 완화 및 무결점 아키텍처 달성
1. AI 서버에 장애가 발생해도 요청 데이터가 큐에 보존되어 복구 시 안전하게 재처리 가능
2. 백엔드는 MQ에 요청을 던지기만 하도록 역할을 분리하여, 시스템 확장성과 개발 편의성 대폭 향상

🚨 비동기 처리 지연 시 데이터 접근성 유지 및 Queue 안정성 확보

구분상세 내용
🛑 문제 : 비동기 작업 적체 시 데이터 접근 권한 만료 위험
대규모 영상 데이터가 RabbitMQ에 쌓여 처리가 지연될 경우 기존의 Pre-signed URL 방식은 유효 기간 만료로 인해 AI 서버에서 데이터에 접근하지 못할 가능성이 있음.
🔍 원인 : Pre-signed URL의 유효 기간 제약
보안을 위해 생성하는 Pre-signed URL은 일정 시간이 지나면 폐기됨. 비동기 환경에서 Consumer(FastAPI)의 처리 속도가 Producer(Spring Boot)의 발행 속도를 따라가지 못할 경우, 실제 처리 시점에 링크가 만료되는 구조적 결함 확인
🛠️ 해결 : S3 Object Key 전달 및 도메인 기반 접근 방식 채택
1. 큐에는 만료 시간이 없는 S3 고유 Key 값만 전달하여 데이터 식별
2. FastAPI 서버에서
.env로 관리되는 도메인 정보와 Key를 조합하여 영상에 접근하도록 설계하여 시간 제약 제거
✨ 결과 : 대규모 비동기 처리 가용성 극대화
1. 영상 처리 대기 시간이 길어져도 데이터 접근 실패가 발생하지 않아 큐 적체 대응력 확보
2. 불필요한 URL 재생성 로직이 사라짐. 서버 리소스 최적화 및 시스템 간 통신 효율성 증대
3. 안정적인 비동기 파이프라인 구축으로 대량의 영상 분석 작업 시에도 높은 처리 성공률 유지

📚 배운 점

Trade-Off를 고려한 기술 선택

단순 최신 기술 도입이 아닌, 기술별 한계(Thread Pool의 데이터 휘발 등)를 분석하여 시스템 환경에 최적화된 도구(RabbitMQ)를 선택하는 의사결정 역량 향상.
보안(Pre-signed URL)과 대규모 비동기 가용성(S3 Object Key) 사이의 트레이드오프를 고민하며 내부망 아키텍처에 맞는 가장 효율적인 데이터 접근 방식을 설계하는 시야 확장.

느슨한 결합의 중요성

Spring Boot와 FastAPI 간의 직접적인 상태 의존성 제거, 컴포넌트 간 독립적 동작 보장.
특정 서버의 장애가 전체 시스템 마비로 이어지지 않는 가용성의 중요성을 체감했습니다

사용자 중심의 설계 사고

무거운 AI 처리 로직을 비동기로 분리하여 사용자 경험(UX)을 개선
큐 병목 현상으로 인해 발생할 수 있는 “데이터 만료”라는 엣지 케이스까지 선제적으로 해결하며 확장성 있는 백엔드 시스템 구축 철학 확립

📊 성과

💡 측정 아이디어 1: 카오스 테스트 (장애 복구율 측정)
금융권이나 공공 인프라에서 가장 좋아하는 수치인 **'장애 시 데이터 유실률 0%'**를 증명하는 방법입니다.

1.
Spring Boot 서버를 켜고 영상을 연속으로 50개~100개 업로드 요청을 보냅니다. (메시지 큐에 쌓이게 됨)
2.
이때 의도적으로 FastAPI 서버를 강제 종료(Kill)합니다.
3.
5분 정도 뒤에 FastAPI 서버를 다시 켭니다.
4.
FastAPI 서버가 큐에 쌓여있던 50~100개의 데이터를 하나도 빠짐없이 처리하는지 확인합니다.
👉 포트폴리오 적용: ✅ 장애 시뮬레이션(Chaos Test) 결과: AI 서버 강제 다운 및 재기동 상황에서 대기 중인 요청 100건에 대해 데이터 유실률 0% 및 100% 자동 재처리 달성

💡 측정 아이디어 2: 로직 간소화 (코드 라인 수 감소)
개발 편의성이 좋아졌다는 것을 '코드의 복잡도 감소'로 수치화하는 방법입니다.

1.
기존에 동기식(HTTP API)으로 호출할 때 짰어야 했던 코드(타임아웃 처리, 재시도 로직, 에러 핸들링 등)의 줄 수(Lines of Code)를 대략 계산해 봅니다.
2.
RabbitMQ에 publish만 하는 현재 코드의 줄 수와 비교합니다.
👉 포트폴리오 적용: ✅ 통신 모듈 코드 복잡도 감소: 복잡한 동기식 예외 처리 및 재시도 로직을 MQ 발행 로직으로 대체하여 통신 관련 코드 라인 수(LOC) 약 00% 감소

📸 스크린샷

Notion Image