Skip to content

챕터 2.3: 데이터베이스 마이그레이션

학습 시간: 50분


1. 마이그레이션: 우주 정거장 건설

Laravel의 마이그레이션은 데이터베이스를 위한 버전 관리 시스템입니다.

다음과 같이 상상해 보세요:

  1. 🏗️ 정거장 설계도를 만듭니다 (create_planets_table 마이그레이션)
  2. 🚀 모듈을 배포합니다 (마이그레이션 실행)
  3. 🔧 구조를 현대화합니다 (새로운 마이그레이션)
  4. ⏪ 이전 버전으로 되돌릴 수 있습니다 (롤백)

💡 중요: 마이그레이션은 팀이 일관되게 작업할 수 있도록 합니다 — 마치 다른 대륙에서 ISS를 건설하는 엔지니어들처럼요!


2. 마이그레이션 실행

챕터 2.2에서 마이그레이션을 생성한 후 다음을 실행하세요:

php artisan migrate

터미널 출력:

마이그레이션 테이블이 성공적으로 생성되었습니다.
마이그레이션 중: 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에서 확인:

  1. space_api 데이터베이스 → Schemas → Tables를 엽니다.
  2. 다음이 나타나는지 확인하세요: - planets - users - password_reset_tokens

3. 마이그레이션 롤백: 비상 복귀

구조를 수정해야 할 경우:

php artisan migrate:rollback  # 마지막 마이그레이션 패키지 롤백
php artisan migrate:reset    # 모든 마이그레이션 완전히 롤백

  • php artisan migrate:fresh개발에서 가장 유용한 명령어입니다! 모든 테이블을 삭제하고 모든 마이그레이션을 다시 실행합니다.
  • php artisan migrate:fresh --seedfresh와 동일하게 작동하지만, 마이그레이션 후 즉시 시더를 실행합니다. 이것은 데이터베이스를 완전히 "초기화"하는 명령어입니다.

사용 시나리오:

# 1단계: 마이그레이션에 오류가 있음을 깨달았습니다. 데이터베이스를 완전히 다시 만듭니다.
php artisan migrate:fresh
# 2단계: 마이그레이션을 편집합니다.
# 3단계: 이미 수정된 마이그레이션으로 데이터베이스를 다시 만듭니다.
php artisan migrate:fresh


4. 새 필드 추가: 정거장 현대화

예시: is_habitable 필드(행성이 거주 가능한지 여부)를 추가합니다.

1단계: 새 마이그레이션 생성

php artisan make:migration add_is_habitable_to_planets_table

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단계: 업데이트 실행

php artisan migrate


5. 데이터베이스 채우기: 첫 번째 행성들

시더(Seeder)를 만듭니다 — 테스트 데이터를 생성하기 위한 스크립트입니다.

1단계: 시더 생성

php artisan make:seeder PlanetSeeder

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

<?php
public function run()
{
    $this->call([
        PlanetSeeder::class
    ]);
}

4단계: 채우기 실행

php artisan db:seed


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이 이를 추상화하지만, 제약을 알아야 합니다.

인덱스 생성 예시:

// 마이그레이션에서
$table->index('solar_system');


7. psql에서 데이터 확인

아무 그래픽 클라이언트를 사용하고 거기서 space_api를 선택하여 볼 수 있습니다.

콘솔 사용 시:

psql -U postgres -d space_api
# 터미널이 PostgreSQL 설치 시 설정한 비밀번호를 요청할 수 있습니다.
SELECT * FROM planets;

어떤 경우든 출력은 다음과 같아야 합니다:

id name description size_km solar_system image_url is_habitable
1 지구 다양한 생명체가 있는 푸른 행성 12742 태양계 ... true
2 화성 미래 식민지화의 목표인 붉은 행성 6779 태양계 null false

확인을 위한 퀴즈

1. 마이그레이션 실행 명령어:

2. 마지막 마이그레이션을 롤백하려면?

3. 시더는 무엇에 사용됩니까?

4. 기존 테이블에 컬럼을 추가하는 메서드는?

5. 시더는 어디에 등록됩니까?


🚀 장 요약:

다음과 같이 "우주 인프라 구축"을 마스터했습니다:

  • ✅ 마이그레이션 생성 및 실행
  • 🔧 테이블 구조 현대화
  • 🌍 첫 번째 행성으로 DB 채우기
  • ⚙️ PostgreSQL 작업 방법 학습

당신의 우주가 첫 번째 세계를 얻었습니다! 이제 행성 관리를 위한 API 인터페이스 생성을 진행할 수 있습니다.

📌 확인:

  1. php artisan tinker 실행
  2. App\Models\Planet::all() 실행
  3. 지구와 화성이 보이는지 확인하십시오.