많은 예시에서 @types/*
패키지를 다음과 같이 설치한다.
npm i -D @types/???
yarn add -D @types/???
pnpm add -D @types/???
모두 -D
라는 개발 전용 의존성 옵션을 줘서 실제 개발 버전에 @types/*
패키지가 불필요하게 들어가는 것을 막는다.
그런데 yarn berry를 사용하던 중 의아한 현상을 발견했다
위 코드는 postgres와 kafka 트랜잭션을 한번에 커밋시켜주는 코드를 작성하던 중 발견한 현상으로 txPg
는 원래 pg
패키지의 타입 정의인 @types/pg
에서 온 pg.PoolClient
이다.
그런데 보다시피 타입 자체는 제대로 추론했는데 auto completion은 제대로 안되는 증상을 발견했다.
이를 해결하기 위해 yarn berry에서 접근을 제어하는 .pnp.cjs
를 살펴보던 중 원인으로 추정되는 코드를 발견했고 그 내용은 다음과 같았다.
보다시피 yarn berry는 pnp를 위해 zip을 사용하기에 실제 경로가 아닌 가상의 경로인 virtual:어쩌고저쩌고
를 이용한다.
그런데 여기에서 devDep
로 설정된 @types/pg
가 존재하지 않는다는 사실을 발견하고 혹시? tsc가 여기를 참조하는 건가? 하고 의심이 들어서 다른 예시를 확인해 봤다.
여기서 txKafka
는 kafkajs
를 사용하는데 이 패키지는 types
정의가 내장되어 있다.
따라서 나는 @types/pg
가 devDep
로 설정되어 yarn berry
가 참조 가능함을 거부하는 것이 원인이라 생각해 @types/pg
를 그냥 일반 의존성으로 변경하고 다시 동일한 작업을 수행해 보니 결과는 다음과 같았다.
package.json
.pnp.cjs
vscode
예상대로.pnp.cjs
의 packageDependencies에 @types
정의가 추가되었고 이후에는 vscode 에 정상적으로 타입 정의가 나오는 것을 확인하였다.
다만 그냥 dep에 추가하면 yarn berry가 아닌 다른 패키지 관리자에서는 의미가 적을 수도 있으므로 optionalDependencies
에 @types/pg
를 추가하였고 그 결과 역시도 동일하였다.
노드와 npm 생태계를 경험하며 수없이 많은 에러를 발견했는데...
슬프게도 대부분은 코드 문제가 아닌
그외 등등, 대다수는 npm 생태계 자체에서 생기는 문제가 많았다.
다행이도 yarn berry는 지금까지 내가 본 npm 생태계 중에서는 이런 문제를 잘 해결했다.
하지만 여전히 @types패키지와 npm 환경은 나를 고통스럽게 한다.
왜 node 개발자가 deno를 처음부터 다시 개발했는지 이해가 간다.
노드 생태계는 쓰면서 계속 느끼지만 뭔가가... 뭔가가 문제가 많다...