본문 바로가기

데이터베이스: 시딩

업데이트됨

번역일: 2026년 6월 20일

이 페이지는 원문이 업데이트되어 번역이 갱신되었습니다.

원문 수정
2026년 6월 20일
번역 갱신
2026년 6월 20일

데이터베이스: 시딩

소개

Laravel은 시드(Seed) 클래스를 이용해 데이터베이스에 초기 데이터를 손쉽게 채워 넣을 수 있는 기능을 제공합니다. 모든 시드 클래스는 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 서비스 컨테이너가 자동으로 주입해 줍니다.

모델 팩토리 활용

각 모델의 속성을 하나하나 직접 지정하는 것은 번거로운 일입니다. 대신 모델 팩토리를 사용하면 대량의 테스트 데이터를 간편하게 생성할 수 있습니다. 팩토리 사용 방법은 모델 팩토리 문서를 먼저 참고하세요.

아래 예시는 50명의 사용자를 생성하면서, 각 사용자에 연관된 게시글 1개도 함께 만드는 코드입니다.

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, ]); }

모델 이벤트 비활성화

시딩 도중 모델 이벤트가 발생하는 것을 막고 싶을 때가 있습니다. 예를 들어, 시딩 중 created 이벤트가 발생해 불필요한 알림이 전송되거나 사이드 이펙트가 생기는 경우가 대표적입니다. 이럴 때는 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일