프로젝트 경계

TypeScript 프로젝트 경계

규모가 커진 TypeScript 프로젝트에서 유지보수성은 예쁜 폴더명보다 import 방향, package boundary, tsconfig 참조, build/test/typecheck 명령이 일관되는지에서 나온다. 모노레포라면 각 패키지가 무엇을 공개하고 무엇을 숨기는지도 계약이다.

01

도메인 경계 나누기

기능별 코드와 공유 유틸을 분리하되 shared가 모든 것을 삼키지 않게 한다.

shared 남용은 숨은 결합을 만든다
02

공개 API 정하기

패키지나 폴더의 index export로 외부에서 접근할 표면을 제한한다.

내부 파일 직접 import는 변경을 어렵게 한다
03

tsconfig 연결

baseUrl, paths, project references가 빌드 순서와 타입 경계를 반영하는지 확인한다.

alias는 구조를 숨길 수도 있다
04

명령 분리

dev, build, typecheck, test, lint가 각각 무엇을 보장하는지 명확히 한다.

build 성공이 타입 검사 전체를 의미하지 않을 수 있다
05

순환 의존 검사

패키지와 폴더 사이 import 방향이 되돌아오지 않는지 도구로 확인한다.

순환 참조는 런타임 초기화 문제로 번진다
apps
실행 진입점 웹, API, worker처럼 배포 단위가 되는 코드를 둔다.
비즈니스 공통 코드는 package로 뺀다
packages
재사용 경계 ui, domain, config, shared types처럼 공개 API를 가진 단위로 나눈다.
내부 경로 import를 제한한다
tsconfig
타입 경계 strict, references, paths가 팀의 빌드 방식과 맞아야 한다.
설정 drift를 줄인다
scripts
검증 명령 각 패키지와 루트에서 typecheck와 test가 어떤 범위를 커버하는지 명시한다.
CI와 로컬 명령을 맞춘다

구조 확인

순환 참조 패키지 간 import가 되돌아오는 경로가 없는지 확인한다.
공개 표면 외부에서 내부 파일을 직접 import하지 않는지 검색한다.
명령 범위 루트 typecheck가 모든 패키지의 타입 오류를 잡는지 확인한다.