[NestJS] filter안에 dependency injection하기(i.e. inject service)

2022. 4. 15. 09:01· NestJS
목차
  1. Problem - 기존 방법
  2.  
  3. Solution

Global로 등록하는 filter안에 dependency injection 하는 방법에 대해 알아보자. 

 

이 글은 NestJS 공식문서 와 StackoverFlow의 관련된 글을 참고했습니다.

 


 

Problem - 기존 방법

기존에 사용했던 방법은 아래처럼 main.ts에 useGlobalFilter() 메소드를 사용하여 filter를 등록하는 방법이었다. 

//main.ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new HttpExceptionFilter());
  await app.listen(3000);
}
bootstrap();

 

하지만, 이렇게 등록하게 되면 해당 필터는 NestJS의 어떠한 모듈에도 등록되지 않고, 모듈 밖에 등록 되게 된다. 

그러므로, dependency injection 또한 불가능 해지는 문제점이 생긴다. 

NestJS 공식문서 - useGlobalFilter 사용시 dependency injection 불가

 


 

1. Error Message

만약, 위의 방식으로 filter를 등록한 채로 dependency injection 을 하게 된다면 아래와 같은 에러 메시지를 받게 될 것이다. 

src/main.ts:19:24 - error TS2554: Expected 1 arguments, but got 0.

19   app.useGlobalFilters(new HttpExceptionFilter());
                          ~~~~~~~~~~~~~~~~~~~~~~~~~

  src/common/http-exception.filter.ts:23:15
    23   constructor(private systemLogService: SystemLogService) {}
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    An argument for 'systemLogService' was not provided.

 

참고로, 의존성 주입을 하려고 하는 HttpExceptionFilter의 코드는 아래와 같다. 

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  constructor(private systemLogService: SystemLogService) {}
  //...
}

 


 

2. Reason

코드를 보면 위의 에러는 너무 당연하다. class HttpExceptionFilter는 어떠한 모듈에도 등록이 되어 있지 않은 상황에서 

main.ts에서 인스턴스를 생성하려고 한다. 

하지만, 우리는 의존성 주입을 위해, systemLogService라는 provider를 생성자 함수의 인자로 넣어줘야 함에도 main.ts에서는 해당 인자를 넘겨주고 있지 않기 때문이다. 

 

 


 

Solution

위의 문제는 아래 방식 처럼, global filter를 module안에 등록해주는 방식으로 매우 간단히 해결할 수 있다. 

import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';

@Module({
  providers: [
    {
      provide: APP_FILTER,
      useClass: HttpExceptionFilter,
    },
  ],
})
export class AppModule {}

 

저작자표시 (새창열림)

'NestJS' 카테고리의 다른 글

main.ts 에서 nestjs module 사용하기 (feat. nestjs 서버 시작 로그 남기기)  (0) 2022.05.12
nestjs Logger Middleware 만들기(feat. log db저장)  (0) 2022.05.12
nestJS app 밖에서 nestJS application instance 사용하기  (0) 2022.04.29
migration 으로 DB 초기값 설정(with typeorm)  (0) 2022.04.28
NestJS의 기초  (0) 2022.04.11
  1. Problem - 기존 방법
  2.  
  3. Solution
'NestJS' 카테고리의 다른 글
  • nestjs Logger Middleware 만들기(feat. log db저장)
  • nestJS app 밖에서 nestJS application instance 사용하기
  • migration 으로 DB 초기값 설정(with typeorm)
  • NestJS의 기초
moyanglee
moyanglee
moyangmoyanglee 님의 블로그입니다.
moyanglee
moyang
moyanglee
전체
오늘
어제
  • 전체보기 (173)
    • java,springboot (22)
    • CI CD (8)
    • 보안 (1)
    • Vue (21)
    • TypeScript (14)
    • SQL (2)
    • Docker (11)
    • JavaScript (17)
    • React (3)
    • NextJS (14)
    • d3 (2)
    • Git (3)
    • network (2)
    • Openlayers (4)
    • 테스트코드 (5)
    • NestJS (9)
    • 개발환경 (7)
    • Algorithm (6)
    • TypeORM (5)
    • CSS (7)
    • MySQL (5)
    • Linux (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

  • 현재 노션의 내용을 블로그로 옮기는 과정에 있습니다.
  • github, notion 링크

인기 글

태그

  • vue
  • useRef
  • typescript
  • Error: P1001: Can't reach database server at
  • Error: P1001
  • Entity
  • vue3
  • r2dbc
  • java
  • springboot
  • AWS
  • d3
  • generic
  • Docker
  • nextjs
  • node 버전 변경
  • typeorm
  • npm 버전 변경
  • ts
  • js
  • NestJS
  • object
  • mysql
  • no space left on device
  • OOP
  • Migration
  • react
  • jest
  • Uncaught (in promise) Error: Redirected when going from
  • OpenLayers

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
moyanglee
[NestJS] filter안에 dependency injection하기(i.e. inject service)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.