Search

멀티모듈 구조의 백엔드 개발 프로젝트 (MathTutor)

회사
JSolution
참여 포지션
Nest.js 백엔드 개발자
진행기간
2022.07 ~

소개

수학 문제 사진을 교육과정상 학년과 단원을 넣고 AI에게 넣으면 난이도 측정과 조판을 하고, 이를 피드에 등록하면 튜터들이 함께 풀거나, 풀이 영상을 올려주는 교육 플랫폼입니다.
문제 난이도 측정 및 조판 AI, 백엔드, 안드로이드 & iOS 앱으로 구성되어있습니다.

사용 기술

TypeScript, Nest.js, MariaDB, MongoDB, Redis, BullMQ

진행 업무

SNS 형태 피드 구성

피드 시스템 구축 시에, create보다 read의 양이 압도적으로 많았고, 주변 지역이나 수학 커리큘럼 등 피드 조회의 조건이 까다로운 기획이었습니다.
당시 SNS 피드 구축 사례 중 유일하게 리서치할 수 있었던 트위터의 시스템을 참고하여 구성했습니다.
조회시 조건에 맞는 게시글 체크가 아닌 게시글 업로드시 대상의 피드에 복제되는 방식으로 구현하였습니다.
또한, 조회시 사용될 조건들에 맞춰 다양한 인덱스를 사용하였습니다.
이로써, 450,000개의 게시글을 2,500명의 사용자에게 200ms 이하의 지연으로 전달할 수 있게 되었습니다.

사내 라이브러리 개발

사내 백엔드 개발에서 중복되어 사용되는 코드들을 관리하고 싶었습니다.
또한 Nest.js에서 지원하지 않는 기능을 직접 개발해서 사용한 코드를 공유하여 사용하고자 했습니다.
위 사항들을 각 도메인별로 묶어서 라이브러리화 하였습니다.
만든 라이브러리는 사내 인프라에 구축된 Nexus에 배포하여 관리하고 있습니다.

멀티모듈 구성

RestAPI나 Scheduler, Socket, MQ Customer 등 로직 트리거의 성격에 따라 구분해서 리소스 배분을 관리하고 싶었습니다.
각각 API, Batch, Socket, Processor 모듈로 분리하고, 각 모듈을 별도의 컨테이너로 구성하였습니다.
이로써 사내 Docker Swarm 인프라에서 사용량에 따라 각 모듈의 컨테이너 개수를 변경하여 효율적인 리소스 사용이 가능했습니다.

실시간 판서 및 녹화, 통화 구현

튜터와 학생이 실시간으로 칠판 판서를 공유하고, 이를 녹화한 영상이 피드에 업로드되는 기능을 구현해야 했습니다.
개발 시간 단축을 위해 타사 서비스를 이용하여 구현하기로 결정했고, 실시간 화면 공유 및 통화, 녹화가 가능한 통합 라이브러리인 Livekit을 사용하여 개발하였습니다.
앱이 비정상적으로 종료될 경우 Livekit에서 종료 감지를 못했기 때문에 실시간 접속여부를 확인하기 위해 별도의 Socket.io를 사용했습니다.
이를 통해 사용자끼리 실시간 통화를 화며 칠판 판서를 한 화면을 720P 60FPS로 영상을 녹화하여 피드에 업로드 할 수 있었습니다.

회고

1.
Livekit이 불안정할 때 대응할 수 있는 것이 없다는 점이 매우 아쉬웠고, 기회가 되면 실시간 화면공유, 녹화, 통화 등의 기능을 직접 구현해보고 싶습니다.
2.
Processor 모듈에서 로직 실패에 대한 FailOver로 재시도 이외에는 구축되지 않아 있습니다.
Slack 알림처럼 실시간으로 개발자가 확인할 수 있는 것을 추가하면 좋을 것 같습니다.