소개
•
수학 문제 사진을 교육과정상 학년과 단원을 넣고 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 알림처럼 실시간으로 개발자가 확인할 수 있는 것을 추가하면 좋을 것 같습니다.