챕터 2.3: 데이터베이스 마이그레이션
학습 시간: 50분
1. 마이그레이션: 우주 정거장 건설
Laravel의 마이그레이션은 데이터베이스를 위한 버전 관리 시스템입니다.
다음과 같이 상상해 보세요:
- 🏗️ 정거장 설계도를 만듭니다 (
create_planets_table
마이그레이션) - 🚀 모듈을 배포합니다 (마이그레이션 실행)
- 🔧 구조를 현대화합니다 (새로운 마이그레이션)
- ⏪ 이전 버전으로 되돌릴 수 있습니다 (롤백)
💡 중요: 마이그레이션은 팀이 일관되게 작업할 수 있도록 합니다 — 마치 다른 대륙에서 ISS를 건설하는 엔지니어들처럼요!
2. 마이그레이션 실행
챕터 2.2에서 마이그레이션을 생성한 후 다음을 실행하세요:
터미널 출력:
마이그레이션 테이블이 성공적으로 생성되었습니다.
마이그레이션 중: 2014_10_12_000000_create_users_table
마이그레이션 완료: 2014_10_12_000000_create_users_table (25.12ms)
마이그레이션 중: 2014_10_12_100000_create_password_reset_tokens_table
마이그레이션 완료: 2014_10_12_100000_create_password_reset_tokens_table (18.07ms)
마이그레이션 중: 2019_08_19_000000_create_failed_jobs_table
마이그레이션 완료: 2019_08_19_000000_create_failed_jobs_table (21.33ms)
마이그레이션 중: 2019_12_14_000001_create_personal_access_tokens_table
마이그레이션 완료: 2019_12_14_000001_create_personal_access_tokens_table (30.45ms)
마이그레이션 중: 2025_08_04_000000_create_planets_table
마이그레이션 완료: 2025_08_04_000000_create_planets_table (15.67ms) # 당신의 테이블!
pgAdmin 4에서 확인:
space_api
데이터베이스 → Schemas → Tables를 엽니다.- 다음이 나타나는지 확인하세요: -
planets
-users
-password_reset_tokens
3. 마이그레이션 롤백: 비상 복귀
구조를 수정해야 할 경우:
php artisan migrate:fresh
— 개발에서 가장 유용한 명령어입니다! 모든 테이블을 삭제하고 모든 마이그레이션을 다시 실행합니다.php artisan migrate:fresh --seed
—fresh
와 동일하게 작동하지만, 마이그레이션 후 즉시 시더를 실행합니다. 이것은 데이터베이스를 완전히 "초기화"하는 명령어입니다.
사용 시나리오:
# 1단계: 마이그레이션에 오류가 있음을 깨달았습니다. 데이터베이스를 완전히 다시 만듭니다.
php artisan migrate:fresh
# 2단계: 마이그레이션을 편집합니다.
# 3단계: 이미 수정된 마이그레이션으로 데이터베이스를 다시 만듭니다.
php artisan migrate:fresh
4. 새 필드 추가: 정거장 현대화
예시: is_habitable
필드(행성이 거주 가능한지 여부)를 추가합니다.
1단계: 새 마이그레이션 생성
2단계: 파일 편집 database/migrations/..._add_is_habitable_to_planets_table.php
<?php
public function up()
{
Schema::table('planets', function (Blueprint $table) {
$table->boolean('is_habitable')
->default(false);
});
}
public function down()
{
Schema::table('planets', function (Blueprint $table) {
$table->dropColumn('is_habitable');
});
}
3단계: 업데이트 실행
5. 데이터베이스 채우기: 첫 번째 행성들
시더(Seeder)를 만듭니다 — 테스트 데이터를 생성하기 위한 스크립트입니다.
1단계: 시더 생성
2단계: 편집 database/seeders/PlanetSeeder.php
<?php
use App\Models\Planet; // 행성 모델을 임포트합니다 - 없으면 오류가 발생합니다!
class PlanetSeeder extends Seeder
{
public function run()
{
Planet::create([
'name' => '지구',
'description' => '다양한 생명체가 있는 푸른 행성',
'size_km' => 12742,
'solar_system' => '태양계',
'image_url' => 'https://example.com/earth.jpg',
'is_habitable' => true
]);
Planet::create([
'name' => '화성',
'description' => '미래 식민지화의 목표인 붉은 행성',
'size_km' => 6779,
'solar_system' => '태양계',
'is_habitable' => false
]);
}
}
3단계: 시더를 등록합니다 database/seeders/DatabaseSeeder.php
에
4단계: 채우기 실행
6. PostgreSQL 작업: 특징
데이터 유형 특징:
기능 | PostgreSQL | MySQL | Laravel 주석 |
---|---|---|---|
논리 타입 | boolean (실제 true /false ) |
tinyint(1) (0 /1 저장) |
$table->boolean('...') 둘 다 작동 |
JSON | jsonb (바이너리, 인덱싱 가능) |
json (텍스트) |
$table->jsonb('...') - PG에서 매우 강력함 |
배열 | text[] , integer[] (네이티브 배열) |
없음 (JSON 또는 문자열로 에뮬레이션됨) | $table->array('...') (PG 전용) |
컬럼 순서 | 제어할 수 없음 (after() 작동 안함) |
제어할 수 있음 (after() ) |
Laravel이 이를 추상화하지만, 제약을 알아야 합니다. |
인덱스 생성 예시:
7. psql에서 데이터 확인
아무 그래픽 클라이언트를 사용하고 거기서 space_api를 선택하여 볼 수 있습니다.
콘솔 사용 시:
어떤 경우든 출력은 다음과 같아야 합니다:
id | name | description | size_km | solar_system | image_url | is_habitable |
---|---|---|---|---|---|---|
1 | 지구 | 다양한 생명체가 있는 푸른 행성 | 12742 | 태양계 | ... | true |
2 | 화성 | 미래 식민지화의 목표인 붉은 행성 | 6779 | 태양계 | null | false |
확인을 위한 퀴즈
🚀 장 요약:
다음과 같이 "우주 인프라 구축"을 마스터했습니다:
- ✅ 마이그레이션 생성 및 실행
- 🔧 테이블 구조 현대화
- 🌍 첫 번째 행성으로 DB 채우기
- ⚙️ PostgreSQL 작업 방법 학습
당신의 우주가 첫 번째 세계를 얻었습니다! 이제 행성 관리를 위한 API 인터페이스 생성을 진행할 수 있습니다.
📌 확인:
php artisan tinker
실행App\Models\Planet::all()
실행- 지구와 화성이 보이는지 확인하십시오.