평범한 이야기들

[TIL] PHP Laravel - Database #2 시딩 (Seeding) 본문

평범한 개발 이야기/Laravel

[TIL] PHP Laravel - Database #2 시딩 (Seeding)

songsariya 2021. 2. 9. 16:57
728x90

시딩

프로그램에서 테스트 할 수 있는 임시의 데이터를 생성하는 기능

시딩 작업을 하기 위한 기본 파일로 database/seeders 디렉터리에 run() 메서드를 갖는 DatabaseSeeder 클래스가 있음

(라라벨 버전이 8 이하면 database/seeds 디렉토리 이며 시더 파일도 네임스페이스가 정해져 있지 않음)

// 마이그레이션 진행시 시딩도 같이 할 경우
~ php artisan migrate --seed
~ php artisan migrate:refresh --seed

// 시딩을 독립적으로 실행
~ php artisan db:seed

//시딩을 수행할 개별 클래스 지정
~ php artisan db:seed --class=VotesTableSeeder  

 

시더 생성

~ php artisan make:seed ContactsTableSeeder

database/seeders 디렉터리에 ContactsTableSeeder 클래스 파일 생성

DatabaseSeeder 클래스의 run() 메서드에서 새롭게 생성한 시더를 호출하도록 내용을 추가해주어야 함

// database/seeders/DatabaseSeeder.php
...
public function run() 
{
    $this->call(ContactsTableSeeder::class);
}

그 후 ContactsTableSeeder 클래스에 내용을 추가한다.

// database/seeders/ContactsTableSeeder.php

// 시더를 통해 하나의 레코드 추가
...
public function run()
{
    DB::table('contacts')->insert([
        'name' => '홍길동',
        'email' => 'hong@gmail.com'
    ]);
}
...

이렇게 하면 하나의 데이터만 들어가기 때문에 불편, 라라벨에서는 랜덤한 데이터를 반복적으로 넣는 기능 제공

 

라라벨8 버전의 모델 팩토리

모델 팩토리 기능은 데이터베이스 테이블에 가짜 데이터를 채워 넣는 데 사용

각각의 팩토리를 정의할 때는 팩토리를 통해서 생성하고자 하는 엘로퀀트 모델 클래스명을 사용

<?php
// 엘로퀀트와 테이블명을 키로 하는 모델 팩토리 정의
namespace Database\Factories;

use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

class UserFactory extends Factory
{
    protected $model = User::class;

    public function definition()
    {
        return[
            'name'=> $this->faker->name
        ];
    }
}

모델 팩토리 생성

~ php artisan make:factory ContactFactory --model=Contact

database/factories 디렉터리에 ContactFactory.php 클래스 파일 생성

시딩을 처리하거나 테스트를 수행하기 위해서 factory() 메서드를 사용해 새로운 Contact 인스턴스를 생성 할 수 있음

user App\Models\Contact;

// 1개 생성
$contact = Contact::factory()->create();

// 여러개 생성 (Collection이 반환)
$contact = Contact::factory()->count(20)->create();

하지만 이렇게 하면 동일한 내용이 20개가 생김

이를 위해 페이커 기능을 사용 모든 팩토리 클래스에서 사용할 수 있게 $this→faker 와 같이 접근 가능

public function definition()
{
    return [
        'name' => $this->faker->name,
        'email' => $this->faker->email,
    ];
}

→ 모델팩토리는 테스팅에서 더 많이 사용하기 때문에 그 후 다시 공부

라라벨 8 이전 버전의 모델팩토리 제외

728x90
Comments