nestJs에서 socket.io를 통해 소켓통신을 구현하던 중에 예외처리를 하게 되는 상황이 발생했다.
공식문서에는 nestJs 자체적으로 WsException이라는 예외를 제공하고 있다고 나와있어서, 예외를 던지면 자체적으로 내장필터가 client에게 error 이벤트를 발생시켜주는 것으로 생각헀다.
하지만 예상과 달리 말그대로 예외를 던질뿐 어떠한 처리도 해주지 않았다. 따라서 직접 예외 및 필터를 정의해서 사용해볼려고 한다.
원래는 예외의 생성자에서 바로 client.emit를 할려고 했는데, 그 경우에는 매개변수로 client를 받아야한다. 하지만 service에서 예외를 던질경우 client를 주기는 애매한 상황이라 message만 받기로 했다.
export class WsException extends Error {
constructor(message: string) {
super(message);
}
}
예외 필터의 로직은 다음과 같다.
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 예외도 다 종류별로 정의가 되어있기 때문에 커스텀 예외 필터등을 정의할 필요가 없다고 생각했는데 이런 특수한 경우에 사용해야 한다는걸 알게되었다.