NestJS로 MSA를 적용하는 여정

조현창·2022년 11월 26일
0

개요

최근 들어가게 된 프로젝트에서 채팅서버의 수요가 생겼다.
기존 프로젝트는 Spring으로 개발중이었으나 소켓의 경우 별도의 프레임워크로 분리되어 있기 때문에
빌트인으로 관리하기가 어렵다고 판단, NestJS에선 한 프로젝트에서 소켓과 일반 컨트롤러를 함께 사용할 수 있어 MSA로 도입을 해보려고 한다.

메세지 큐는 비용 및 설계 기간이 오래 걸릴 것으로 생각되어 일단 REST를 통해 송수신하기로 정했다.
채팅은 완전히 신규 도메인 이기 때문에 별도의 DB로 분리해 관리한다.

기존 API서버의 역할

auth : 토큰 인증 및 가입 관련 역할

board, friend

추가될 기능

채팅방, 마지막 방문 기록(안읽음 표시 관련), 채팅, 채팅방 참가자

REST로 연결

처음부터 메세지 큐를 통한 이벤트 소싱 방식을 도입하기에는 DB 복제 등 테스트가 부담스러운 과정이 많다.
따라서 REST 통신으로 구축하여 테스트를 한 후 천천히 바꿔나갈 계획이다.

주 과제

채팅서버 REST API

(방 관리, 참가자 관리, 방문 기록 관리, 채팅 관리 각각 CRUD)

채팅서버 Socket.io 구축

(채팅방에서 실시간 갱신)

기존 API서버에서 채팅서버를 위해 추가돼야할 것

board별 채팅방 조회
인증(JWT를 식별하여 userId 반환), 인가(board 참가자인지 체크) 로직
해당 API는 NestJS HttpModule을 활용해 한번 더 추상화하여 사용한다.
AuthModule, AuthService처럼 일반 도메인처럼 만든 후 위 설명된 HTTPModule로 BaseURL이 설정된 HttpService를 주입받아 서비스에서 사용한다.

socket 통신중 지켜야할 것

채팅, 방문 기록 CRUD가 동작할 때 await을 사용하지 않는다.
별도의 서비스로 한번 추상화돼있기 때문에 무결성이 조금 떨어지더라도 지연된 무결성을 보장하여 요청의 텀을 더 짧게 하는 것을 목표로 한다.

profile
공부중

0개의 댓글