# 10. 모듈 분리 아키텍처
> 대상: 프론트엔드 개발자
> 최종 업데이트: 2026-03-20
---
## 목차
| 번호 | 항목 |
|------|------|
| 10.1 | [개요](#101-개요) |
| 10.2 | [모듈 구조](#102-모듈-구조) |
| 10.3 | [핵심 패턴: moduleAware](#103-핵심-패턴-moduleaware) |
| 10.4 | [라우트 가드](#104-라우트-가드) |
| 10.5 | [크로스 모듈 임포트 규칙](#105-크로스-모듈-임포트-규칙) |
| 10.6 | [적용 영역](#106-적용-영역) |
---
## 10.1 개요
SAM ERP는 멀티테넌트 시스템으로, 테넌트별 업종(`tenant.options.industry`)에 따라 필요한 모듈만 활성화합니다.
**핵심 원칙**: `industry` 미설정 시 모든 모듈 활성화 (기존 동작 100% 유지)
| 테넌트 | industry | 활성 모듈 |
|--------|----------|----------|
| 경동 | `manufacturing` | production, quality |
| 주일 | `construction` | construction |
| 미설정 | - | 전체 (기존 호환) |
---
## 10.2 모듈 구조
### 파일 구조
```
src/modules/
types.ts # ModuleId, TenantIndustry, MODULE_REGISTRY
tenant-config.ts # INDUSTRY_MODULE_MAP (업종별 활성 모듈 매핑)
index.ts # getModuleForRoute, getEnabledDashboardSections
src/hooks/useModules.ts # React Hook
```
### ModuleId 목록
| ModuleId | 설명 | 라우트 접두사 |
|----------|------|-------------|
| `common` | 공통 ERP | - |
| `production` | 생산관리 | `/production` |
| `quality` | 품질관리 | `/quality` |
| `construction` | 시공관리 | `/business/construction` |
| `vehicle-management` | 차량관리 | `/vehicle-management` |
### useModules Hook
```typescript
const { isEnabled, tenantIndustry, enabledModules } = useModules();
// 특정 모듈 활성화 여부 확인
if (isEnabled('production')) {
// 생산관리 관련 UI 표시
}
```
---
## 10.3 핵심 패턴: moduleAware
```typescript
const { isEnabled, tenantIndustry } = useModules();
const moduleAware = !!tenantIndustry; // industry 미설정 -> false -> 전부 허용
if (!moduleAware) return allData; // 기존과 동일
return filteredData; // 모듈 기반 필터링
```
- `moduleAware = false` -> 필터링 없음, 모든 기능 노출
- `moduleAware = true` -> 테넌트 업종에 맞는 모듈만 노출
---
## 10.4 라우트 가드
### 라우트 기반 가드 (ModuleGuard)
`/production/*`, `/quality/*` 등 전용 라우트는 layout.tsx에서 자동 차단:
```typescript
// src/app/[locale]/(protected)/production/layout.tsx