[nest.js] 소켓 연결 유지

김민재·2025년 3월 11일

nest.js

목록 보기
41/63

🚫 문제

  • userId와 clientId 매핑하여 Redis에 저장을 하여 유저를 판별하고 있다. 근데 새로고침이나 페이지 이동 시 clientId는 새로 발급되고, 그렇게 되면 현재 clientId와 전에 저장한 clientId는 다르기 때문에, 현재 userId를 가져올 수 없는 이슈가 있었다.

📖 해결방법

  1. 소켓 연결 시: userId를 클라이언트에서 받아와서, userId와 새로운 clientId를 다시 매핑하여 redis에 저장한다.
    // 소켓 연결 시 추가
    async handleConnection(client: Socket) {
        client.on('BACKEND.UserConnected', async (data) => {
            try {
                const { userId } = data;
                await this.socketService.addUserSocketMapping(userId, client.id);
            } catch (error) {
                console.error('소켓 연결 중 오류 발생', error);
            }
        });
    }
  1. 소켓 해제 시: 현재 cleintId를 이용하여 userId를 찾고 redis에서 삭제한다.
    // 소켓 연결 해제
    async handleDisconnect(client: any) {
        try {
            await this.socketService.deleteSocketIdByUserId(client.id);
        } catch (error) {
            console.error('소켓 해제 중 오류 발생:', error);
        }
    }
  • 이렇게 하면 연결 시에는 다시 매핑이 되며 저장이 되고, 해제 시에는 삭제를 하게 된다.

  • 여기서 handleConnection & handleDisconnect 2가지는 nest.js gateway에서 제공하는 메서드이다.

export class EventsGateway implements OnGatewayConnection, OnGatewayDisconnect
profile
개발 경험치 쌓는 곳

0개의 댓글