docs: 다양한 문서 및 가이드 업데이트

- 여러 문서의 내용을 업데이트하여 최신 정보를 반영하였습니다.
- 컴포넌트 개발 가이드와 관련된 문서의 목차를 재구성하고, V2 및 Zod 레이아웃 시스템에 대한 내용을 추가하였습니다.
- 화면 컴포넌트 개발 가이드를 개선하여 핵심 원칙과 패턴을 명확히 설명하였습니다.
- 불필요한 문서 및 가이드를 삭제하고, 통합된 가이드를 통해 개발자들이 쉽게 참고할 수 있도록 하였습니다.
This commit is contained in:
kjs
2026-01-28 17:36:19 +09:00
parent e0ee375f01
commit 95bef976a5
276 changed files with 2544 additions and 2495 deletions

View File

@@ -254,7 +254,7 @@ app.use("/api/table-categories", tableCategoryValueRoutes); // 카테고리 값
app.use("/api/code-merge", codeMergeRoutes); // 코드 병합
app.use("/api/numbering-rules", numberingRuleRoutes); // 채번 규칙 관리
app.use("/api/entity-search", entitySearchRoutes); // 엔티티 검색
app.use("/api/entity", entityOptionsRouter); // 엔티티 옵션 (UnifiedSelect용)
app.use("/api/entity", entityOptionsRouter); // 엔티티 옵션 (V2Select용)
app.use("/api/driver", driverRoutes); // 공차중계 운전자 관리
app.use("/api/tax-invoice", taxInvoiceRoutes); // 세금계산서 관리
app.use("/api/cascading-relations", cascadingRelationRoutes); // 연쇄 드롭다운 관계 관리

View File

