테스트 코드를 검증하는 과정에서 갑자기 ReferenceError: TextEncoder is not defined라는 오류가 발생했습니다.
이 오류의 원인은 TextEncoder라는 글로벌 객체가 정의되지 않았기 때문입니다.
TextEncoder는 문자열을 UTF-8 바이트 배열로 인코딩하는 Web API로, 브라우저 환경에서 제공되는 객체입니다.
Node.js는 버전 11 이후부터 이를 자동으로 지원하므로 별도로 설정할 필요가 없습니다. 그러나 제가 사용하는 Node.js 버전이 20임에도 불구하고 이 오류가 발생하여 당황스러웠습니다.
다행히도 스택오버플로우를 통해 다양한 해결 방법을 찾을 수 있었습니다.
Node.js 20을 사용하고 있음에도 불구하고 이런 글로벌 객체 오류가 발생한 이유를 여러 자료를 통해 찾아보았습니다. 일부 자료에 따르면, fnm과 같은 패키지 매니저를 사용할 경우 버전 충돌로 인해 문제가 발생할 수 있다고 했지만, fnm 버전을 변경해도 문제는 해결되지 않았습니다.
jestSetup 파일 상단에 아래 코드를 추가하는 방법이 있습니다. 그러나 저의 경우에는 이 방법이 효과가 없었습니다.
/jestSetup
import { TextEncoder, TextDecoder } from 'text-encoding';
global.TextEncoder = TextEncoder;
global.TextDecoder = TextDecoder;
제가 해결한 방법은 별도의 의존성을 설치하지 않고, Node.js에서 제공하는 util 모듈을 사용하는 것이었습니다.
import { TextEncoder } from 'util';
global.TextEncoder = TextEncoder;
TextEncoder 문제는 해결되었지만, 이후 ReferenceError: Request is not defined 라는 새로운 오류가 발생했습니다. 이는 fetch가 지원되지 않아서 발생한 문제였으며, whatwg-fetch 폴리필 라이브러리를 설치하여 해결했습니다.
whatwg-fetch는 Fetch API의 폴리필로, 오래된 브라우저나 Node.js 환경에서 fetch 함수가 존재하지 않는 경우 이를 지원하기 위해 사용됩니다.
문제의 원인은 .next/static/chunks/pages/test.js 빌드 파일에서 발생한 테스트 오류였습니다. .next 폴더를 삭제하고 빌드를 다시 수행하니, 별도의 폴리필 설정 없이도 오류가 깔끔하게 해결되었습니다.
발생 근원지보다는 오류 메시지에만 지나치게 집중하다가 문제를 해결하는 데 오래 걸렸습니다. 처음부터 문제의 근원지에 더 신경을 썼더라면 빠르게 해결할 수 있었을 것입니다.
https://stackoverflow.com/questions/68468203/why-am-i-getting-textencoder-is-not-defined-in-jest
https://github.com/vercel/next.js/discussions/59041