76f43cea9b
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m30s
- 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) 는 의도적으로 미변경.
1.4 KiB
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 응답. SUBDOMAINUNIQUE 는 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;