@@ -244,7 +244,7 @@ export const getUserList = async (req: AuthenticatedRequest, res: Response) => {
// 검색 조건 처리
if (search && typeof search === "string" && search.trim()) {
// 통합 검색
searchType = "unified";
searchType = "v2";
const searchTerm = search.trim();
whereConditions.push(`(

View File

@@ -105,7 +105,7 @@ export async function getDistinctColumnValues(req: AuthenticatedRequest, res: Re
}
/**
* 엔티티 옵션 조회 API (UnifiedSelect용)
* 엔티티 옵션 조회 API (V2Select용)
* GET /api/entity/:tableName/options
*
* Query Params:

View File

@@ -12,7 +12,7 @@ router.get("/:tableName", authenticateToken, searchEntity);
export default router;
// 엔티티 옵션 라우터 (UnifiedSelect용)
// 엔티티 옵션 라우터 (V2Select용)
export const entityOptionsRouter = Router();
/**

View File

@@ -11,7 +11,7 @@ import {
isValidWebType,
WEB_TYPE_TO_POSTGRES_CONVERTER,
WEB_TYPE_VALIDATION_PATTERNS,
} from "../types/unified-web-types";
} from "../types/v2-web-types";
import { DataflowControlService } from "./dataflowControlService";
// 테이블 컬럼 정보

View File

@@ -987,7 +987,7 @@ class NumberingRuleService {
}
// 카테고리 매핑에서 해당 값에 대한 형식 찾기
// selectedValue는 valueCode일 수 있음 (UnifiedSelect에서 valueCode를 value로 사용)
// selectedValue는 valueCode일 수 있음 (V2Select에서 valueCode를 value로 사용)
const selectedValueStr = String(selectedValue);
const mapping = categoryMappings.find(
(m: any) => {

View File

@@ -1406,7 +1406,7 @@ export class ScreenManagementService {
*/
private inferWebType(dataType: string): WebType {
// 통합 타입 매핑에서 import
const { DB_TYPE_TO_WEB_TYPE } = require("../types/unified-web-types");
const { DB_TYPE_TO_WEB_TYPE } = require("../types/v2-web-types");
const lowerType = dataType.toLowerCase();
@@ -1741,15 +1741,15 @@ export class ScreenManagementService {
? inputTypeMap.get(`${tableName}.${columnName}`)
: null;
// 🆕 Unified 컴포넌트는 덮어쓰지 않음 (새로운 컴포넌트 시스템 보호)
// 🆕 V2 컴포넌트는 덮어쓰지 않음 (새로운 컴포넌트 시스템 보호)
const savedComponentType = properties?.componentType;
const isUnifiedComponent = savedComponentType?.startsWith("unified-");
const isV2Component = savedComponentType?.startsWith("v2-");
const component = {
id: layout.component_id,
// 🔥 최신 componentType이 있으면 type 덮어쓰기 (단, Unified 컴포넌트는 제외)
type: isUnifiedComponent
? layout.component_type as any // Unified는 저장된 값 유지
// 🔥 최신 componentType이 있으면 type 덮어쓰기 (단, V2 컴포넌트는 제외)
type: isV2Component
? layout.component_type as any // V2는 저장된 값 유지
: (latestTypeInfo?.componentType || layout.component_type as any),
position: {
x: layout.position_x,
@@ -1759,8 +1759,8 @@ export class ScreenManagementService {
size: { width: layout.width, height: layout.height },
parentId: layout.parent_id,
...properties,
// 🔥 최신 inputType이 있으면 widgetType, componentType 덮어쓰기 (단, Unified 컴포넌트는 제외)
...(!isUnifiedComponent && latestTypeInfo && {
// 🔥 최신 inputType이 있으면 widgetType, componentType 덮어쓰기 (단, V2 컴포넌트는 제외)
...(!isV2Component && latestTypeInfo && {
widgetType: latestTypeInfo.inputType,
inputType: latestTypeInfo.inputType,
componentType: latestTypeInfo.componentType,

View File

@@ -10,7 +10,7 @@ import {
EntityJoinResponse,
EntityJoinConfig,
} from "../types/tableManagement";
import { WebType } from "../types/unified-web-types";
import { WebType } from "../types/v2-web-types";
import { entityJoinService } from "./entityJoinService";
import { referenceCacheService } from "./referenceCacheService";
@@ -4301,7 +4301,7 @@ export class TableManagementService {
*/
private inferWebType(dataType: string): WebType {
// 통합 타입 매핑에서 import
const { DB_TYPE_TO_WEB_TYPE } = require("../types/unified-web-types");
const { DB_TYPE_TO_WEB_TYPE } = require("../types/v2-web-types");
const lowerType = dataType.toLowerCase();

View File

@@ -5,7 +5,7 @@ export type ComponentType = "container" | "row" | "column" | "widget" | "group";
// 웹 타입 정의
// WebType은 통합 타입에서 import (중복 정의 제거)
import { WebType } from "./unified-web-types";
import { WebType } from "./v2-web-types";
export { WebType };
// 위치 정보

View File

@@ -264,7 +264,7 @@ export const WEB_TYPE_VALIDATION_PATTERNS: Record<WebType, RegExp | null> = {
};
// 업데이트된 웹 타입 옵션 (기존 WEB_TYPE_OPTIONS 대체)
export const UNIFIED_WEB_TYPE_OPTIONS = [
export const V2_WEB_TYPE_OPTIONS = [
{
value: "text",
label: "text",

View File

@@ -134,7 +134,7 @@ export const componentDefaults: Record<string, any> = {
"flow-widget": { type: "flow-widget", webType: "text", displayMode: "horizontal", allowDataMove: false, showStepCount: true },
"entity-search-input": { type: "entity-search-input", webType: "entity" },
"autocomplete-search-input": { type: "autocomplete-search-input", webType: "entity" },
"unified-list": { type: "unified-list", webType: "table" },
"v2-list": { type: "v2-list", webType: "table" },
"modal-repeater-table": { type: "modal-repeater-table", webType: "table", columns: [], multiSelect: true },
"category-manager": { type: "category-manager", webType: "custom" },
"numbering-rule": { type: "numbering-rule", webType: "text" },
@@ -159,10 +159,10 @@ export const componentDefaults: Record<string, any> = {
"repeat-screen-modal": { type: "repeat-screen-modal", webType: "custom" },
"related-data-buttons": { type: "related-data-buttons", webType: "custom" },
"split-panel-layout2": { type: "split-panel-layout2", webType: "custom" },
"unified-input": { type: "unified-input", webType: "text" },
"unified-select": { type: "unified-select", webType: "select" },
"unified-date": { type: "unified-date", webType: "date" },
"unified-repeater": { type: "unified-repeater", webType: "custom" },
"v2-input": { type: "v2-input", webType: "text" },
"v2-select": { type: "v2-select", webType: "select" },
"v2-date": { type: "v2-date", webType: "date" },
"v2-repeater": { type: "v2-repeater", webType: "custom" },
"v2-repeat-container": { type: "v2-repeat-container", webType: "custom" },
};