$cat projects/4/README.md

DreamsComeTrue

2024.10 - 2024.113FE 3BEBackend Developer삼성 청년 SW 아카데미 11기 자율 프로젝트

꿈을 적으면 생성형 AI가 숏폼 영상으로 만들어 주는 서비스. 꿈을 기록해 두고, 다시 떠올리고 싶을 때 영상으로 꺼내 볼 수 있습니다.

Spring BootJavaDockerRabbitMQChatGPTLUMA AIMidjourneyMySQLRedis
▸ github
$cat overview.md

꿈을 적으면 숏폼 영상으로 만들어 주는 서비스입니다. ChatGPT가 장면을 나누고, Midjourney가 그림을 그리고, LUMA AI가 영상으로 잇습니다.

세 서비스 모두 느리고(총 10~20분) 불안정해서, 그 불안정을 어떻게 흡수하느냐가 이 프로젝트의 핵심 과제였습니다. AI 서비스마다 큐를 나눈 RabbitMQ 기반 비동기 파이프라인으로 긴 처리 시간을 요청 스레드에서 떼어내고, 단계별 재시도와 데드레터 큐로 한 단계의 실패가 전체로 번지지 않게 했습니다.

백엔드에서는 비동기 파이프라인과 작업 상태 추적, Docker Compose 기반 실행 환경, JWT 인증과 Google, Kakao 소셜 로그인을 맡았습니다.

$cat role.md
$cat highlights.md
생성형 AI 파이프라인 연동

ChatGPT, Midjourney, LUMA AI 등 여러 생성형 AI 서비스를 통합하여 사용자의 꿈 데이터를 자동으로 숏폼 영상으로 변환하는 파이프라인을 구축했습니다. 각 AI 서비스의 API를 안정적으로 호출하고, 응답을 처리하며, 실패 시 재시도 로직을 구현했습니다.

RabbitMQ 기반 비동기 처리

생성형 AI 서비스의 긴 처리 시간과 복잡한 호출 체인을 관리하기 위해 RabbitMQ를 활용한 메시지 큐 기반 아키텍처를 구축했습니다. 여러 AI 서비스 간의 작업을 큐에 담아 순차적으로 처리하고, 실패한 작업에 대한 재시도 메커니즘을 구현하여 시스템의 안정성을 높였습니다.

Docker 컨테이너화

마이크로서비스 아키텍처의 각 컴포넌트를 Docker로 컨테이너화하여 개발 환경과 운영 환경의 일관성을 보장했습니다. Docker Compose를 활용하여 로컬 개발 환경을 구성하고, 각 서비스를 독립적으로 관리하고 스케일링할 수 있도록 했습니다.

$cat challenges.md
problem생성형 AI 서비스의 긴 처리 시간과 불안정한 응답

solutionRabbitMQ를 활용한 메시지 큐 기반 비동기 처리 아키텍처를 구축하여 AI 서비스 호출을 큐에 담아 순차적으로 처리했습니다. 각 작업의 상태를 추적하고, 타임아웃과 재시도 로직을 구현하여 불안정한 응답을 효과적으로 관리했습니다. 또한 데드레터 큐를 활용하여 반복적으로 실패하는 작업을 별도로 관리하고 모니터링할 수 있도록 했습니다.

problem여러 생성형 AI 서비스 간의 복잡한 호출 체인 관리

solution각 AI 서비스(ChatGPT → Midjourney → LUMA AI) 간의 작업 흐름을 RabbitMQ의 큐와 익스체인지를 통해 체계적으로 관리했습니다. 각 단계별로 별도의 큐를 구성하고, 이전 단계의 결과를 다음 단계의 입력으로 전달하는 이벤트 기반 아키텍처를 설계했습니다. 작업의 실패 시 이전 단계로 롤백하거나 재시도할 수 있는 메커니즘을 구현했습니다.

problemJWT 토큰 기반 인증 및 소셜 로그인 구현

solutionSpring Security를 활용하여 JWT 기반 인증 시스템을 구현하고, Google OAuth와 Kakao OAuth를 통한 소셜 로그인을 지원했습니다. 토큰의 생성, 검증, 갱신 로직을 구현하고, 리프레시 토큰 메커니즘을 추가하여 사용자 경험을 개선했습니다. 각 소셜 로그인 제공자별로 통합된 인터페이스를 설계하여 확장성을 고려했습니다.

