토이 프로젝트 일지 7 : RedKiwi와 유사한 이벤트 스토밍 기반 마이크로 서비스 만들기
1. 시작 계기
플랫폼 비즈니스 교육에서 수행되는 LV2 개인 역량 평가에 제출하기 위해서 어떤 서비스를 만들지 생각하다가 내가 주로 사용하던 RedKiwi라는 영어 학습 앱과 유사한 서비스를 만들면 재밌을 것 같아서 시작했다.
2. 프로젝트 개요
가. 프로젝트 소개
1. 프로젝트 유형: 개인 토이 프로젝트
2. 구현 서비스: RedKiwi와 유사한 영어 학습 서비스
3. 개발 환경: VS Code, Msaez
4. 활용기술
백엔드 A(Video, Subtitle, ExternalSystemProxy, ReadModel, Gateway): Spring-Boot, JPA, MySQL
백엔드 B(ExternalSystem): Flask
구조설계: MSA(Event Driven Architecture), CQRS, SAGA, Kafka, WebSocket
외부서비스: AWS S3, OpenAI Whisper, DeepL Translate, ChatGPT
5. 개발 기간: 2023.11.26 ~ 2023.12.26
나. 프로젝트 목표
3. 프로젝트 구현
가. 요구사항 분석
총 5개의 BC가 존재하며, 각각의 주요 기능 및 역할을 다음과 같다.
video: 유저가 업로드한 비디오에 대한 메타정보들을 관리한다.
subtitle: 업로드된 비디오에 추출된 자막과 관련된 메타정보들을 관리한다.
externalSystemProxy: external 시스템과 타 BC간의 관계를 느슨하게 만들면서 비동기적인 처리를 지원한다.
collectedData: CQRS를 구현하기 위한 ReadModel이며 video, subtitle에서 발생한 이벤트를 수신해서 관련 정보들을 갱신한다.
externalSystem: 외부 서비스들에 대한 통합적인 인터페이스를 제공하면서, 관련 인증 정보들을 관리 및 보관한다.
AWS S3: 다운받은 유튜브 비디오 및 썸네일을 저장하기 위해서 사용
OpenAI Whisper: 자막이 없는 유튜브 비디오인 경우에도 학습할 수 있도록 자막을 직접 생성
Deepl Translate: 선택적으로 자막과 함께 번역문을 제공하기 위해서 사용
OpenAI ChatGPT: 사용자가 궁금해할 만한 질의응답을 생성하고, 채팅하는 기능을 제공
비디오 업로드 과정을 간략하게 설명하면 다음과 같다.
[1] 유저가 video BC에 업로드 요청을 수행하면, video가 생성되고, 관련 이벤트를 발생시킨다. 해당 이벤트를 externalSystemProxy가 수신하게 되어서 다시 externalSystem에 필수 정보들을 전송한다. externalSystem에는 AWS S3에 대한 Proxy 인터페이스가 있으며, 이 인터페이스에 의해서 유튜브 URL에서 다운받아진 비디오 및 썸네일이 업로드된다.
[2] AWS S3 업로드 완료 시 관련 이벤트가 발생하고 이 이벤트를 video가 받아서 정보를 업데이트하게 된다. 이와 같은 비동기적인 업데이트 과정이 이후에도 계속 반복적으로 일어나게 된다.
[3] OpenAI Whisper관련 Proxy에 접근해서 자막을 생성하고, 해당 정보를 video, subtitle BC에 전파한다.
[4] DeepL Translate관련 Proxy에 접근해서 생성된 자막에 대한 번역문을 얻고, 해당 정보를 subtitle BC에 전파한다.
[5] OpenAI ChatGPT관련 Proxy에 접해서 유저가 궁금해할 만한 질의응답을 생성시키고, 해당 정보를 subtitle BC에 전파한다.
나-3. SAGA 패턴
나-4. 비디오 삭제 과정
유저가 비디오 삭제를 요청하면 관련 이벤트가 발생하게 되고, subtitle BC와 AWS S3에서 동시에 삭제 과정이 진행된다.
나-5. 웹 소켓 활용
비디오 업로드 요청 후, 관련 정보 업데이트시에 웹 소켓을 활용하도록 만들었다.
다. 프론트엔드 구현
다-1. API 게이트웨이
[1] 퀴즈에 해당하는 동영상의 일정 부분을 반복 재생할 수 있고, 아래에서 단어를 선택해서 문장을 완성하는 형식으로 퀴즈를 만들었다.
[2] 모든 문장을 완성할 경우, 그 부분을 다시 볼 수 있으며 아래쪽에서 해당 문장과 관련되어서 생성된 질의응답들을 살펴볼 수 있다.
[3] 최종적으로 사용자에게 맞춘 단어의 비율에 따라서 결과를 출력하도록 만들었다.
다-3. AI 채팅
ExternalSystem BC의 ChatGPT Proxy 서비스에 채팅 내역을 전달해서 사용자가 해당 퀴즈에 대해서 자세한 질문을 할 수 있도록 구현했다.
라. 빌드/배포
라-1. docker-compose 활용하기
각각의 마이크로 서비스들을 도커라이징시키고, 한 번에 실행시킬 수 있도록 docker-compose.yml을 최상단에 작성했다. 자세한 활용법은 해당 소스코드의 README.md에 작성해 두었다.
라-2. EKS에 배포하기
각각에 대한 k8s Deployment, Service 스펙을 생성시켜서 EKS에 배포시켰고, livenessProbe, readinessProbe를 이용해서 자동 복구 및 무정지 배포를 구현했다.













