// hooks/test/usePaginiation.test.ts
import { usePagination } from '@/index'
error message
Issue
Q. hooks를 테스트 했는데 왜 ui에서 에러가 발생할까?
1차 접근
내부 hooks에서 ui를 참조하는 곳이 있는지 확인 → X
2차 접근
vite.config.ts와 ts.config.json의 특이점 확인 → X
3차 접근
hooks/index 참조에서 각 파일의 참조로 변경 → usePopper에서만 에러가 발생
usePopper는 내부에서 @ladb-slot-booking/ui를 참조하고 있음
4차 접근
node_modules 제거 후 재설치 (package.lock이 변경되면 하위 에러 발생)
package.lock이 그대로인 경우 동일한 에러 발생
5차 접근
해당 에러가 난 부분 alias를 제거하고 상대 경로로 변경 → 다른 alias로 설정된 부분에서 에러 발생
Solution
모노레포 환경의 설정이 잘못되어 발생한 문제 (with GPT)
Q. packages/ui의 디렉토리 내부에 있는 tsconfig.json의 우선 순위가 높으니까 ui package 내부에서는 tsconfig.json에 정의된 path인 "@ui/"로 쓸 수 있는거 아니야?? 왜 hooks 테스트 코드 실행 했을 때 관련없는 ui의 상대 경로에서 오류가 나는지 모르겠어!
A. GPT4 답변
모노레포 구조에서는 모든 패키지를 함께 빌드해야 일관성을 유지하며, 일반적으로 루트 tsconfig.json에서 정의한 경로가 우선 순위를 가집니다. hooks 패키지의 테스트 코드를 실행할 때 TypeScript 컴파일러는 import를 해석하기 위해 루트 tsconfig.json을 사용합니다.
hooks 패키지가 ui 패키지를 import하고, ui 패키지 내부에서 @ui를 경로에 사용하면 충돌이 발생할 수 있습니다. 루트 tsconfig.json에 @ui 별칭이 정의되어 있지 않기 때문에 TypeScript 컴파일러가 혼란스러워질 수 있습니다. 따라서 hooks 테스트 코드를 실행할 때 경로를 해석하지 못하게 됩니다.
이런 문제를 피하려면 프로젝트 전체에서 경로 별칭을 일관되게 유지하는 것이 중요합니다. ui 패키지의 경로에 @ui를 사용하려면 루트 tsconfig.json에서도 동일하게 정의해야 합니다.
모노레포 설정에서는 패키지가 함께 작동하도록 설계되어야 하므로, 모든 패키지에서 일관된 설정을 유지해야 합니다. hooks와 ui 패키지가 상관없어 보일지라도, 둘 다 동일한 모노레포에 속해 있으며, 한 패키지에서의 변경이 다른 패키지에 영향을 줄 수 있습니다.
완벽한 헛다리..! 최종 해결 (23.07.28)
해당 현상은 vitest를 실행시키는 vite에서 파일을 찾지 못해서 발생하는 것이었다.
좀 더 찾아봐야겠지만 내 추측은 이렇다
hooks 패키지 내부에서 ui 패키지를 사용중
hooks 패키지의 테스트를 진행하기 위해 hooks 패키지의 소스 코드 분석
이 때, ui 패키지도 함께 분석됨
분석되는 와중에 알 수 없는 alias인 @ui가 존재
ui 패키지를 사용하는 hook의 테스트 코드에서 에러 발생
⇒ tsconfig의 path뿐만 아니라 vite의 resolve에도 등록해주기