Skip to content
This repository has been archived by the owner on May 1, 2023. It is now read-only.

프로젝트

Heedong Kim edited this page Jan 5, 2022 · 39 revisions

주제 : Discord

media

선택 배경

대용량 서비스 설계

  • 대용량 서비스 설계 및 구현을 경험하기 위해 다수의 사용자, 다양한 서비스들의 연관 관계 속에서 안정적으로 서비스되고 있는 애플리케이션들을 고려했다.
  • 대용량 서비스 설계 과정에서 벤치마킹 대상으로 삼을 수 있다.

커뮤니티 단위의 메신저 구조 설계

  • 디스코드의 서버처럼 커뮤니티 단위로 사용자가 자유롭게 의사소통하는 환경의 개발을 경험하고 싶다.
  • 특히 서버의 채널처럼 사용자가 자유롭게 커스터마이징하여 만들어가는 공간을 개발하며 사용자 친화적인 웹사이트 개발 경험을 갖고 싶다.
  • 디스코드는 커뮤니티-카테고리-채널-스레드와 같은 계층적 구조를 바탕으로 커뮤니티 내 권한, 알림, 멤버 등을 자유롭게 설정할 수 있고 또한 각 채널마다 구성을 달리 할 수 있다.

실시간 채팅, 실시간 음성, 화상 채팅

  • 단순히 텍스트 메세지를 전달하는 메신저가 아닌 다양한 수단을 통해 의사소통을 진행하는 서비스를 설계하고 개발하면서 제공 서비스에 따른 다양한 서버 아키텍처 설계에 대한 경험과 다양한 의사소통 방법을 매끄럽게 화면에 표현하는 경험을 갖고 싶다.
  • 애플리케이션의 생명주기에 따른 소켓 통신의 이벤트 처리를 경험할 수 있다.
    • 백그라운드 : 실시간 미팅(화면공유, 음성 등) 시
    • 포그라운드 : 여러 서버(디스코드의 server, 확장된 Room 개념)에서의 실시간 메시징 이벤트 처리
    • 네트워크 환경 : reconnection에 따른 socket 상태 처리

따라서 이번 프로젝트에서 팀의 목표와 각 개개인의 목표를 성취하기 위해 Discord를 선택하게 되었다.


업무 분담

박병찬(Backend): MSA 구조를 이해하고 설계하기!

msa 구조의 데이터 동기화 문제를 kafka message queue를 이용하여 해결

API Gateway 서버

  • server routing
  • token validation filter 처리

채팅 서버

  • websocket를 통해 통신을 처리하며 kafka를 이용하여 비동기 작업을 통해 메세지를 처리한다
  • 카프카의 구조를 파악하고 여러 클러스터를 관리하며 성능 개선을 이룬다.

인증 서버

  • jwt token 방식 인증 구현
  • access token 인증, refresh token + redis 캐시 저장

알림 서버

  • 채팅 아키텍처의 흐름에 맞는 알림 서버 구현
  • kafka message queue를 이용한 비동기 처리.
  • fcm 연동

김희동(Backend): 서버 아키텍처에 대한 이해와 함께 성능 개선을 경험하자!

시그널링 서버, 미디어 서버 개발

  • 시그널링 서버와 미디어 서버 개발을 통해 미디어 스트림 전송과 관련한 아키텍처 설계 및 개발 경험을 한다.
  • 사용자의 수에 따른 연결 관리와 미디어 스트림의 분배 방법을 달리하면서 동일한 기능에 대한 성능 개선을 한다.

커뮤니티 서버, 채팅 룸 서버 개발

  • 커뮤니티 단위의 메신저 구조와 사용자의 커스터마이징에 대응할 수 있는 효과적인 도메인 설계를 한다.
  • 타 마이크로 서비스(유저 서비스, 상태관리 서버, etc.) 간의 연동을 통해 MSA에 대한 이해와 개발을 한다.

김민지(Frontend): 클린 코드를 작성하는 개발자가 되기!

UI/UX 설계, Websocket 연동, WebRTC 연동

  • 상당한 양의 클라이언트 코드 속에서 css 선택자명, 변수명, 파일명, 함수명 일관되고 쉽게 이해할 수 있게 작성한다.
  • 파일의 목적에 맞게끔 적절히 기능을 나누고, 중복되는 코드는 쉽게 재사용할 수 있게끔 분리하여 작성한다.

UI/UX 설계

  • Figma 이용해서 기존 디스코드 웹 UI를 아카이빙한다.

Websocket 연동

  • Websocket을 통해 실시간 채팅을 연결한다.

WebRTC 연동

  • websocket과 함께 연결하여 음성/영상 통화 기능의 개발한다.

사용자가 커스터마이징하는 서비스

  • 사용자가 서버를 생성하고 채널을 취향에 맞게 커스터마이징하는 디스코드를 구현하며 사용자 친화적인 웹을 개발한다.

김두리(iOS): 유지 보수하기 쉬운 코드를 작성하기!

UI/UX 설계

  • Figma 이용해서 기존 디스코드 앱 UI 아카이빙
  • 자주 사용하는 색상 및 아이콘 등 asset 정의
    • 기존 UIKit을 extension 하여 custom

채팅 구현

  • StompClient 로 채팅 메시징 처리
  • 통신 환경에 대한 적절한 UseCase를 선별하여 ViewModel 설계

Web RTC 연동

  • WebRTC client side 구현
    • Starscream 라이브러리 사용 (단순 websocket 통신 연결)
      • URLSession의 경우 iOS 13이후에서부터 웹소켓 통신 지원 + 안정성의 문제
  • WebRTC 화면 publishing

FCM 연동

  • Appdelegate 단에서 메시지 수신
  • 수신된 메시지별 server/channel 알림
Clone this wiki locally