<aside>
백엔드는 NestJS 기반의 BFF 서버와 Spring Boot 기반의 Core 서버로 역할을 분리하여 구성하였습니다. 저는 Core 서버를 담당하였으며, Spring Boot를 선택한 이유는 다음과 같습니다.
실시간 수어 번역 플랫폼 특성상 JWT 인증, OAuth2 소셜 로그인, WebSocket 기반 영상통화, Redis Stream을 활용한 비동기 회의록 처리 등 다양하고 복잡한 기능을 안정적으로 구현해야 했습니다. Spring 생태계는 이러한 기능들을 공식적으로 지원하고 레퍼런스가 풍부하여 빠르고 안정적인 개발이 가능하다고 판단하여 선택하였습니다.
</aside>
<aside>
서비스의 핵심 데이터인 회원, 친구, 회의록 등 관계형 데이터를 안정적으로 관리하기 위해 선택하였습니다.
</aside>
<aside>
이메일 인증 코드의 경우 짧은 유효시간 내에만 필요한 임시 데이터이므로, 메인 DB인 MySQL에 저장하는 것은 불필요한 부하를 유발할 수 있다고 판단했습니다. TTL 설정이 용이하고 빠른 읽기·쓰기가 가능한 Redis를 별도 DB로 분리하여 사용하였습니다.
</aside>
<aside>
회의 모드에서 AI 기반 회의록 생성 시 서버 장애 상황에서도 데이터를 안전하게 보존해야 했습니다. Redis Stream을 활용한 비동기 파이프라인을 구성하여 메시지 유실 없이 안정적인 회의록 처리가 가능하도록 설계하였습니다.
</aside>
<aside>
프로필 이미지, 수어 퀵슬롯 관련 파일 등 정적 파일을 안정적으로 저장하고 UUID 기반 URL로 조회할 수 있도록 S3를 선택하였습니다.
</aside>
<aside>
팀원 모두가 익숙한 환경이었고, 학교 크레딧 지원을 받을 수 있어 비용 부담 없이 사용할 수 있었습니다. 또한 레퍼런스가 풍부하여 문제 발생 시 빠르게 해결할 수 있다는 점에서 배포 환경으로 선택하였으며, EC2 기반으로 서버를 운영하였습니다.
</aside>
<aside>
이메일 인증 기능 구현을 위해 메일 발송 서비스가 필요했습니다. 처음에는 AWS SES를 사용하고 싶었으나 학교 환경에서 지원되지 않아 대안을 찾게 되었습니다.
무료로 사용 가능하면서도 스타트업에서 실제로 많이 사용하는 신뢰할 수 있는 서비스인 Brevo를 선택하였고, 회사에서 받은 도메인을 연결하여 이메일 인증 기능을 구현하였습니다.
</aside>