스키마 설계와 마이그레이션
이번 절에서는 프로젝트를 진행하면서 필요한 스키마를 생성하고 migration 을 진행하겠습니다.
먼저 프로젝트 중간에 테이블이나 컬럼의 변경은 수시로 발생하므로 독트린의 dbal 패키지를 설치하여 스키마 변경시 에러가 발생하지 않도록 준비합니다.
$ composer require "doctrine/dbal" "~2.0"
우리가 만들 애플리케이션의 스키마는 다음과 같이 사용자 테이블은 프로젝트 테이블을 소유하고 있고 프로젝트 테이블은 태스트 테이블을 소유하는 관계를 갖고 있습니다.
Users 테이블은 있으므로 projects, tasks 테이블을 생성하기 위한 마이그레이션을 생성합니다.
$ php artisan make:migration create_project_table --create=projects
Created Migration: 2015_10_05_235319_create_project_table
$ php artisan make:migration create_task_table --create=tasks
Created Migration: 2015_10_05_235407_create_task_table
migration 파일 수정
2015_10_05_235319_create_project_table
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateProjectTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('projects', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->string('name', 20);
$table->text('description')->nullable();
$table->boolean('public')->default(false);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('projects');
}
}
$table->increments('id'): 기본 키 컬럼명을 id 로 설정합니다.
$table->foreign('user_id')->references('id')->on('users'); 프로젝트는 사용자에 속하므로 user_id 참조 키를 설정합니다.
$table->string('name', 20): 프로젝트에 대한 상세한 설명을 기술하며 많은 내용을 작성할 수 있도록 text 컬럼을 사용합니다.
$table->boolean('public'): 누구나 볼 수 있는 프로젝트일 경우 true로 설정하며 기본 값은 false 입니다.
이제 tasks 테이블 스키마를 작성합니다.
2015_10_05_235407_create_task_table.php
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTaskTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->increments('id');
$table->integer('project_id')->unsigned();
$table->foreign('project_id')->references('id')->on('projects'); // 1
$table->string('name', 20); //2
$table->text('description')->nullable(); //3
$table->datetime('due_date')->nullable(); //4
$table->enum('priority', ['낮음','보통', '높음'])->default('보통'); //5
$table->enum('status', ['등록', '진행', '완료'])->default('등록'); //6
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('tasks');
}
}
1$table->foreign('project_id')->references('id')->on('projects'): task 는 project 에 포함되므로 참조 키를 설정합니다.
2 $table->string('name', 20): task의 이름입니다.
3 $table->text('description')->nullable(): 구체적인 내용을 기술하며 많은 내용을 기술할 수 있도록 text 컬럼을 사용합니다.
4 $table->datetime('due_date')->nullable(): 완료 기한이 있는 task일 경우 설정하며 기한이 없을 수도 있으므로 nullable() 을 사용하여 null 값이 들어올 수 있도록 합니다.
5 $table->enum('priority', ['낮음','보통', '높음'])->default('보통'): task의 우선순위를 enum 으로 지정하며 기본 값은 '보통' 입니다.
6 $table->enum('status', ['등록', '진행', '완료'])->default('등록'): task의 진행 상태를 enum 으로 지정하며 기본 값은 '등록' 상태입니다.
애플리케이션이 동작하도록 초기 사용자를 생성하기 위해 사용자 테이블 시더를 생성합니다.
$ php artisan make:seeder UserTableSeeder
이제 database/seeds/UserTableSeeder.php 파일의 run() 메소드에 초기 데이타를 생성하는 코드를 작성합니다.
use Illuminate\Database\Seeder;
class UserTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$users = [
[
'name' => '사용자1',
'email' => 'user1@myhost.com',
'password' => bcrypt('secret'),
],
[
'name' => '사용자2',
'email' => 'user2@myhost.com',
'password' => bcrypt('secret'),
],
];
foreach($users as $u) {
App\User::create($u);
}
}
}
- $users: 초기 사용자로 두 명의 사용자 정보를 갖고 있는 배열을 생성합니다.
'password' => bcrypt('secret') : 라라벨은 사용자의 암호를 PHP의 password_hash() 함수를 PASSWORD_BCRYPT 파라미터로 설정하여 생성하며 기본 인증 모듈(AuthController)에서도 이 알고리즘을 사용하므로 초기 데이타로 설정시에는 명시적으로 bcrypt() 헬퍼 함수를 호출해서 암호를 설정해야 합니다.
- foreach(...): foreach 루프를 돌면서 사용자 정보를 User::create() 메소드를 사용하여 DBMS 에 입력합니다.
이제 시더 클래스를 구현하였으니 databases/seeds/DatabaseSeeder.php 의 run() 메소드에서 UserTableSeeder를 호출하도록 수정합니다.
databases/seeds/DatabaseSeeder.php
public function run()
{
$this->call(UserTableSeeder::class);
}
작성한 스키마를 반영하도록 migrate를 수행하며 초기 데이타도 입력하도록 --seed 옵션을 추가합니다.
$ php artisan migrate --seed