이전 포스팅을 봤을 때, node-multiroom-chat 레포지토리에 대한 내용만 기술하고,
HJ커뮤니티에서 마무리 했던 ChatServer 레포지토리의 대한 내용을 기술하지 않아서
이번 기회에 포스팅 하게되었습니다.
https://github.com/geun9716/ChatServer
기본적으로 ChatServer에 대한 목표는
- Socket.io를 통해서 실시간 채팅방(1:1, n:m)을 구현하는 것.
- 채팅방을 생성하고 만드는 것은 REST API를 사용해서 구현하는 것.
- 타인이 활용하더라도 쉽게 이해할 수있는 구조로 구현 할 것. (Node.js Express)
- 어떤 message를 담아서 보내더라도 해당 메시지를 모두 다른 사용자에게 전달하는 것. ex) 프로필 사진 구현
- Redis와 pm2의 클러스터 방식을 활용하여 scale out 하는 로드밸런싱을 할 수있도록 구현하는 것.
당시에는 다 구현했다고 생각했지만, 3번까지만 구현 한 것 같고 4번의 로드밸런싱의 경우에는 한 채팅방에 몇명의 인원까지가 감당이 가능한 것인지 확인해서 나누는 작업까지 추가해야 완성했다고 볼 수 있습니다.
Server의 주요 디렉토리 구조는 다음과 같습니다.
server/
├─api/
│ ├─chat.js
│ └─index.js
├─config/
│ ├─cert.pem
│ ├─key.pem
│ └─database.json
├─controller/
│ └─chat.js
├─Loader/
│ ├─db.js
│ ├─messageStore.js
│ ├─Redis.js
│ ├─sessionStore.js
│ └─roomStore.js
├─middleware/
├─public/
│ └─files
├─socketHandler/
│ ├─chatHandler.js
│ └─cwcHandler.js
├─index.js
└─package.json
- index.js : pm2로 구동시키는 가장 base 파일이며, api와 socket.io의 요청을 받는 곳.
- middleware : middleware를 정의하는 곳. 현 프로젝트에서는 middleware가 아닌 sockerHandler에서 session을 처리하였다. 바꾸면 조금 더 좋을 듯 합니다.
- Loader : 서버를 구동하기 위해서 필요한 객체 및 메소드를 정의하는 곳. 데이터베이스와 session, room 등의 스토리지를 선언.
- api : Node.js에서 Routing을 담당하는 곳. 채팅방의 대한 CRUD를 구현하기 위한 Routing을 처리.
- controller : api/에서 Routing된 request를 처리해주는 함수를 정의하는 곳. REST API의 대한 처리를 담당.
- socketHandler : 각 namespace로 전달된 request들을 처리해주는 함수를 정의하는 곳. socket.io 요청들에 대한 처리를 담당.
Sequence Diagram (Data Flow)
socket.io를 통해 실시간 채팅방을 구현하는 것을 sequence Diagram으로 표현한 것입니다.
(ps. 1:1 채팅방은 Socket.io가 작성한 tutorial을 그대로 사용하기 때문에 따로 기술하지 않습니다. )
multiroom
노란색 선을 기준으로 위는 Login과정, 아래는 message가 이동하는 과정을 묘사한 것입니다.
그 외에도 다음과 같은 메소드들이 존재합니다.
- getUsers : 채팅방에 존재하는 사용자들을 가져오는 method
- user joined : 채팅방에 새로 들어오는 사용자를 기록하기 위한 method
- user left : 채팅방에서 나가는 사용자를 기록하기 위한 method
- quit : 방장에 의해 채팅방을 종료하는 method
- reconnect : "reconnect" 요청에 대해 socket을 다시 연결하는 method
- disconnecting : "disconnecting" 요청에 대해 사용자를 RoomStore에서 제거하는 method
- disconnect : "disconnect" 된 소켓이 포함된 Room에 있는 모든 사용자에게 해당 user가 left 됨을 알려주는 method
REST API
GET api/chat : 현재 생성된 모든 채팅방 목록을 가져옵니다.
GET api/chat/:id : id 에 해당하는 채팅방(Room)의 정보를 가져옵니다.
POST api/chat : 채팅방을 새로 생성합니다.
이상으로 직접 제작한 채팅 API 서버의 대한 설명이 끝났습니다. 개발했던 코드를 다시보고 sequence Diagram을 직접 그리면서, session에 대한 내용을 middleware로 옮긴다던지, 비효율적으로 Data가 흐르는 부분은 없는지에 대해 생각해볼 수 있는 좋은 기회였던 것 같습니다.
추가 포스팅을 한다면 목표 5번이었던, 클러스터 1개가 감당할 수 있는 socket수를 어느 정도인지 정의하여, 로드밸런싱을 어떻게 진행해야 하는지에 대해서 할 것 같습니다.
https://github.com/geun9716/ChatServer
'프로젝트 > UNY' 카테고리의 다른 글
socket.io 실시간 chat 구현 (react - Node.js) - (2) (0) | 2021.07.08 |
---|---|
socket.io 실시간 chat 구현 (react - Node.js) - (1) (0) | 2021.07.08 |
CI board 와 xampp 로컬 설정 (0) | 2021.07.05 |