데이터베이스 및 모델 생성

이 섹션에서는 books 리소스를 위한 SQLite 데이터베이스 테이블을 만들고, 샘플 데이터를 시딩(seeding)하며, 이를 접근하기 위한 모델을 정의하여 데이터 계층을 설정합니다. 완료되면 예제 행으로 채워진 작동하는 books 테이블이 준비됩니다.

마이그레이션 생성

마이그레이션은 적용할 내용과 롤백 방법을 정의하여 데이터베이스 스키마를 버전 관리할 수 있게 해줍니다. 간단한 authorsbooks 테이블을 위한 마이그레이션을 만들어 봅시다.

다음 Spark 명령을 실행합니다:

php spark make:migration CreateAuthorsTable
php spark make:migration CreateBooksTable

이 명령은 app/Database/Migrations/ 아래에 새 파일을 생성합니다.

app/Database/Migrations/CreateAuthorsTable.php 를 다음과 같이 수정합니다:

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class CreateAuthorsTable extends Migration
{
    public function up()
    {
        $this->forge->addField([
            'id' => [
                'type'           => 'INTEGER',
                'unsigned'       => true,
                'auto_increment' => true,
            ],
            'name' => [
                'type'       => 'VARCHAR',
                'constraint' => '255',
                'null'       => false,
            ],
            'created_at' => [
                'type' => 'DATETIME',
                'null' => true,
            ],
            'updated_at' => [
                'type' => 'DATETIME',
                'null' => true,
            ],
        ]);

        $this->forge->addPrimaryKey('id');
        $this->forge->addUniqueKey('name');
        $this->forge->createTable('authors');
    }

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

이 예제에서는 각 저자의 이름만 필요합니다. 중복을 방지하기 위해 이름을 고유 키(unique key)로 설정했습니다.

이제 app/Database/Migrations/CreateBooksTable.php 를 다음과 같이 수정합니다:

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class CreateBooksTable extends Migration
{
    public function up()
    {
        $this->forge->addField([
            'id' => [
                'type'           => 'INTEGER',
                'unsigned'       => true,
                'auto_increment' => true,
            ],
            'title' => [
                'type'       => 'VARCHAR',
                'constraint' => '255',
                'null'       => false,
            ],
            'author_id' => [
                'type'     => 'INTEGER',
                'unsigned' => true,
                'null'     => false,
            ],
            'year' => [
                'type' => 'INTEGER',
                'null' => true,
            ],
            'created_at' => [
                'type' => 'DATETIME',
                'null' => true,
            ],
            'updated_at' => [
                'type' => 'DATETIME',
                'null' => true,
            ],
        ]);

        $this->forge->addPrimaryKey('id');
        $this->forge->addForeignKey('author_id', 'authors', 'id');
        $this->forge->createTable('books');
    }

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

여기에는 authors 테이블을 참조하는 외래 키(foreign key)가 포함되어 있습니다. 이를 통해 각 책을 저자와 연결하고 저자 이름을 한 곳에서 관리할 수 있습니다.

이제 마이그레이션을 실행합니다:

php spark migrate

이제 데이터베이스에 책과 저자 레코드를 저장할 구조가 마련되었습니다.

시더(Seeder) 생성

시더는 개발용 샘플 데이터를 로드하여 즉시 작업할 수 있게 해줍니다. 여기서는 몇 가지 예제 책과 저자를 추가하겠습니다.

명령 실행:

php spark make:seeder BookSeeder

app/Database/Seeds/BookSeeder.php 파일을 수정합니다:

<?php

namespace App\Database\Seeds;

use CodeIgniter\Database\Seeder;

class BookSeeder extends Seeder
{
    public function run()
    {
        // Define author data and insert
        $authorData = [
            ['name' => 'Frank Herbert'],
            ['name' => 'William Gibson'],
            ['name' => 'Ursula K. Le Guin'],
        ];

        $this->db->table('authors')->insertBatch($authorData);

        // Get all inserted authors, keyed by name for easy lookup
        $authors = $this->db->table('authors')
            ->get()
            ->getResultArray();

        $authorsByName = array_column($authors, 'id', 'name');

        // Define books with author references
        $books = [
            [
                'title'     => 'Dune',
                'author_id' => $authorsByName['Frank Herbert'],
                'year'      => 1965,
            ],
            [
                'title'     => 'Neuromancer',
                'author_id' => $authorsByName['William Gibson'],
                'year'      => 1984,
            ],
            [
                'title'     => 'The Left Hand of Darkness',
                'author_id' => $authorsByName['Ursula K. Le Guin'],
                'year'      => 1969,
            ],
        ];

        $this->db->table('books')->insertBatch($books);
    }
}

이 시더는 먼저 저자들을 authors 테이블에 삽입하고 해당 ID를 가져온 다음, 그 ID들을 사용하여 책들을 books 테이블에 삽입합니다.

그런 다음 시더를 실행합니다:

php spark db:seed BookSeeder

행이 성공적으로 삽입되었음을 알리는 확인 메시지가 표시될 것입니다.

Book 모델 생성

모델은 테이블에 대한 객체 지향 인터페이스와 유연한 쿼리 API를 제공하여 데이터베이스 접근을 단순하고 재사용 가능하게 만듭니다. authorsbooks 테이블을 위한 모델을 만들어 봅시다.

생성 명령:

php spark make:model AuthorModel
php spark make:model BookModel

두 모델 모두 CodeIgniter의 기본 Model 클래스를 간단히 확장할 것입니다.

app/Models/AuthorModel.php 파일을 수정합니다:

<?php

namespace App\Models;

use CodeIgniter\Model;

class AuthorModel extends Model
{
    protected $table         = 'authors';
    protected $primaryKey    = 'id';
    protected $allowedFields = ['name'];
    protected $useTimestamps = true;
}

app/Models/BookModel.php 파일을 수정합니다:

<?php

namespace App\Models;

use CodeIgniter\Model;

class BookModel extends Model
{
    protected $table         = 'books';
    protected $primaryKey    = 'id';
    protected $allowedFields = ['title', 'author_id', 'year'];
    protected $useTimestamps = true;
}

이를 통해 CodeIgniter에 사용할 테이블과 대량 할당(mass-assigned) 가능한 필드를 알려줍니다.

다음 섹션에서는 새로운 모델을 사용하여 RESTful API 컨트롤러를 구동하겠습니다. /api/books 엔드포인트를 구축하고 CodeIgniter의 Api\ResponseTrait 가 어떻게 CRUD 작업을 쉽게 만드는지 확인해 보겠습니다.