Hello, Freakin world!

[채팅앱] 최종 완성된 아키텍쳐 본문

Toy Project/채팅 앱 만들기

[채팅앱] 최종 완성된 아키텍쳐

johnna_endure 2020. 5. 2. 17:28

 

여러 수정을 하다보니 초기의 설계와는 완전히 달라졌네요.

 

우선 그림으로 살펴보도록 하겠습니다.

 

 

서버는 크게 ChatRoomServer 와 ChatServer. 두 가지가 있습니다.

 

채팅룸 서버(ChatRoomServer) : 채팅방의 정보(방이름, 현재 인원수, 최대 인원수, id)를 관리하는 서버입니다.

채팅메세지 서버(ChatServer) : 읽은 채팅 메세지를 같은 방의 모든 인원에게 다시 보내주는 역할의 서버입니다. 채팅은 이 서버를 통해 이루어집니다.

 

이렇게 서버를 두 가지로 분리시켰던 이유는 솔직히 말하자면 이벤트방식으로 모든 요청을 처리하기가 난감했기 때문이었습니다. 채팅룸 서버는 동기방식의 논블로킹 방식(자바 서블릿이 웹 요청을 처리하는 방식)이고, 채팅 메세지 서버는 이벤트 방식의 논블로킹 방식으로 통신합니다. 

 

초기에 이벤트 방식으로만 서버를 구성하려고 시도했으나, 한계에 부딪히고 이 방식만으로 서버를 구성하기에는 한계가 있다고 느꼈습니다.

 


이제 각 서버의 아키텍쳐를 조금 더 자세히 살펴보도록 하겠습니다.

채팅룸 서버

설명

accept 된 소켓들은 스레드풀의 스레드에 넘겨지게 됩니다. 그리고 넘겨진 스레드에서 읽기/가공/쓰기 작업들이 이루어집니다. 가공된 정보는 가상의 데이터베이스인 리스트 컬렉션에 저장됩니다. 

 

 

채팅메세지 서버

 

설명

이 부분이 가장 고심했던 부분입니다. '클라이언트들을 채팅방으로 어떻게 구분해서 통신할 것인가?' 라는 문제였습니다.

결국 RoomThread 라는 내부에 ServerSocketChannel을 가지고 있는 스레드 단위를 도입하게 됐습니다. 같은 방에 속하는 클라이언트들은 이 RoomThread에 연결되어 서로 통신하게 됩니다.

 

이렇게 하기 위해서 지금 구현된 바로는 클라이언트가 RoomThread의 통신 포트번호를 직접 알아야 합니다.

과연 이 방식이 맞는건지는 잘 모르겠네요.

 

그리고 이 두 서버들이 서로 요청을 보내는 경우도 있습니다.

채팅방이 생성/삭제 되는 경우 RoomThread 역시 같이 생성/삭제 되어야 하기 때문입니다.

그러기 위해서는  RoomThreadPool을 조작하는 요청을 받기 위해서 하나의 포트가 더 필요합니다만, 

위 그림에서는 깜빡하고 빠뜨렸습니다;; 그 포트는 RoomThreadPool을 조작하기 위한 API를 제공합니다.

 


전체 코드

github.com/johnna-endure/chatting-project-entire

 

johnna-endure/chatting-project-entire

Contribute to johnna-endure/chatting-project-entire development by creating an account on GitHub.

github.com

 

 

Comments