problem마이크로서비스 환경에서의 서비스 간 통신 및 상태 관리

solutionRabbitMQ를 활용한 이벤트 기반 아키텍처로 각 마이크로서비스 간의 느슨한 결합을 구현했습니다. 작업의 상태를 중앙화된 데이터베이스에 저장하고, 각 서비스는 필요한 상태 정보를 조회하여 처리할 수 있도록 설계했습니다. 또한 Redis를 활용하여 작업 상태와 진행 상황을 캐싱하여 빠른 조회가 가능하도록 했습니다.

$ls architecture/
시스템 아키텍처
시스템 아키텍처
클릭해서 크게 보기

PWA 프론트엔드와 백엔드 마이크로서비스 아키텍처: 프론트엔드(PWA), 백엔드 코어 서비스, RabbitMQ 메시지 브로커, 생성형 AI 서비스(ChatGPT, Midjourney, LUMA AI)의 통합 구조

비동기 처리 아키텍처 (CALL-CHAIN)
비동기 처리 아키텍처 (CALL-CHAIN)
클릭해서 크게 보기

RabbitMQ 기반 메시지 큐를 활용한 비동기 처리 플로우: Node.js 이벤트 루프, 외부 서비스, 프로세스 함수, 체커 함수를 통한 작업 처리 및 피드백 메커니즘

기술 스택 (VARIOUS STACK)
기술 스택 (VARIOUS STACK)
클릭해서 크게 보기

프로젝트에 사용된 다양한 기술 스택: EFFECTIVE (Node.js, Spring Boot, Redis), PRODUCTIVE (Next.js, JavaScript, Express), STABLE (Nginx, TypeScript, Java) 그룹으로 분류된 기술들

$cat results.md
▸
생성형 AI 파이프라인 구축

ChatGPT, Midjourney, LUMA AI를 통합하여 사용자의 꿈 데이터를 자동으로 숏폼 영상으로 변환하는 완전 자동화된 파이프라인을 구축했습니다.

▸
안정적인 비동기 처리

RabbitMQ를 활용한 메시지 큐 기반 아키텍처로 생성형 AI의 긴 처리 시간과 불안정한 응답을 효율적으로 관리하며, 실패한 작업에 대한 재시도 메커니즘을 통해 높은 작업 성공률을 달성했습니다.

▸
컨테이너화된 마이크로서비스

Docker를 활용하여 각 서비스를 컨테이너화하고, Docker Compose를 통해 개발 환경을 구성하여 개발부터 배포까지 일관된 환경을 제공했습니다.

$cat retrospection.md
잘 됐던 것

RabbitMQ를 활용한 메시지 큐 기반 아키텍처로 생성형 AI의 긴 처리 시간과 불안정한 응답을 효과적으로 관리할 수 있었습니다. 실패한 작업에 대한 재시도 메커니즘을 구현하여 시스템 안정성을 크게 향상시켰습니다.

Docker 컨테이너화로 개발과 운영 환경의 일관성을 유지했고, Spring Boot 마이크로서비스 아키텍처로 각 컴포넌트의 책임을 명확히 분리하여 유지보수성을 높였습니다.

개선할 것

생성형 AI 서비스의 비용 관리와 최적화에 대한 전략이 부족했습니다. API 호출 비용이 높은 서비스들을 사용하면서 불필요한 재시도나 중복 호출을 최소화하는 전략을 세밀하게 설계하지 못했습니다.

영상 생성 시간이 오래 걸리는 문제에 대한 실시간 피드백이나 진행 상황 표시 기능이 없어 사용자 경험이 좋지 않았습니다.

배운 것

비용과 대기 시간도 설계 변수입니다. 모델을 고르기 전에 서비스별 가격 구조를 비교하고, 불필요한 재시도와 중복 호출을 줄이는 전략을 함께 세웠어야 했습니다.

대기 시간 자체를 경험의 일부로 바꿀 방법도 처음부터 함께 설계해야 했습니다.