ADR 6: Public API Package.json subpath export 패턴 채택
Feature-Sliced Design 도입과 함께 모듈 간 의존성을 명확하게 관리할 필요가 있음
Status
Accepted
Context
Feature-Sliced Design 도입과 함께 모듈 간 의존성을 명확하게 관리할 필요가 있음:
- 내부 구현 세부사항이 외부에 노출되어 결합도가 높아짐
- 리팩토링 시 어떤 부분이 외부에서 사용되는지 파악이 어려움
- 모듈의 경계가 모호하여 불필요한 의존성이 발생
Decision
각 slice와 segment에서 Public API 패턴을 사용하여 외부 노출 인터페이스를 명시적으로 관리한다.
규칙
- 모든 폴더는
index.ts를 통해 Public API 정의 - 직접 파일 import 금지, 반드시 Public API를 통해서만 접근
- Private 구현은 외부에 노출하지 않음
- package.json의 subpath exports 필드를 통해 패키지 레벨 Public API 정의
예시
// ❌ 직접 파일 import (금지)
import { UserProfileAvatar } from '@mildang/entities/src/user/ui/UserProfileAvatar/UserProfileAvatar';
// ✅ Package exports를 통한 import (권장)
import { UserProfileAvatar } from '@mildang/entities/user';폴더별 index.ts 정의:
// entities/user/index.ts
export { UserProfileAvatar } from './ui/UserProfileAvatar';
export { useUserLike } from './api/useUserLike';
// NOTE: 내부 유틸리티나 타입은 노출하지 않음Package.json 설정: node js Subpath-exports
{
"exports": {
"./user": "./src/user/index.ts"
}
}Consequences
- 명확한 모듈 경계와 리팩토링 용이성
- 불필요한 내부 구현 노출 방지
- Package exports로 직접 파일 접근 차단