좋은 구조는 폴더보다 의존 방향이 먼저 보인다

변경 이유가 같은 코드를 모으고, 프레임워크와 저장소는 핵심 규칙을 향해 의존시킨다.

UI

화면·HTTP

use case 호출

INFRA

DB·API

port 구현

APP

유스케이스·port

UI·DB 세부사항은 모름

DOMAIN

불변 규칙

framework import 없음

RUNTIME

package.json#exports

공개 subpath를 정하고 deep import를 막는다.

TYPE/BUILD

Project references

.d.ts 계약과 빌드 순서로 프로젝트를 나눈다.

RESOLUTION

paths

탐색만 안내하며 출력 import는 바꾸지 않는다.

POLICY

Import lint·경계 테스트

허용 방향·공개 API·cycle을 CI에서 검사한다.

CYCLE

기능 사이 순환 import

안정된 계약만 안쪽에 두고 흐름 소유자를 하나로 정한다.

ALIAS

타입 검사는 통과, 실행은 module not found

Node·번들러·테스트 러너의 alias를 같은 규칙으로 맞춘다.

DEEP

외부가 internal 파일을 직접 import

exports와 lint로 공개 계약 밖 경로를 닫는다.

두 시점 컴파일: import는 핵심으로. 런타임: composition root가 adapter 구현체를 연결한다.