Files
vexplor/채번규칙_테이블기반_자동감지_구현_완료.md

336 lines
9.7 KiB
Markdown
Raw Permalink Normal View History

# 채번규칙 테이블 기반 자동 감지 구현 완료
## 📋 변경 요청사항
**요구사항**: 채번 규칙을 더 간단하게 만들기
1. 기본값을 `table`로 설정
2. 적용 범위 선택 UI 제거
3. 현재 화면의 테이블을 자동으로 감지하여 저장
## ✅ 구현 완료 내역
### 1. 데이터베이스 마이그레이션
**파일**: `db/migrations/046_update_numbering_rules_scope_type.sql`
#### 주요 변경사항:
- 기존 모든 규칙을 `table` 타입으로 변경
- `scope_type` 제약조건 단순화 (table만 지원)
- 불필요한 제약조건 제거 (global, menu 관련)
- 인덱스 최적화 (table_name + company_code)
```sql
-- 모든 기존 규칙을 table 타입으로 변경
UPDATE numbering_rules
SET scope_type = 'table'
WHERE scope_type IN ('global', 'menu');
-- table_name이 없는 규칙은 빈 문자열로 설정
UPDATE numbering_rules
SET table_name = ''
WHERE table_name IS NULL;
-- 제약조건: table 타입이면 table_name 필수
ALTER TABLE numbering_rules
ADD CONSTRAINT check_table_scope_requires_table_name
CHECK (
(scope_type = 'table' AND table_name IS NOT NULL)
OR scope_type != 'table'
);
-- 인덱스 최적화
CREATE INDEX IF NOT EXISTS idx_numbering_rules_table_company
ON numbering_rules(table_name, company_code);
```
### 2. 백엔드 API 간소화
**파일**:
- `backend-node/src/services/numberingRuleService.ts`
- `backend-node/src/controllers/numberingRuleController.ts`
#### 주요 변경사항:
- `menuObjid` 파라미터 제거
- 테이블명만으로 필터링 (`tableName` 필수)
- SQL 쿼리 단순화
**수정된 서비스 메서드**:
```typescript
async getAvailableRulesForScreen(
companyCode: string,
tableName: string
): Promise<NumberingRuleConfig[]> {
// menuObjid 제거, tableName만 사용
// WHERE table_name = $1 AND company_code = $2
}
```
**수정된 API 엔드포인트**:
```typescript
GET /api/numbering-rules/available-for-screen?tableName=item_info
// menuObjid 파라미터 제거
```
### 3. 프론트엔드 API 클라이언트 수정
**파일**: `frontend/lib/api/numberingRule.ts`
#### 주요 변경사항:
- `menuObjid` 파라미터 제거
- 테이블명만 전달
```typescript
export async function getAvailableNumberingRulesForScreen(
tableName: string // menuObjid 제거
): Promise<ApiResponse<NumberingRuleConfig[]>> {
const response = await apiClient.get("/numbering-rules/available-for-screen", {
params: { tableName },
});
return response.data;
}
```
### 4. 채번 규칙 디자이너 UI 대폭 간소화
**파일**: `frontend/components/numbering-rule/NumberingRuleDesigner.tsx`
#### 주요 변경사항:
##### ✅ Props 추가
```typescript
interface NumberingRuleDesignerProps {
// ... 기존 props
currentTableName?: string; // 현재 화면의 테이블명 자동 전달
}
```
##### ✅ 새 규칙 생성 시 자동 설정
```typescript
const handleNewRule = useCallback(() => {
const newRule: NumberingRuleConfig = {
// ...
scopeType: "table", // 기본값 table로 고정
tableName: currentTableName || "", // 현재 테이블명 자동 설정
};
}, [currentTableName]);
```
##### ✅ 저장 시 자동 설정
```typescript
const handleSaveRule = useCallback(async () => {
const ruleToSave = {
...currentRule,
scopeType: "table" as const, // 항상 table로 고정
tableName: currentTableName || currentRule.tableName || "", // 자동 감지
};
// 백엔드에 저장
}, [currentRule, currentTableName]);
```
##### ✅ UI 변경: 적용 범위 선택 제거
**이전**:
```tsx
{/* 적용 범위 선택 Select */}
<Select value={scopeType}>
<SelectItem value="global">전역</SelectItem>
<SelectItem value="table">테이블별</SelectItem>
<SelectItem value="menu">메뉴별</SelectItem>
</Select>
{/* 조건부: 테이블명 입력 */}
{scopeType === "table" && (
<Input value={tableName} onChange={...} />
)}
{/* 조건부: 메뉴 선택 */}
{scopeType === "menu" && (
<Select value={menuObjid}>...</Select>
)}
```
**현재 (간소화)**:
```tsx
{/* 자동 감지된 테이블 정보 표시 (읽기 전용) */}
{currentTableName && (
<div className="space-y-2">
<Label className="text-sm font-medium">적용 테이블</Label>
<div className="flex h-9 items-center rounded-md border border-input bg-muted px-3 text-sm text-muted-foreground">
{currentTableName}
</div>
<p className="text-muted-foreground text-xs">
이 규칙은 현재 화면의 테이블({currentTableName})에 자동으로 적용됩니다
</p>
</div>
)}
```
### 5. 화면관리에서 테이블명 전달
**파일**: `frontend/components/screen/panels/webtype-configs/TextTypeConfigPanel.tsx`
#### 주요 변경사항:
- `menuObjid` 제거, `tableName`만 사용
- 테이블명이 없으면 빈 배열 반환
```typescript
useEffect(() => {
const loadRules = async () => {
if (tableName) {
console.log("📋 테이블 기반 채번 규칙 조회:", { tableName });
response = await getAvailableNumberingRulesForScreen(tableName);
} else {
console.warn("⚠️ 테이블명이 없어 채번 규칙을 조회할 수 없습니다");
setNumberingRules([]);
return;
}
};
}, [localValues.autoValueType, tableName]); // menuObjid 제거
```
## 📊 변경 전후 비교
### 이전 방식 (복잡)
1. 사용자가 **적용 범위** 선택 (전역/테이블별/메뉴별)
2. 테이블별 선택 시 → 테이블명 **직접 입력**
3. 메뉴별 선택 시 → 메뉴 **수동 선택**
4. 저장 시 입력한 정보로 저장
**문제점**:
- UI가 복잡 (3단계 선택)
- 사용자가 테이블명을 수동 입력해야 함
- 오타 가능성
- 메뉴 기반 필터링은 복잡하고 직관적이지 않음
### 현재 방식 (간단)
1. 채번 규칙 디자이너 열기
2. 규칙 이름과 파트 설정
3. 저장 → **자동으로 현재 화면의 테이블명 저장됨**
**장점**:
- UI 단순 (적용 범위 선택 UI 제거)
- 테이블명 자동 감지 (오타 없음)
- 사용자는 규칙만 설계하면 됨
- 같은 테이블을 사용하는 화면에서 자동으로 규칙 공유
## 🔍 작동 흐름
### 1. 채번 규칙 생성
```
사용자: "새 규칙" 버튼 클릭
시스템: currentTableName (예: "item_info") 자동 감지
규칙 생성: scopeType = "table", tableName = "item_info"
저장 시: DB에 table_name = "item_info"로 저장됨
```
### 2. 화면관리에서 규칙 사용
```
사용자: 텍스트 필드 설정 → "자동값 유형" = "채번 규칙"
시스템: 현재 화면의 테이블명 (예: "item_info") 가져옴
API 호출: GET /api/numbering-rules/available-for-screen?tableName=item_info
백엔드: WHERE table_name = 'item_info' AND company_code = 'COMPANY_A'
응답: item_info 테이블에 대한 규칙 목록 반환
UI: 드롭다운에 해당 규칙들만 표시
```
## 🎯 핵심 개선 포인트
### ✅ 사용자 경험 (UX)
- **이전**: 3단계 선택 (범위 → 테이블/메뉴 → 입력/선택)
- **현재**: 규칙만 설계 (테이블은 자동 감지)
### ✅ 오류 가능성
- **이전**: 테이블명 직접 입력 → 오타 발생 가능
- **현재**: 자동 감지 → 오타 불가능
### ✅ 직관성
- **이전**: "이 규칙은 어디에 적용되나요?" → 사용자가 이해해야 함
- **현재**: "현재 화면의 테이블에 자동 적용" → 자동으로 알맞게 적용
### ✅ 코드 복잡도
- **이전**: 3가지 scopeType 처리 (global, table, menu)
- **현재**: 1가지 scopeType만 처리 (table)
## 🚀 다음 단계
### 1. 데이터베이스 마이그레이션 실행 (필수)
```bash
# PostgreSQL 비밀번호 확인 후 실행
PGPASSWORD=<실제_비밀번호> psql -h localhost -U postgres -d ilshin \
-f /Users/kimjuseok/ERP-node/db/migrations/046_update_numbering_rules_scope_type.sql
```
### 2. 통합 테스트
#### 테스트 시나리오:
1. 화면관리에서 `item_info` 테이블 선택
2. 채번 규칙 컴포넌트 열기
3. "새 규칙" 생성 → 자동으로 `tableName = "item_info"` 설정되는지 확인
4. 규칙 저장 → DB에 `scope_type = 'table'`, `table_name = 'item_info'`로 저장되는지 확인
5. 텍스트 필드 설정 → "자동값 유형" = "채번 규칙" 선택
6. 드롭다운에서 해당 규칙이 표시되는지 확인
7. 다른 테이블 화면에서는 해당 규칙이 **안 보이는지** 확인
### 3. 기존 데이터 마이그레이션 확인
마이그레이션 실행 후:
```sql
-- 모든 규칙이 table 타입인지 확인
SELECT scope_type, COUNT(*)
FROM numbering_rules
GROUP BY scope_type;
-- 결과: scope_type='table'만 나와야 함
-- table_name이 비어있는 규칙 확인
SELECT rule_id, rule_name, table_name
FROM numbering_rules
WHERE table_name = '' OR table_name IS NULL;
-- 결과: 비어있는 규칙이 있다면 수동 업데이트 필요
```
## 📝 변경된 파일 목록
### 데이터베이스
-`db/migrations/046_update_numbering_rules_scope_type.sql` (수정)
### 백엔드
-`backend-node/src/services/numberingRuleService.ts` (간소화)
-`backend-node/src/controllers/numberingRuleController.ts` (간소화)
### 프론트엔드
-`frontend/lib/api/numberingRule.ts` (간소화)
-`frontend/components/numbering-rule/NumberingRuleDesigner.tsx` (대폭 간소화)
-`frontend/components/screen/panels/webtype-configs/TextTypeConfigPanel.tsx` (간소화)
## 🎉 결론
채번 규칙 시스템이 대폭 간소화되었습니다!
**이제 사용자는**:
1. 화면관리에서 테이블 선택
2. 채번 규칙 디자이너에서 규칙 설계
3. 저장 → **자동으로 현재 테이블에 적용됨**
**시스템은**:
- 자동으로 현재 화면의 테이블명 감지
- 같은 테이블의 화면에서 규칙 자동 공유
- 오타 없는 정확한 매핑
완료! 🚀