Files
invyone/db/migrations/RUN_080_MIGRATION.md
T
gbpark 76f43cea9b
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m30s
DB 이름 vexplor → invyone 전환
- application.yml, k8s configmap, docker-compose 4종: SPRING_DATASOURCE_URL path
- provisioning 코드: {prefix}_vexplor → {prefix}_invyone 테넌트 DB 네이밍 규칙
- 프론트 마법사: Step1Basic, Step4Run 미리보기 라벨
- CompanyAccordionRow: 기본 DB 이름 포맷
- 마이그레이션/멀티테넌시 문서 동기화
- Traefik 와일드카드 설정 산출물 보관 (notes/)

비밀번호(vexplor0909!!) 및 역사 기록 문서(INVYONE_CONCEPT,
DDD1542, test-output, dashboard-runtime-fixes) 는 의도적으로 미변경.
2026-04-24 19:15:06 +09:00

1.4 KiB

080 마이그레이션 실행 가이드 — DB_NAME UNIQUE + race condition 방어

작성일: 2026-04-24 작성자: gbpark 관련: Codex 리뷰 #4 — ProvisioningController 중복 체크 race condition 방어

목적

회사 프로비저닝 중복 체크와 INSERT 사이 race condition 을 DB 레벨에서 차단.

  • 현재 Controller: exists → insert 두 단계 사이 동시에 같은 subdomain 요청 들어오면 둘 다 통과 → DB 두 건 INSERT.
  • 해결: SUBDOMAIN, DB_NAME 에 UNIQUE 제약. INSERT 실패 시 DuplicateKeyException → Controller 에서 409 응답.
  • SUBDOMAIN UNIQUE 는 079 마이그레이션에 이미 포함됨. 이번엔 DB_NAME 만 추가.

SQL

-- 080: DB_NAME UNIQUE 제약
CREATE UNIQUE INDEX IF NOT EXISTS UX_COMPANY_MNG_DB_NAME
  ON COMPANY_MNG (DB_NAME)
  WHERE DB_NAME IS NOT NULL;

COMPANY_CODE 는 이미 테이블 생성 시 PK 이므로 별도 제약 불필요.

실행 방법

DBeaver / pgAdmin

위 SQL 블록을 invyone DB 에 실행.

psql

psql -h 183.99.177.40 -U postgres -d invyone <<'SQL'
CREATE UNIQUE INDEX IF NOT EXISTS UX_COMPANY_MNG_DB_NAME
  ON COMPANY_MNG (DB_NAME)
  WHERE DB_NAME IS NOT NULL;
SQL

확인 쿼리

SELECT indexname, indexdef FROM pg_indexes
 WHERE tablename = 'company_mng'
   AND indexname IN ('ux_company_mng_subdomain', 'ux_company_mng_db_name');

롤백

DROP INDEX IF EXISTS UX_COMPANY_MNG_DB_NAME;