docs: 컴포넌트-컬럼 연결 주의사항 및 일괄 수정 SQL 추가
- 컴포넌트 배치 시 "component"로 표시되는 문제와 그 해결 방법을 문서화하였습니다. - `overrides.type` 필드 누락 문제를 진단하고, 이를 해결하기 위한 일괄 수정 SQL 쿼리를 추가하였습니다. - V2 컴포넌트의 자동 매핑 규칙과 관련된 내용을 명확히 하여, 개발자들이 올바른 컴포넌트를 생성할 수 있도록 안내하였습니다. - 수정된 화면 및 컴포넌트 수에 대한 통계를 포함하여, 일괄 수정 실행 결과를 기록하였습니다.
This commit is contained in:
@@ -42,6 +42,53 @@ const pool = new Pool({
|
||||
|
||||
---
|
||||
|
||||
## 절대 주의: 컴포넌트-컬럼 연결 (이전 실패 원인)
|
||||
|
||||
### "component" vs "v2-input" 구분
|
||||
|
||||
```
|
||||
❌ 잘못된 상태 ✅ 올바른 상태
|
||||
┌──────────────────┐ ┌──────────────────┐
|
||||
│ component │ │ v2-input │
|
||||
│ 업체코드 │ │ 업체코드 │
|
||||
└──────────────────┘ └──────────────────┘
|
||||
↑ ↑
|
||||
overrides.type 없음 overrides.type = "v2-input"
|
||||
```
|
||||
|
||||
**핵심 원인**: 컴포넌트를 그냥 배치하면 "component"로 표시됨. 반드시 왼쪽 패널에서 테이블 컬럼을 **드래그**해야 올바른 v2-xxx 컴포넌트가 생성됨.
|
||||
|
||||
### 🔥 핵심 발견: overrides.type 필수 (2026-02-04 발견)
|
||||
|
||||
**"component"로 표시되는 근본 원인:**
|
||||
|
||||
| 항목 | 드래그로 배치 | 마이그레이션 (잘못된) |
|
||||
|------|---------------|----------------------|
|
||||
| `overrides.type` | **"v2-input"** ✅ | **없음** ❌ |
|
||||
| `overrides.webType` | "text" 등 | 없음 |
|
||||
| `overrides.tableName` | "carrier_mng" 등 | 없음 |
|
||||
|
||||
**프론트엔드가 컴포넌트 타입을 인식하는 방법:**
|
||||
1. `overrides.type` 확인 → 있으면 해당 값 사용 (예: "v2-input")
|
||||
2. 없으면 → 기본값 "component"로 폴백
|
||||
|
||||
**결론**: 마이그레이션 시 `overrides.type` 필드를 반드시 설정해야 함!
|
||||
|
||||
### input_type → V2 컴포넌트 자동 매핑
|
||||
|
||||
| table_type_columns.input_type | 드래그 시 생성되는 V2 컴포넌트 |
|
||||
|-------------------------------|-------------------------------|
|
||||
| text | v2-input |
|
||||
| number | v2-input (type=number) |
|
||||
| date | v2-date |
|
||||
| category | v2-select (category_values 연동) |
|
||||
| numbering | v2-numbering-rule 또는 v2-input |
|
||||
| entity | v2-entity-search |
|
||||
|
||||
**절대 규칙**: 컴포넌트가 "component"로 표시되면 연결 실패 상태. 반드시 "v2-xxx"로 표시되어야 함.
|
||||
|
||||
---
|
||||
|
||||
## 핵심 개념
|
||||
|
||||
### V1 vs V2 구조 차이
|
||||
@@ -283,6 +330,8 @@ detail_settings, company_code
|
||||
1. **개발서버 → 본서버 마이그레이션** (반대 방향)
|
||||
2. **본서버 데이터 직접 수정** (SELECT만 허용)
|
||||
3. **company_code 누락** (멀티테넌시 필수)
|
||||
4. **테이블-컬럼 연결 없이 컴포넌트 배치** ("component"로 표시되면 실패)
|
||||
5. **menu_objid 기반 카테고리/채번 사용** (V2는 table_name + column_name 기반)
|
||||
|
||||
### 반드시 할 것
|
||||
|
||||
@@ -290,6 +339,77 @@ detail_settings, company_code
|
||||
2. 컴포넌트 변환 시 **V2 컴포넌트만 사용** (v2- prefix)
|
||||
3. 모달 화면은 **부모 화면에 통합**
|
||||
4. 카테고리/채번은 **table_name + column_name 기반**
|
||||
5. 컴포넌트 배치 후 **"v2-xxx"로 표시되는지 반드시 확인**
|
||||
|
||||
### 실패 사례 (이전 작업자)
|
||||
|
||||
**물류정보관리 → 운송업체 관리 마이그레이션 실패**
|
||||
|
||||
- **원인**: 컴포넌트를 직접 배치하여 "component"로 생성됨
|
||||
- **증상**: 화면에 "component" 라벨 표시, 데이터 바인딩 실패
|
||||
- **해결**: 왼쪽 패널에서 테이블 컬럼을 드래그하여 "v2-input" 등으로 생성
|
||||
|
||||
---
|
||||
|
||||
## 🔧 일괄 수정 SQL (overrides.type 누락 문제)
|
||||
|
||||
### 문제 진단 쿼리
|
||||
|
||||
```sql
|
||||
-- overrides.type이 없는 컴포넌트 수 확인
|
||||
SELECT
|
||||
COUNT(DISTINCT sv2.screen_id) as affected_screens,
|
||||
COUNT(*) as affected_components
|
||||
FROM screen_layouts_v2 sv2,
|
||||
jsonb_array_elements(sv2.layout_data->'components') as comp
|
||||
WHERE (comp->>'url' LIKE '%/v2-input'
|
||||
OR comp->>'url' LIKE '%/v2-select'
|
||||
OR comp->>'url' LIKE '%/v2-date')
|
||||
AND NOT (comp->'overrides' ? 'type');
|
||||
```
|
||||
|
||||
### 일괄 수정 쿼리 (개발서버에서만!)
|
||||
|
||||
```sql
|
||||
UPDATE screen_layouts_v2
|
||||
SET layout_data = jsonb_set(
|
||||
layout_data,
|
||||
'{components}',
|
||||
(
|
||||
SELECT jsonb_agg(
|
||||
CASE
|
||||
WHEN comp->>'url' LIKE '%/v2-input' AND NOT (comp->'overrides' ? 'type')
|
||||
THEN jsonb_set(comp, '{overrides,type}', '"v2-input"')
|
||||
WHEN comp->>'url' LIKE '%/v2-select' AND NOT (comp->'overrides' ? 'type')
|
||||
THEN jsonb_set(comp, '{overrides,type}', '"v2-select"')
|
||||
WHEN comp->>'url' LIKE '%/v2-date' AND NOT (comp->'overrides' ? 'type')
|
||||
THEN jsonb_set(comp, '{overrides,type}', '"v2-date"')
|
||||
WHEN comp->>'url' LIKE '%/v2-textarea' AND NOT (comp->'overrides' ? 'type')
|
||||
THEN jsonb_set(comp, '{overrides,type}', '"v2-textarea"')
|
||||
ELSE comp
|
||||
END
|
||||
)
|
||||
FROM jsonb_array_elements(layout_data->'components') comp
|
||||
)
|
||||
),
|
||||
updated_at = NOW()
|
||||
WHERE EXISTS (
|
||||
SELECT 1 FROM jsonb_array_elements(layout_data->'components') c
|
||||
WHERE (c->>'url' LIKE '%/v2-input' OR c->>'url' LIKE '%/v2-select'
|
||||
OR c->>'url' LIKE '%/v2-date' OR c->>'url' LIKE '%/v2-textarea')
|
||||
AND NOT (c->'overrides' ? 'type')
|
||||
);
|
||||
```
|
||||
|
||||
### 2026-02-04 일괄 수정 실행 결과
|
||||
|
||||
| 항목 | 수량 |
|
||||
|------|------|
|
||||
| 수정된 화면 | 397개 |
|
||||
| 수정된 컴포넌트 | 2,455개 |
|
||||
| v2-input | 1,983개 |
|
||||
| v2-select | 336개 |
|
||||
| v2-date | 136개 |
|
||||
|
||||
---
|
||||
|
||||
@@ -298,6 +418,10 @@ detail_settings, company_code
|
||||
| 날짜 | 메뉴 | 담당 | 상태 | 비고 |
|
||||
|------|------|------|------|------|
|
||||
| 2026-02-03 | 품질관리 | DDD1542 | 분석 완료 | 마이그레이션 대기 |
|
||||
| 2026-02-03 | 물류관리 (운송업체) | 이전 신하 | ❌ 실패 | component 연결 오류 |
|
||||
| 2026-02-03 | 문서 학습 | DDD1542 | ✅ 완료 | 핵심 4개 문서 정독, 학습노트 작성 |
|
||||
| **2026-02-04** | **overrides.type 원인 분석** | **AI** | **✅ 완료** | **핵심 원인 발견: overrides.type 누락** |
|
||||
| **2026-02-04** | **전체 입력폼 일괄 수정** | **AI** | **✅ 완료** | **397개 화면, 2,455개 컴포넌트 수정** |
|
||||
| | 물류관리 | - | 미시작 | |
|
||||
| | 생산관리 | - | 미시작 | |
|
||||
| | 영업관리 | - | 미시작 | |
|
||||
@@ -323,3 +447,7 @@ detail_settings, company_code
|
||||
| 날짜 | 작성자 | 내용 |
|
||||
|------|--------|------|
|
||||
| 2026-02-03 | DDD1542 | 초안 작성 |
|
||||
| 2026-02-03 | DDD1542 | 컴포넌트-컬럼 연결 주의사항 추가 (이전 실패 원인) |
|
||||
| 2026-02-03 | DDD1542 | 개인 학습노트 작성 (V2_마이그레이션_학습노트_DDD1542.md) |
|
||||
| **2026-02-04** | **AI** | **핵심 원인 발견: overrides.type 필드 누락 문제** |
|
||||
| **2026-02-04** | **AI** | **일괄 수정 SQL 추가 및 397개 화면 수정 완료** |
|
||||
|
||||
Reference in New Issue
Block a user