예외를 안정적인 HTTP 오류 계약과 로그 경계로 변환합니다.
Exception Filter는 처리되지 않은 예외를 관찰하고 응답을 만들 수 있습니다. HttpException의 공개 정보와 예상 밖 Error의 내부 정보를 구분합니다.
전역 Filter는 correlation id, path, status와 내부 stack을 관측 시스템에 남기되 사용자 응답에는 비밀을 제외합니다.
예상 가능한 업무 실패는 적절한 HttpException이나 결과 타입으로 표현합니다.
모든 예외의 message와 stack을 JSON으로 반환하면 내부 구조가 노출됩니다.
로컬 프로젝트에서 확인해보세요timestamp와 request path를 응답에 추가하세요.
import "reflect-metadata";
import {
ArgumentsHost,
Catch,
Controller,
ExceptionFilter,
Get,
HttpException,
Module,
} from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
@Catch()
class SafeFilter implements ExceptionFilter {
catch(error: unknown, host: ArgumentsHost) {
const response = host.switchToHttp().getResponse();
const status = error instanceof HttpException ? error.getStatus() : 500;
response.status(status).json({
status,
message:
status === 500 ? "서버 오류가 발생했습니다." : String((error as Error).message),
});
}
}
@Controller()
class AppController {
@Get() home() {
throw new Error("DB 비밀번호 같은 내부 정보");
}
}
@Module({ controllers: [AppController] })
class AppModule {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new SafeFilter());
await app.listen(4173, "0.0.0.0");
}
bootstrap();