I HATE FLYING BUGS logoFE Chapter

ADR 6: Public API Package.json subpath export 패턴 채택

Feature-Sliced Design 도입과 함께 모듈 간 의존성을 명확하게 관리할 필요가 있음

Status

Accepted

Context

Feature-Sliced Design 도입과 함께 모듈 간 의존성을 명확하게 관리할 필요가 있음:

  1. 내부 구현 세부사항이 외부에 노출되어 결합도가 높아짐
  2. 리팩토링 시 어떤 부분이 외부에서 사용되는지 파악이 어려움
  3. 모듈의 경계가 모호하여 불필요한 의존성이 발생

Decision

각 slice와 segment에서 Public API 패턴을 사용하여 외부 노출 인터페이스를 명시적으로 관리한다.

규칙

  1. 모든 폴더는 index.ts를 통해 Public API 정의
  2. 직접 파일 import 금지, 반드시 Public API를 통해서만 접근
  3. Private 구현은 외부에 노출하지 않음
  4. 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로 직접 파일 접근 차단

References