팩토리란
테스트나 데이터베이스 시딩에서는 데이터베이스에 레코드를 삽입할 필요가 있습니다. 수동으로 각 컬럼의 값을 지정하는 대신, Laravel의 모델 팩토리를 사용하면 각 Eloquent 모델의 기본 속성 세트를 정의할 수 있습니다. 모든 새 Laravel 애플리케이션에는database/factories/UserFactory.php가 포함되어 있습니다.
fake() 헬퍼를 통해 Faker 라이브러리를 이용할 수 있으며, 다양한 랜덤 데이터를 생성할 수 있습니다.
Faker의 로케일은
config/app.php의 faker_locale 옵션으로 변경할 수 있습니다.팩토리 생성
make:factory Artisan 명령어로 팩토리를 작성합니다.
database/factories 디렉터리에 배치됩니다.
모델과 팩토리의 자동 검출
모델에HasFactory 트레이트를 사용하면 Laravel이 자동으로 대응하는 팩토리를 찾습니다.
Database\Factories 네임스페이스에서 모델명에 Factory를 붙인 클래스명을 검색합니다.
명명 규칙이 맞지 않는 경우는 UseFactory 속성으로 명시적으로 지정할 수 있습니다.
팩토리 정의
definition() 메서드
팩토리의 중심이 되는 definition() 메서드에서 기본 속성을 정의합니다.
팩토리 스테이트(States)
스테이트 메서드를 사용하면 팩토리에 대해 개별 변경을 정의할 수 있습니다.소프트 삭제의 스테이트
소프트 삭제 대응 모델에는 빌트인의trashed() 스테이트를 이용할 수 있습니다.
팩토리 콜백(Callbacks)
afterMaking과 afterCreating으로 모델 생성 후의 추가 처리를 정의합니다.
모델 생성
make() — DB 에 저장하지 않음
create() — DB 에 저장
속성의 덮어쓰기
make()나 create()에 배열을 전달하면 특정 속성만 덮어쓸 수 있습니다.
팩토리로 모델을 생성할 때 매스 어사인먼트 보호는 자동으로 무효화됩니다.
Sequence(시퀀스)
여러 모델을 생성할 때 속성을 번갈아 바꾸는 경우Sequence를 사용합니다.
sequence() 메서드를 사용하면 더 간결하게 쓸 수 있습니다.
릴레이션십 팩토리
Has Many(1대다)
has() 메서드로 “1대다” 릴레이션을 가지는 모델을 생성합니다.
has + 릴레이션 이름의 복수형).
Belongs To(역 릴레이션)
for() 메서드로 “속하는” 부모 모델을 지정합니다.
Many to Many(다대다)
hasAttached() 메서드로 다대다 릴레이션을 다룹니다. 중간 테이블의 속성도 지정할 수 있습니다.
폴리모픽 릴레이션
일반 “1대다”와 동일하게has()나 매직 메서드를 사용할 수 있습니다.
morphTo 릴레이션에는 매직 메서드를 사용할 수 없습니다. for()에 관계명을 명시합니다.
팩토리 내에서의 릴레이션 정의
definition() 내에서 외래 키에 다른 팩토리를 할당하면, 모델 생성 시에 자동으로 부모 모델도 생성됩니다.
recycle() — 기존 모델의 재사용
여러 릴레이션에서 같은 모델 인스턴스를 재사용하고 싶은 경우recycle()을 사용합니다.
시딩에서의 이용
DatabaseSeeder나 시더 클래스에서 팩토리를 호출합니다.
테스트에서의 이용
테스트에서는RefreshDatabase 트레이트와 조합해서 팩토리를 사용합니다.
RefreshDatabase는 테스트마다 데이터베이스를 리셋하기 때문에, 테스트 간에 데이터가 간섭하지 않습니다.
다음 단계
데이터베이스 시딩
시더와 팩토리를 조합해 초기 데이터를 투입하는 방법을 확인합니다.
테스트 입문
Laravel의 테스트 기능과 RefreshDatabase 트레이트의 사용법을 확인합니다.