Files
invyone/db/migrations/RUN_084_MIGRATION.md
gbpark 68f85f3736 회사 관리 기능 확장 + 테넌트/비번 보안 하드닝
- 첫 로그인 비번 강제 변경 (RUN_082): FORCE_PASSWORD_CHANGE 컬럼,
  ForcePasswordChangeGuardFilter, /auth/change-password API + 페이지
- 테넌트 일관성 가드: TenantConsistencyGuardFilter 로 JWT.company_code
  ↔ 서브도메인 company_code 대조, CompanyResolver 가 (db_name, company_code)
  동시 반환
- 회사 관리 확장 (RUN_083 audit log, RUN_084 lifecycle 컬럼):
  CompanyAdmin/Members/Templates/Lifecycle/AuditLog 서비스 +
  CompanyMgmtController + SuperAdminGuard
- 회사 관리 UI: CompanyAccordionRow 탭화 + 모달 4종
  (AdminInfo/Deactivate/Delete/RecopyTemplates) + AuditLogDrawer + csvExport
- 프로비저닝 마법사: force_password_change 토글 반영
- 프론트 인증: storage 이벤트 멀티탭 동기화, 403 errorCode
  (PASSWORD_CHANGE_REQUIRED / CROSS_TENANT_REJECTED / TENANT_NOT_RESOLVED)
  전역 리다이렉트
- 기타: StartupSchemaMigrator, OS별 도커 기동 스크립트, CLAUDE.md 트래킹

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 00:36:05 +09:00

2.3 KiB

084 마이그레이션 — COMPANY_MNG 라이프사이클 컬럼 추가

작성일: 2026-04-24 작성자: gbpark 관련: 회사 관리 화면 비활성화/템플릿 트래킹 기능

목적

회사 관리 화면의 "비활성화 + 템플릿 탭 + 라이프사이클 이벤트" 지원을 위해 COMPANY_MNG 에 메타 필드 3 개 추가.

추가 컬럼

컬럼 타입 기본값 용도
INSTALLED_GROUPS JSONB '[]'::jsonb 프로비저닝 시 설치된 TableGroup id 배열 (예: ["SCREEN","CONTROL","BATCH","DASHBOARD"]). 템플릿 탭 렌더에 사용
DEACTIVATED_AT TIMESTAMP NULL DB_STATUS='suspended' 가 된 시각. 재활성화 시 NULL 로 리셋
DEACTIVATION_REASON VARCHAR(200) NULL SUPER_ADMIN 이 입력한 비활성화 사유 (감사 로그와 별개로 COMPANY_MNG 에도 즉시 조회용)

SQL

-- 084: 회사 라이프사이클 메타 컬럼
ALTER TABLE COMPANY_MNG
  ADD COLUMN IF NOT EXISTS INSTALLED_GROUPS    JSONB         DEFAULT '[]'::jsonb,
  ADD COLUMN IF NOT EXISTS DEACTIVATED_AT      TIMESTAMP,
  ADD COLUMN IF NOT EXISTS DEACTIVATION_REASON VARCHAR(200);

실행 (메타 DB 만)

psql -h 183.99.177.40 -U postgres -d invyone <<'SQL'
ALTER TABLE COMPANY_MNG
  ADD COLUMN IF NOT EXISTS INSTALLED_GROUPS    JSONB         DEFAULT '[]'::jsonb,
  ADD COLUMN IF NOT EXISTS DEACTIVATED_AT      TIMESTAMP,
  ADD COLUMN IF NOT EXISTS DEACTIVATION_REASON VARCHAR(200);
SQL

기존 회사 row 백필 (선택)

기존에 이미 프로비저닝된 회사 row 는 INSTALLED_GROUPS 가 빈 배열로 남음. 프로비저닝 로직이 지금은 선택 그룹 정보를 버리므로 소급 복원 불가 → 빈 배열 유지. 템플릿 탭은 "정보 없음" 으로 표시.

정확한 값이 필요하면 TableGroup.values() 의 required=true 3개(SCREEN, CONTROL, BATCH) 는 모든 회사에 필수로 들어갔으므로 최소 백필 가능:

UPDATE COMPANY_MNG
   SET INSTALLED_GROUPS = '["SCREEN","CONTROL","BATCH"]'::jsonb
 WHERE INSTALLED_GROUPS = '[]'::jsonb
   AND DB_STATUS = 'active';

롤백

ALTER TABLE COMPANY_MNG
  DROP COLUMN IF EXISTS INSTALLED_GROUPS,
  DROP COLUMN IF EXISTS DEACTIVATED_AT,
  DROP COLUMN IF EXISTS DEACTIVATION_REASON;