본문 바로가기
Storify

STORIFY (0130) - Socket.IO(1)

by Peter.JH 2024. 1. 31.
728x90
반응형

objectId 수정:

objectId는 repository안에서만 사용해야한다. 현재는 mongoDB를 사용하고 있지만, 추후 DB를 교체할 일이 생겼을때 작업이 수월하게 이뤄지게 하기 위해서는 repository안에서만 처리하는것이 좋다.

 

socketIo추가:

서버를 여러대 사용하는 서비스인 경우 메세지큐를 사용하는것이 좋다. storify는 서버 1대이므로 socketio를 사용하는게 맞다고 생각한다. 왜 그럴까?

1. 실시간 통신: 우선 Socket.IO는 클라이언트와 서버 간에 실시간 양방향 통신을 가능하게 한다. HTTP와 달리 연결을 유지하므로, 서버가 클라이언트에게 즉시 데이터를 전송할 수 있다.

2. 단순함: 서버가 한 대일 때는 복잡한 구성이나 부가적인 관리가 필요 없기 때문에, Socket.IO를 사용하는 것이 간편하다.

 

서버가 여러 대인 경우에는 메시지 큐를 사용하는 것이 더 효율적이다

1. 확장성: 여러 대의 서버가 동시에 메시지 큐에 접근하여 작업을 가져갈 수 있으므로, 시스템의 확장성을 향상시킬 수 있다.

2. 비동기 처리: 메시지 큐는 비동기 처리를 가능하게 하므로, 서버가 메시지를 보내고 나면 다른 작업을 계속 수행할 수 있다. 

3. 장애 복구: 메시지 큐는 메시지를 저장하고, 처리가 완료될 때까지 유지한다. 따라서, 서버에 문제가 발생해도 메시지는 안전하게 보호된다.

4. 분산 처리: 서버가 여러 대인 경우, 메시지 큐를 통해 각 서버가 처리해야 할 작업을 공유하고 분산시킬 수 있다. 이는 시스템의 부하를 분산시키고, 전반적인 성능을 향상시킨다. 

 

이제 socketIo를 사용한다고 했으니 의문점이 생긴다.

우선 내가 추가하고 싶은 기능은 친구요청알림, 좋아요 알림이다. 만약 알림을 받아야할 유저가 로그인 상태가 아니라면 알림은 어떻게 될까?

실시간 통신을 위해서는 사용자가 로그인할때 socketio와 연결을 해야한다. 그렇게 되면 서버에 부하가 많아지게된다. 이를 어떻게 처리해야할까?

 

예시를 생각해보자...

 

Socket.IO를 사용할 때, A 유저가 B 유저에게 친구 요청을 했다면, 서버는 B 유저에게 실시간 알림을 보내기 위해 해당 B 유저의 Socket.IO 연결을 찾아 알림을 보낸다. 이를 가능하게 하려면, 일반적으로 서버는 각 클라이언트의 Socket.IO 연결과 해당 클라이언트의 사용자 ID를 매핑하여 저장하고 있어야 한다. 그러면 A 유저가 친구 요청을 하면, 서버는 이 매핑 정보를 이용하여 B 유저의 Socket.IO 연결을 찾아 알림을 보낼 수 있다. 그러나, B 유저가 현재 온라인이 아니라면(즉, Socket.IO에 연결되어 있지 않다면) 실시간 알림을 보낼 수 없다. 이런 경우에는 알림 정보를 데이터베이스에 저장해두고, B 유저가 다음에 로그인하거나 애플리케이션에 접속할 때 알림을 보내는 방식을 사용할 수 있다. 

 

 

작업정리

 

1. ObjectId 수정:

- ObjectId를 효율적으로 관리하기 위해 repository에서만 사용하도록 코드를 수정하였습니다. 이를 통해 추후에 데이터베이스를 교체할 일이 생겼을 때 코드 수정 작업이 수월하게 이뤄지도록 했습니다.

 

2. Socket.IO 추가:

- 실시간 양방향 통신을 가능하게 하는 Socket.IO를 프로젝트에 추가하였습니다. 이를 통해 사용자 간 실시간 상호작용이 가능하게 되었습니다.

 

3. 실시간 알림 기능에 대한 고민:

- 친구 요청 알림, 좋아요 알림 등의 실시간 알림 기능을 어떻게 구현할지에 대한 고민을 했습니다. 특히, 알림을 받아야 할 사용자가 현재 온라인 상태가 아닐 경우에 대한 처리 방안을 고민하였습니다.

 

4. 실시간 알림 기능의 예시 시나리오 작성:

- 실시간 알림 기능이 어떻게 동작하는지를 설명하기 위한 예시 시나리오를 작성하였습니다. 이를 통해 알림 기능의 동작 원리를 명확히 이해하고, 이를 기반으로 구현 방안을 계획하였습니다. 

728x90
반응형