내가 한 노력들

[ Codeigniter 4 ] Command / Controller를 이용해서 Migrate 실행하기 본문

IT 공부/CodeIgniter

[ Codeigniter 4 ] Command / Controller를 이용해서 Migrate 실행하기

JONGI-N CHOI 2022. 3. 7. 15:54

command line을 이용해서, 바로 직접적으로 migrate를 실행하는 방법과 웹 브라우저에서 요청을 받아 controller에서 migrate하는 두 가지 방법을 알아보겠습니다. 

 

Command Line

Table 생성

php spark make:migration create_task

spark 명령어를 이용해서 간ㅍ편히 migration 파일을 만들 수 있습니다. 

migration file명에는 타임스템프 값이 추가되어있습니다. 

예 ) 2022-02-28-105116_CreateTask.php

 

Migrate명령어를 실행하면, 타임라인에 따라 생성일 순서대로 실행이되기 migration의 파일 생성 순서는 중요합니다. 

예를 들어서 Task라는 Table과 User라는 Table 두 개가 존재하는데, Task에서 User의 id을 참조키로 지정할려고 합니다. 

그런데, Task의 migration파일을 먼저 생성해버리면, 존재하지도 않는 User Table을 참조하기 때문에 오류가 발생합니다.

 

2022-02-28-105116_CreateTask.php

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class CreateTask extends Migration
{
    public function up()
    {
        $this->forge->addField([
            'id' => [
                'type'           => 'INT',
                'constraint'     => 5,
                'unsigned'       => true,
                'auto_increment' => true
            ],
            'description' => [
                'type' => 'VARCHAR',
                'constraint' => '128',
            ],
        ]);

        $this->forge->addPrimaryKey('id');
        $this->forge->createTable('task');
    }

    public function down()
    {
        $this->forge->dropTable('task');
    }
}

codeigniter 의 forge 클래스를 통해서 DB에 접근할 수 있습니다. 

 

그리고, 처음에 migration파일을 생성하면 up()과 down() 두 개의 method가 생성됩니다. 

up()은 migrate할 때 실행되는 method이고, down()은 rollback할 때 실행되는 method 입니다. 

 

우선 Table을 생성할 때에는 forge 클래스의 addField 메소드를 이용합니다. 

 

스키마 정의

'id' => [
    'type'           => 'INT',
    'constraint'     => 5,
    'unsigned'       => true,
    'auto_increment' => true
]

연관배열 형태로,  columnd의 이름, 그리고 column에 대한 type등 여러 스키마를 정의합니다. 

 

primary키 설정

$this->forge->addPrimaryKey('id');

 

Table 이름설정 & 생성

$this->forge->createTable('task');

 

Table 삭제

public function down()
{
    $this->forge->dropTable('task');
}

rollback 명령을 실행하면, task이름의 table을 삭제합니다. 

 

 

Migrate 실행

php spark migrate

phpmyadmin에서 확인해보면, task와 migrations라는 테이블 생성된 것을 볼 수 있습니다. 

migrations는 migrate 명령어를 실행할 떄 자동으로 생성되어, migrate 명령어로 생성한 table등을 관리할 수 있습니다.


Controller로 Migrate 실행

Table column 추가

2022-03-06-093336_AddTimestampsToTask.php

타임스탬프_migration이름.php 형식으로 파일을 생성합니다. 

 

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddTimestampsToTask extends Migration
{
    public function up()
    {

    }

    public function down()
    {

    }
}

위와 같은 뼈대로 만들어 줍니다. 

 

 

$this->forge->addColumn('task', [
    'created_at' => [
        'type'    => 'TIMESTAMP',
        'null'    => true,
        'default' => null,
    ],

    'updated_at' => [
        'type'    => 'TIMESTAMP',
        'null'    => true,
        'default' => null,
    ],
]);

column 추가를 위해서 forge 클래스의 addColumn 메소드를 사용합니다.

addColumn( 테이블 이름, 추가할 컬럼 ) 

 

public function down()
{
    $this->forge->dropColumn('task', 'created_at');
    $this->forge->dropColumn('task', 'updated_at');
}

rollback할 떄 실행되는 down 메소드에는 dropColumn을 통해서 위에서 addColumn에 추가할려고한 column을 다시 

dropColumn으로 삭제되도록 설정합니다. 

 

Contrller 설정

Migrate.php

<?php

namespace App\Controllers;

use App\Controllers\BaseController;

class Migrate extends BaseController
{
    public function index()
    {
        $migrate = service('migrations');

        try {

            $migrate->latest();

            echo "migrated";
            
        } catch (\Exception $e) {
            
            echo $e->getMessage();
        }
        
    }
}

controller에서 migrate하기 위해서 migrations 서비스를 변수에 선언합니다. 

$migrate->latest()를 실행하면 데이터베이스를 최신 상태로 전환합니다. 

 

실패했을 경우에는 예외를 발생하기 때문에 try/catch를 통해 실행을 합니다. 

 

 

migrate 컨트롤러의 index 메소드이므로 app/migrate로 접근하면, 해당 컨트롤러가 실행되고,

정상적으로 실행이되어 migrated가 출력이 된 것을 확인할 수 있습니다. 

 

phpmyadmin

Task table의 구성을 확인해보면, created_at과 updated_at 컬럼이 추가된 것을 확인할 수 있습니다.

 


 

이렇듯, migrate 작업은 controller / command 두 가지를 이용해서 실행하는 것이 가능합니다.