Skip to content

Latest commit

Β 

History

History
208 lines (164 loc) Β· 5.32 KB

File metadata and controls

208 lines (164 loc) Β· 5.32 KB

DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰ κ°€μ΄λ“œ

πŸ“ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 λͺ©λ‘

src/main/resources/db/migration/
β”œβ”€β”€ V2__align_pk_and_fk_types.sql          (PK/FK bigint 톡일)
β”œβ”€β”€ V3__convert_varchar_to_enum.sql        (varchar β†’ enum λ³€ν™˜)
└── V4__add_constraints_and_defaults.sql   (μ œμ•½μ‘°κ±΄ 및 κΈ°λ³Έκ°’)

πŸš€ μ‹€ν–‰ μˆœμ„œ

1️⃣ 사전 μ€€λΉ„ (ν•„μˆ˜)

βœ… μŠ€λƒ…μƒ· 확인

  • Dev DB μŠ€λƒ…μƒ· 생성 μ™„λ£Œ
  • Prod DB μŠ€λƒ…μƒ· 생성 μ™„λ£Œ (μ‹€μ œ 배포 μ „)

βœ… 데이터 검증 (ν•„μˆ˜)

# varchar 데이터가 Enumκ³Ό μΌμΉ˜ν•˜λŠ”μ§€ 검증
./run_validation.sh

μ€‘μš”: 검증 κ²°κ³Όκ°€ λΉ„μ–΄μžˆμ–΄μ•Ό 정상 (뢈일치 데이터 μ—†μŒ)

βœ… FK μ œμ•½μ‘°κ±΄λͺ… 확인 (선택)

# department, partnership의 FK 이름 확인
mysql -h <host> -u <user> -p <database> < check_fk_constraints.sql

2️⃣ Dev ν™˜κ²½ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜

방법 1: Flyway μžλ™ μ‹€ν–‰ (ꢌμž₯)

# application-dev.yml의 spring.flyway μ„€μ • 확인
# spring.jpa.hibernate.ddl-auto: none 확인

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œ μžλ™μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰
./gradlew bootRun --args='--spring.profiles.active=dev'

방법 2: μˆ˜λ™ μ‹€ν–‰

# V2 μ‹€ν–‰
mysql -h <host> -u <user> -p <database> < src/main/resources/db/migration/V2__align_pk_and_fk_types.sql

# 검증: PK/FK νƒ€μž… 확인
mysql -h <host> -u <user> -p -e "
  SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
  FROM information_schema.COLUMNS
  WHERE TABLE_SCHEMA = '<database>'
    AND COLUMN_NAME IN ('college_id', 'department_id')
  ORDER BY TABLE_NAME;
"

# V3 μ‹€ν–‰
mysql -h <host> -u <user> -p <database> < src/main/resources/db/migration/V3__convert_varchar_to_enum.sql

# 검증: Enum νƒ€μž… 확인
mysql -h <host> -u <user> -p -e "
  SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE
  FROM information_schema.COLUMNS
  WHERE TABLE_SCHEMA = '<database>'
    AND DATA_TYPE = 'enum'
  ORDER BY TABLE_NAME;
"

# V4 μ‹€ν–‰
mysql -h <host> -u <user> -p <database> < src/main/resources/db/migration/V4__add_constraints_and_defaults.sql

# 검증: μ œμ•½μ‘°κ±΄ 확인
mysql -h <host> -u <user> -p -e "
  SHOW CREATE TABLE college;
  SHOW CREATE TABLE menu;
  SHOW CREATE TABLE review;
"

3️⃣ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 검증

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν…ŒμŠ€νŠΈ

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž¬μ‹œμž‘
./gradlew bootRun --args='--spring.profiles.active=dev'

# 둜그 확인
# - Enum λ§€ν•‘ 였λ₯˜ μ—†λŠ”μ§€
# - DB μ—°κ²° 정상인지
# - API 호좜 정상인지

DB 데이터 확인

-- Enum κ°’ 쑰회 ν…ŒμŠ€νŠΈ
SELECT restaurant, time_part FROM meal LIMIT 10;
SELECT provider, role, status FROM user LIMIT 10;

-- PK/FK νƒ€μž… 확인
SELECT
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE,
    COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = '<database>'
  AND COLUMN_NAME IN ('college_id', 'department_id')
ORDER BY TABLE_NAME, COLUMN_NAME;

