데이터베이스: 시딩
번역일: 2026년 6월 20일
데이터베이스: 시딩
소개
Laravel은 시더(Seeder) 클래스를 이용해 데이터베이스에 초기 데이터를 손쉽게 채워 넣을 수 있는 기능을 제공합니다. 모든 시더 클래스는 database/seeders 디렉터리에 저장되며, 기본적으로 DatabaseSeeder 클래스가 미리 정의되어 있습니다. 이 클래스의 call 메서드를 사용하면 다른 시더 클래스를 순서대로 실행할 수 있습니다.
NOTE
데이터베이스 시딩 중에는 대량 할당 보호가 자동으로 비활성화됩니다.
시더 작성하기
시더를 생성하려면 make:seeder Artisan 명령어를 실행합니다. 생성된 시더 클래스는 database/seeders 디렉터리에 저장됩니다.
php artisan make:seeder UserSeeder시더 클래스에는 기본적으로 run 메서드 하나만 존재합니다. 이 메서드는 db:seed Artisan 명령어를 실행할 때 호출됩니다. run 메서드 안에서는 쿼리 빌더로 직접 데이터를 삽입하거나, Eloquent 모델 팩토리를 활용할 수 있습니다.
아래는 기본 DatabaseSeeder 클래스의 run 메서드에 데이터 삽입 구문을 추가한 예시입니다.
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* 데이터베이스 시딩을 실행합니다.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}NOTE
run 메서드의 파라미터에 필요한 의존성을 타입힌트로 선언하면, Laravel 서비스 컨테이너가 자동으로 주입해 줍니다.
모델 팩토리 활용
각 모델의 속성을 일일이 지정하는 것은 번거롭습니다. 모델 팩토리를 사용하면 대량의 테스트 데이터를 편리하게 생성할 수 있습니다. 팩토리 정의 방법은 모델 팩토리 문서를 먼저 참고하세요.
아래 예시는 각각 게시글 1개를 가진 사용자 50명을 생성합니다.
use App\Models\User;
/**
* 데이터베이스 시딩을 실행합니다.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}추가 시더 호출하기
DatabaseSeeder 클래스 내에서 call 메서드를 사용하면 다른 시더 클래스를 순차적으로 실행할 수 있습니다. 시딩 로직을 여러 파일로 분리하면 각 시더 클래스가 지나치게 비대해지는 것을 방지할 수 있습니다. call 메서드에는 실행할 시더 클래스 배열을 전달합니다.
/**
* 데이터베이스 시딩을 실행합니다.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}모델 이벤트 비활성화
시딩 중에 모델 이벤트가 발생하지 않도록 하고 싶을 때는 WithoutModelEvents 트레이트를 사용합니다. 이 트레이트를 적용하면 call 메서드로 호출한 하위 시더에서도 모델 이벤트가 발생하지 않습니다.
NOTE
옵저버나 이벤트 리스너가 연결된 모델을 대량으로 시딩할 때 이 트레이트를 활용하면 불필요한 부작용을 방지할 수 있습니다.
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* 데이터베이스 시딩을 실행합니다.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}시더 실행하기
db:seed Artisan 명령어로 시딩을 실행합니다. 기본적으로 Database\Seeders\DatabaseSeeder 클래스가 실행되며, 이 클래스에서 다른 시더들을 호출할 수 있습니다. --class 옵션을 사용하면 특정 시더만 단독으로 실행할 수 있습니다.
php artisan db:seedphp artisan db:seed --class=UserSeedermigrate:fresh 명령어에 --seed 옵션을 함께 사용하면 모든 테이블을 삭제하고 마이그레이션을 다시 실행한 뒤 시딩까지 한 번에 처리할 수 있습니다. 개발 환경에서 데이터베이스를 완전히 초기화할 때 유용합니다. --seeder 옵션으로 실행할 시더를 지정할 수도 있습니다.
php artisan migrate:fresh --seedphp artisan migrate:fresh --seed --seeder=UserSeeder운영 환경에서 강제 실행
시딩 작업은 기존 데이터를 변경하거나 삭제할 위험이 있습니다. 이런 이유로 production 환경에서 시딩을 실행하면 Laravel이 실행 여부를 확인하는 프롬프트를 표시합니다. 확인 없이 강제로 실행하려면 --force 플래그를 사용합니다.
php artisan db:seed --force