데이타베이스 시딩(Seeding)
데이타베이스를 migration 한 후에 초기 데이타를 입력해야 하는 경우가 있습니다. 예로 웹 기반 CMS(Content Management System) 이라면 초기 관리자 정보가 있어야 로그인하고 기본적인 설정을 할 수 있습니다.
시딩은 초기 데이타를 입력하는 간단한 방법을 제공하며 모든 시드 클래스는 database/seeds 폴더안에 CustomerTableSeeder.php 처럼 Schema 이름 + TableSeeder.php 형식으로 존재합니다.
시드 생성
시드는 make:seeder artisan 명령어로 생성할 수 있습니다. 먼저 users 테이블에 대한 시드 클래스를 만들겠습니다.
$ php artisan make:seeder UserTableSeeder
Seeder created successfully.
생성된 database/seeds/UserTableSeeder.php 파일을 열고 run() 메소드에 테이블에 넣어줄 초기 데이타를 입력해 주면 됩니다.
database/seeds/ProjectTableSeeder.php
<?php
use Illuminate\Database\Seeder;
class UserTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
App\User::create([
'name' => 'lesstif',
'email' => 'foo@bar.com'
]);
}
}
전 절에서 만든 projects 테이블에 대한 시드 클래스를 만들어 봅시다.
$ php artisan make:seeder ProjectTableSeeder
Seeder created successfully.
생성된 database/seeds/ProjectTableSeeder.php 파일을 열고 run() 메소드를 수정합니다.
database/seeds/ProjectTableSeeder.php
<?php
use Illuminate\Database\Seeder;
class ProjectTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$prjs = ['개인', '업무', '학습', '쇼핑'];
foreach($prjs as $prj)
{
DB::table('projects')->insert([
'name' => $prj,
'created_at' => \Carbon\Carbon::now(),
'updated_at' => \Carbon\Carbon::now(),
]);
}
}
}
'개인', '업무', '학습', '쇼핑' 4 개의 프로젝트를 배열로 만든 후에 DB::table('projects')->insert() 문을 사용하여 초기 데이타로 넣었습니다. 데이타의 생성일과 갱신일을 의미하는 created_at, updated_at 은 PHP 의 DateTime 유틸리티인 Carbon 을 사용하여 현재 시간으로 설정했습니다.
이제 Tasks 테이블에 초기 데이타를 넣기 위해 먼저 make:seeder 명령어로 시딩 클래스를 생성합니다.
$ php artisan make:seeder TaskTableSeeder
Seeder created successfully.
생성된 database/seeds/TaskTableSeeder.php 파일을 열고 run() 메소드에 아래와 같은 내용을 추가합니다.
database/seeds/TaskTableSeeder.php
<?php
use Illuminate\Database\Seeder;
class TaskTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// 20개의 task 를 4개의 project 와 연결
for($i = 0; $i < 20; $i++)
{
DB::table('tasks')->insert([
'project_id' => rand(1,4) ,
'name' => 'Task ' . $i,
'description' => 'Task ' . $i,
'created_at' => \Carbon\Carbon::now(),
'updated_at' => \Carbon\Carbon::now(),
]);
}
}
}
- project_id => rand(1,4) : 개별 task는 프로젝트에 속해야 하며 ProjectTableSeeder에서 4개의 프로젝트를 입력했으므로 id 는 [1, 2, 3, 4] 가 되므로 1과 4 사이의 값을 만들려고 rand(1,4) 를 사용했습니다.
이제 만들어진 시딩을 테이블에 반영할 순서이며 어떤 시딩 클래스를 적용할지와 시딩 순서는 database/seeds/DatabaseSeeder.php 파일을 통해 설정됩니다.
run() 메소드에 호출할 시딩 클래스 이름을 $this->call() 메소드를 사용하여 unguard() 와 reguard() 사이에 넣어주면 되며 파라미터는 시딩할 클래스 이름으로 'ProjectTableSeeder' 처럼 문자열로 넘기거나 혹은 ProjectTableSeeder::class 처럼 클래스 이름을 결정해주는 구문을 사용하면 됩니다.
public function run()
{
$this->call('UserTableSeeder');
$this->call('ProjectTableSeeder');
$this->call('TaskTableSeeder');
}
먼저 적어준 시딩 클래스가 먼저 호출되므로 Users, Projects, Tasks 테이블 순으로 실행해야 합니다.
이제 초기 데이타가 완성되었으니 artisan db:seed 명령어로 시드 데이타를 데이타베이스에 입력하겠습니다.
$ php artisan db:seed
Seeded: UserTableSeeder
Seeded: ProjectTableSeeder
Seeded: TaskTableSeeder
이제 MySQL 클라이언트로 projects 와 tasks 테이블을 조회해 보면 초기 데이타가 입력되었음을 확인할 수 있습니다.
"[ReflectionException] Class UserTableSeeder does not exist" 와 같은 에러가 발생하며 시딩이 안 될 경우 다음 명령어를 실행해 주면 됩니다.
composer dump-autoload