-- μ œμ•½μ‘°κ±΄ 확인
SELECT
    TABLE_NAME,
    CONSTRAINT_NAME,
    CONSTRAINT_TYPE
FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = '<database>'
  AND TABLE_NAME IN ('college', 'menu', 'review');

4️⃣ Prod ν™˜κ²½ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜

μ‹€ν–‰ μ „ 체크리슀트

  • Dev ν™˜κ²½ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ™„λ£Œ 및 검증
  • Dev ν™˜κ²½ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 정상 λ™μž‘ 확인
  • Prod DB μŠ€λƒ…μƒ· 생성 μ™„λ£Œ
  • 데이터 검증 (validate_enum_data.sql) μ™„λ£Œ
  • μ‚¬μš©λŸ‰μ΄ 적은 μ‹œκ°„λŒ€ 선택 (μƒˆλ²½ 2-4μ‹œ ꢌμž₯)
  • λ‘€λ°± κ³„νš 수립

μ‹€ν–‰

# Prod ν™˜κ²½μ—μ„œ λ™μΌν•˜κ²Œ μ‹€ν–‰
./gradlew bootRun --args='--spring.profiles.active=prod'

# λ˜λŠ” μˆ˜λ™ μ‹€ν–‰
mysql -h <prod-host> -u <user> -p <database> < V2__align_pk_and_fk_types.sql
mysql -h <prod-host> -u <user> -p <database> < V3__convert_varchar_to_enum.sql
mysql -h <prod-host> -u <user> -p <database> < V4__add_constraints_and_defaults.sql

⚠️ μ£Όμ˜μ‚¬ν•­

1. metadata lock λ°©μ§€

  • μ‚¬μš©λŸ‰μ΄ 적은 μ‹œκ°„λŒ€μ— μ‹€ν–‰
  • μ‹€ν–‰ 쀑 λ‹€λ₯Έ μ„Έμ…˜μ—μ„œ DDL μž‘μ—… κΈˆμ§€

2. 데이터 검증 ν•„μˆ˜

# V3 μ‹€ν–‰ μ „ λ°˜λ“œμ‹œ 검증
./run_validation.sh

3. FK μ œμ•½μ‘°κ±΄ 처리

  • V2μ—μ„œ SET FOREIGN_KEY_CHECKS = 0/1 μ‚¬μš©
  • FK μ œμ•½μ‘°κ±΄μ€ μžλ™μœΌλ‘œ μœ μ§€λ¨

4. λ‘€λ°± 방법

# AWS RDS μŠ€λƒ…μƒ·μœΌλ‘œ 볡원
aws rds restore-db-instance-from-db-snapshot \
    --db-instance-identifier your-db-restored \
    --db-snapshot-identifier eatssu-dev-pre-migration-20260207

πŸ› 문제 λ°œμƒ μ‹œ

1. Enum λ³€ν™˜ μ‹€νŒ¨

ERROR 1265: Data truncated for column 'restaurant' at row 1

원인: DB에 Enum에 μ—†λŠ” 값이 쑴재 ν•΄κ²°: validate_enum_data.sql μ‹€ν–‰ν•˜μ—¬ 뢈일치 데이터 μ°ΎκΈ°

2. PK νƒ€μž… λ³€κ²½ μ‹€νŒ¨

ERROR 1833: Cannot change column: used in a foreign key constraint

원인: FK μ œμ•½μ‘°κ±΄μ΄ 걸렀있음 ν•΄κ²°: V2 νŒŒμΌμ— SET FOREIGN_KEY_CHECKS = 0 이미 포함됨

3. unique μ œμ•½μ‘°κ±΄ μ‹€νŒ¨

ERROR 1062: Duplicate entry for key 'UK_college_name'

원인: college.name에 쀑볡 데이터 쑴재 ν•΄κ²°: 쀑볡 데이터 정리 ν›„ λ‹€μ‹œ μ‹€ν–‰


βœ… μ™„λ£Œ 확인

  • V2, V3, V4 λͺ¨λ‘ 정상 μ‹€ν–‰
  • flyway_schema_history ν…Œμ΄λΈ”μ— 기둝 확인
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 정상 λ™μž‘ 확인
  • API ν…ŒμŠ€νŠΈ 톡과
  • λ‘œκ·Έμ— 였λ₯˜ μ—†μŒ