데이터베이스: 시딩

시작하기

라라벨에서는 시드(seed) 클래스를 사용해서 테스트 데이터를 데이터베이스에 설정하는 간단한 메소드를 포함하고 있습니다. 모든 시드(Seed) 클래스는 database/seeds 디렉토리에 저장됩니다. 시드(Seed)클래스의 이름은 아무렇게나 작성할 수 있지만 가급적 UsersTableSeeder등과 같이 직관적인 이름 규칙을 따르는 것이 좋습니다. 기본값으로 DatabaseSeeder클래스가 정의 되어 있습니다. 이 클래스에서 call 메소드로 다른 시드(seed) 클래스를 호출해서 시딩(seeding) 순서를 조정 할 수 있습니다.

Seeder 작성하기

seeder를 생성하기 위해서는, make:seeder 아티즌 명령어를 실행하면 됩니다. 프레임워크에 의해서 생성된 모든 seeder들은 database/seeds 디렉토리에 위치할 것입니다.

php artisan make:seeder UsersTableSeeder

seeder 클래스는 기본적으로 run 이라는 하나의 메소드만 가지고 있습니다. 이 메소드는 db:seed 아티즌 명령어가 실행될 때 호출 됩니다. run 메소드 안에서 여러분은 원하는 어떤 데이터라도 입력할 수 있습니다. 직접 query builder를 사용하여 데이터를 입력하거나, Eloquent 모델 팩토리를 사용할 수 있습니다.

{tip} 데이터베이스 시딩이 진행되는 동안 Mass assignment protection는 자동으로 동작하지 않습니다.

다음 예제에서, DatabaseSeeder 클래스를 수정해서 run 메소드에 입력 구문을 추가해보겠습니다.

<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => bcrypt('password'),
        ]);
    }
}

{tip} run 메소드에 필요한 모든 의존성의 타입힌트를 지정할 수 있습니다. 이 의존성은 Laravel 서비스 컨테이너를 통해 자동으로 처리됩니다.

모델 팩토리 사용하기

당연하게도, 수동으로 각각의 모델 seed 를 위한 속성들을 지정하는 것은 번거로운 일입니다. 대신에, 여러분은 대량의 데이터베이스 레코드를 생성하는데 유용한 모델 팩토리를 사용할 수 있습니다. 먼저 모델 팩토리 문서를 확인하고, 팩토리를 어떻게 정의하는지 알아 봅시다. 팩토리를 정의했다면, factory 헬퍼 함수를 사용하여 데이터베이스에 레코드를 추가할 수 있습니다.

예를 들어, 50 개의 레코드를 생성하고 각각의 사용자에 관계 모델을 추가해 봅시다.

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    factory(App\User::class, 50)->create()->each(function ($user) {
        $user->posts()->save(factory(App\Post::class)->make());
    });
}

추가적인 Seeder 호출하기

DatabaseSeeder 클래스 안에서, call 메소드를 사용하여 추가적인 seeder 클래스를 실행할 수 있습니다. call 메소드를 사용하면, 여러분의 데이터베이스 seeding 을 하나의 매우 커다란 파일에서 여러개의 파일로 쪼갤 수 있게 됩니다. 메소드에서는 실행하려는 seeder 클래스의 이름을 전달하면 됩니다.

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $this->call([
        UsersTableSeeder::class,
        PostsTableSeeder::class,
        CommentsTableSeeder::class,
    ]);
}

Seeder 실행하기

seeder 클래스를 작성하고 나면, dump-autoload 명령어를 사용해서 컴포저의 오토로더를 다시 생성할 필요가 있습니다.

composer dump-autoload

이제, db:seed 아티즌 명령어를 통해서 데이터베이스에 데이터를 입력할 수 있습니다. 기본적으로 db:seed 명령어는 다른 시드(seed) 클래스들을 호출하는 DatabaseSeeder클래스를 실행합니다. 하지만 --class옵션을 사용해서 특정 시더(seeder) 클래스가 개별적으로 실행되도록 지정할 수 있습니다.

php artisan db:seed

php artisan db:seed --class=UsersTableSeeder

migrate:fresh명령어를 사용하면 데이터베이스 초기값을 설정할 때 모든 테이블을 삭제한 다음 마이그레이션을 다시 실행 할 것입니다. 이 명령어는 데이터베이스를 완전히 재구성할 때 유용합니다.

php artisan migrate:fresh --seed

프로덕션 환경에서 강제 시딩

일부 시드 작업으로 인해 데이터가 변경되거나 손실 될 수 있습니다. 프로덕션 데이터베이스에 대해 시드 명령을 실행하지 못하도록하기 위해 시드를 실행하기 전에 확인 메시지가 나타납니다. 시드를 프롬프트없이 실행하게하려면 --force 플래그를 사용하십시오.

php artisan db:seed --force