refactor(테이블타입): 3-layer 분리 + CI OOM fix #9

Merged
johngreen merged 3 commits from johngreen into main 2026-05-13 06:32:16 +00:00
Contributor

요약

박창현 PO 요청: 테이블 타입 관리에서 8개만 선택 가능하게 + UI 변형은 화면관리 컴포넌트로.

본 PR 3 commit:

  1. refactor(테이블타입): 3-layer 분리 — DB 12개 유지 / UI 드롭다운 8개 / Layer 3 widget variant
  2. refactor(테이블타입): backend INSERT/UPDATE 8개 validate 백스톱
  3. fix(CI): frontend build OOM 방지 (NODE_OPTIONS=--max-old-space-size=4096)

배경

  • 박창현 image 2 + vexplor_rps INPUT_TYPE_DETAIL_TYPES + 박창현 vexplor 마스터 플랜
  • 운영 DB 35,316 row 중 96.6% 이미 8개 안 (V0 검증). legacy 3.4% (category 888 외)

주요 변경

Layer 1 (DB 12개) — 변경 없음

mapper 5곳 (categoryTree/entityJoin/tableCategoryValue/screenManagement/tableManagement/entityReference) 그대로. 마이그레이션 SQL zero.

Layer 2 (UI 8개) — 7 호출처

USER_SELECTABLE_INPUT_TYPE_ORDER: text/number/date/code/entity/numbering/file/image

Layer 3 (widget variant)

input-type-mapping.ts 재작성. vexplor_rps INPUT_TYPE_DETAIL_TYPES 그대로 + select/checkbox/radio variant 를 code base 로 흡수. Backward shim 으로 V2/Properties/DetailSettingsPanel 호환.

Legacy UX

기존 select/category row 편집 시 드롭다운 disabled + Alert 배너.

Backend 백스톱

normalizeInputType(value, context) 오버로드 + DdlService 동일 패턴.

CI OOM Fix

main 8연속 build 실패 (run 113~120) 원인: Next.js V8 heap spike + 30개 동시 서비스 → OOM killer. NODE_OPTIONS=4096 으로 cap.

검증

  • Backend gradle build 통과
  • Frontend grep 자체 검증 (10 파일)
  • mapper 0건 변경 / POP 격리 / shim 호환

산출물

spec: .omc/specs/deep-dive-table-type-storage-ui-separation.md (v3.2)

## 요약 박창현 PO 요청: 테이블 타입 관리에서 8개만 선택 가능하게 + UI 변형은 화면관리 컴포넌트로. 본 PR 3 commit: 1. **refactor(테이블타입)**: 3-layer 분리 — DB 12개 유지 / UI 드롭다운 8개 / Layer 3 widget variant 2. **refactor(테이블타입)**: backend INSERT/UPDATE 8개 validate 백스톱 3. **fix(CI)**: frontend build OOM 방지 (NODE_OPTIONS=--max-old-space-size=4096) ## 배경 - 박창현 image 2 + vexplor_rps INPUT_TYPE_DETAIL_TYPES + 박창현 vexplor 마스터 플랜 - 운영 DB 35,316 row 중 96.6% 이미 8개 안 (V0 검증). legacy 3.4% (category 888 외) ## 주요 변경 ### Layer 1 (DB 12개) — 변경 없음 mapper 5곳 (categoryTree/entityJoin/tableCategoryValue/screenManagement/tableManagement/entityReference) 그대로. 마이그레이션 SQL zero. ### Layer 2 (UI 8개) — 7 호출처 USER_SELECTABLE_INPUT_TYPE_ORDER: text/number/date/code/entity/numbering/file/image ### Layer 3 (widget variant) input-type-mapping.ts 재작성. vexplor_rps INPUT_TYPE_DETAIL_TYPES 그대로 + select/checkbox/radio variant 를 code base 로 흡수. Backward shim 으로 V2/Properties/DetailSettingsPanel 호환. ### Legacy UX 기존 select/category row 편집 시 드롭다운 disabled + Alert 배너. ### Backend 백스톱 normalizeInputType(value, context) 오버로드 + DdlService 동일 패턴. ### CI OOM Fix main 8연속 build 실패 (run 113~120) 원인: Next.js V8 heap spike + 30개 동시 서비스 → OOM killer. NODE_OPTIONS=4096 으로 cap. ## 검증 - Backend gradle build 통과 - Frontend grep 자체 검증 (10 파일) - mapper 0건 변경 / POP 격리 / shim 호환 ## 산출물 spec: `.omc/specs/deep-dive-table-type-storage-ui-separation.md` (v3.2)
johngreen added 3 commits 2026-05-13 06:31:55 +00:00
- input-type-mapping.ts: BaseInputType 10개 → UserSelectableInputType 8개 (박창현 image 2). vexplor_rps INPUT_TYPE_DETAIL_TYPES 포팅, select/checkbox/radio variant 를 code base 로 흡수
- input-types.ts: USER_SELECTABLE_INPUT_TYPE_ORDER/LABELS re-export (InputType 12개는 그대로)
- getDetailType.ts (신규): getWidgetVariants / getDefaultWidgetVariant helper
- 드롭다운 호출처 7개 8개 제한: ColumnDetailPanel, AddColumnModal, ColumnDefinitionTable, tableMngList/page.tsx, TableSettingModal, TypeOverviewStrip, types.ts
- ColumnDetailPanel: Legacy row 드롭다운 disabled + v5-glow-sm Alert 배너
- backward shim: BaseInputType / BASE_INPUT_TYPE_OPTIONS / getBaseInputType 등 V2/Properties/DetailSettingsPanel 호환

운영 DB 96.6% 가 이미 8개 안 (V0, 35,316 row). DB zero touch, mapper 5곳 보호.

spec: .omc/specs/deep-dive-table-type-storage-ui-separation.md (v3.2)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- TableManagementService.normalizeInputType(value, context) 오버로드 — user-insert/user-update-type 만 8개 검증, user-update-other/system-normalize 는 skip
- TableManagementService.updateColumnSettings: payload 의 input_type 키 존재 여부로 context 분기 (input_type 자체 변경 vs 다른 속성 변경)
- DdlService.addColumn / saveColumnMetadata: convertToInputType 결과를 USER_SELECTABLE_INPUT_TYPES (8개) 와 대조, 외이면 IllegalArgumentException

mapper XML 5곳 (categoryTree / entityJoin / tableCategoryValue / screenManagement / tableManagement / entityReference) 무변경 — READ 경로 12개 그대로.

spec: .omc/specs/deep-dive-table-type-storage-ui-separation.md (v3.2 §6.3)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
main 의 최근 8연속 build 실패 (run 113~120) 원인이 docker build 단계의 OOM Killed.

진단:
- wace 호스트 32GB / available 24GB 충분, 시스템 OOM 기록 없음
- act_runner systemd MemoryMax=infinity, config container.options=null (제한 없음)
- 그러나 Next.js build V8 heap spike (5-8GB+) 가 다른 30개 동시 가동 서비스 (k3s/mailu/nextcloud/mattermost 등) 와 충돌
- Committed_AS 21.6 GB / Limit 24.8 GB 한계 — page touch 시 oom-killer 가 build process kill
- 결과: 28분 빌드 후 Killed → 8연속 main 배포 실패

조치:
- builder stage 에 NODE_OPTIONS=--max-old-space-size=4096 명시 → V8 heap 4GB 로 cap
- build process 가 알아서 절제 → OOM killer 트리거 안 됨

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
johngreen merged commit ae899a3589 into main 2026-05-13 06:32:16 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gbpark/invyone#9