본문 바로가기

데이터베이스: 시딩

번역일: 2026년 6월 20일

데이터베이스: 시딩

소개

Laravel은 시드 클래스(seed class)를 이용해 데이터베이스에 초기 데이터를 손쉽게 채울 수 있는 기능을 제공합니다. 모든 시드 클래스는 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 메서드로 실행되는 하위 시더 클래스에서도 모델 이벤트가 발생하지 않습니다.

<?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=UserSeeder

개발 중에 데이터베이스를 완전히 초기화하고 싶다면 migrate:fresh 커맨드에 --seed 옵션을 함께 사용하세요. 이 커맨드는 모든 테이블을 삭제하고 마이그레이션을 다시 실행한 뒤 시딩까지 수행합니다. --seeder 옵션으로 특정 시더만 실행하도록 지정할 수도 있습니다.

php artisan migrate:fresh --seedphp artisan migrate:fresh --seed --seeder=UserSeeder

프로덕션 환경에서 강제 실행

시딩 작업은 기존 데이터를 변경하거나 삭제할 수 있기 때문에, production 환경에서는 시더를 실행하기 전에 확인 메시지가 표시됩니다. 확인 없이 즉시 실행하려면 --force 플래그를 사용하세요.

php artisan db:seed --force

이 문서는 Laravel 공식 문서(MIT)를 한국 개발자를 위해 번역·재구성한 것입니다.

번역일: 2026년 6월 20일