Barrel Import

아재발자·2026년 2월 10일

상황

토이프로젝트를 진행하던 중 다른 Controller의 API는 정상인데, 특정 Controller의 API만 ClassValidator가 동작을 하지 않는 상황이 발생했습니다.

원인

Barrel Import

Barrel Import
여러 모듈 또는 파일을 index 파일 하나에서 모두 export하고, 외부에서는 하나의 파일만 Import하여 사용하는 패턴

결과적으로 Controller -> DTO -> Barrel Import -> Controller 식으로 의존성이 꼬이면서 순환 참조가 발생했던 케이스였습니다.

문제의 코드

import { GenerateJwtTokenBody, GenerateJwtTokenResponse } from '@app/controllers';

위와 같이 잘못된 Barrel Import로 인해 순환 참조가 발생하게 되면, 자바스크립트 엔진은 모듈이 무한 루프에 빠지는 것을 방지하기 위해 ReferenceError 에러를 발생시키거나 undefined 객체를 응답하게 됩니다.

이렇게 정상적으로 Import가 되지 않은 상황에서 reflect-metadata가 호출되면 reflect는 메타데이터를 정상적으로 읽지 못하게 되고, class-validator, class-transformer, DI 의존성 주입, Swagger 문서 생성 등 다양한 기능들이 동작을 하지 않게 됩니다.

해결 방법

해결 방법은 단순합니다.

Barrel Import로 인해 순환 참조가 발생하게 되었으니, Deep Import 방식으로 파일을 Import하거나, 순환 참조가 발생하지 않게끔 상대 경로로 Import 하면 됩니다.

수정한 코드

import { GenerateJwtTokenBody, GenerateJwtTokenResponse } from './dto';

결론

이와 같이 논리적인 에러는 원인을 파악하기 힘듭니다... Syntactic Error가 최고야...

참고 문서

profile
안녕하세요. 아재 개발자입니다. 공부한 내용을 기록하고 잘못된 부분에 대해서 조언을 받기 위해 velog를 시작했습니다. :)

0개의 댓글