[Nest.js] 소켓통신 예외 처리

김지엽·2024년 1월 15일
0
post-thumbnail

1. 개요

nestJs에서 socket.io를 통해 소켓통신을 구현하던 중에 예외처리를 하게 되는 상황이 발생했다.

공식문서에는 nestJs 자체적으로 WsException이라는 예외를 제공하고 있다고 나와있어서, 예외를 던지면 자체적으로 내장필터가 client에게 error 이벤트를 발생시켜주는 것으로 생각헀다.

하지만 예상과 달리 말그대로 예외를 던질뿐 어떠한 처리도 해주지 않았다. 따라서 직접 예외 및 필터를 정의해서 사용해볼려고 한다.

2. 커스텀 예외 및 필터

- 예외 처리 로직

  1. http가 아닌 소켓 통신이기 때문에 상태코드는 필요없음
  2. gateway 또는 service에서 예외 throw
  3. 예외 필터가 감지해서 client에게 error 이벤트 송신
  4. 클라이언트에서 error 이벤트 수신 후 경고창 띄우기

- 커스텀 예외

원래는 예외의 생성자에서 바로 client.emit를 할려고 했는데, 그 경우에는 매개변수로 client를 받아야한다. 하지만 service에서 예외를 던질경우 client를 주기는 애매한 상황이라 message만 받기로 했다.

export class WsException extends Error {
    constructor(message: string) {
        super(message);
    }
}

- 커스텀 예외 필터

예외 필터의 로직은 다음과 같다.

  1. execution context에서 소켓 통신에 대한 정보를 받아온다.
  2. 소켓 통신 정보에서 client의 정보를 받아온다.
  3. error 이벤트에 메세지를 담아 송신한다.
import { ExceptionFilter, Catch, ArgumentsHost } from "@nestjs/common";
import { WsException } from "../exception/ws-exception.exception";
import { Socket } from "socket.io";

@Catch(WsException)
export class WsExceptionFilter implements ExceptionFilter {
    catch(exception: WsException, host: ArgumentsHost) {
        const ctx = host.switchToWs();
        const client = ctx.getClient<Socket>();
        client.emit("error", { message: exception.message });
    }
}

결론

nest에서는 내장 필터가 너무 잘되어있고 http 예외도 다 종류별로 정의가 되어있기 때문에 커스텀 예외 필터등을 정의할 필요가 없다고 생각했는데 이런 특수한 경우에 사용해야 한다는걸 알게되었다.

참고

nestJs 공식 문서

profile
욕심 많은 개발자

0개의 댓글