상황
- nestjs 8 버전으로 새로운 API를 개발하는 상황
- 공용 라이브러리에는 nest.js로 만든 interceptor가 있는데, 이 interceptor는 던져진 exception을
instanceof로 판별하여 종류에 따라 다르게 처리하고 있었다.
발생한 문제
- 메인 프로세스에서 exception을 던져도 해당 interceptor에서 의도한 대로 작동하지 않는다.
- 던져진 exception은
HttpException으로 판별되어 처리가 돼야 했는데 inctanceof로 판별되지 않았다.
- 근데, console로 찍으면
HttpException으로 출력하는 상황
원인 파악
- 원인은 모듈간 다른 클래스를 사용하는 것에 있었다.
- npm에서 의존성을 설치하는 과정에서 버전과 이름이 동일한 의존성이 설치되어 있다면, 중복으로 설치하지 않고 넘어간다.
- API는 nest.js 8 버전이었고, 라이브러리는 nest.js 7버전으로 서로 다른버전이었기 때문에 라이브러리를 설치하는 과정에서 nest.js 7이 라이브러리의 하부 모듈로 설치되었다.
- API에서 던져진 exception의 class는 nest.js 8에서 정의된 반면 interceptor에서 판별하는데 사용하는 exception의 class는 공용 라이브러리의 nest.js 7 버전에서 정의된 class여서 동일한 클래스명을 갖고 있지만 다른 클래스로 판별 한 것.
해결 방법
- 라이브러리 버전을 올려서 해결하는 방법을 생각했지만, 그렇게 하면 해당 라이브러리에 의존하는 다른 API의 호환이 깨질 수 있어서 일단은 다운그레이드를 하는 방향으로 해결하였다.
- nest.js 7 -> 8로 넘어가는 과정에서 추가되거나 변경된 기능이 많다. 언젠가 날잡고 라이브러리 버전을 올리기 전에 호환성이 맞춰지는지 확인하고 작업해야겠다...