코드이그나이터4 마크다운 블로그 MVP 만들기 - 3 - 데이터 관련 설계

koeunyeon·2021년 4월 8일
0

마크다운 블로그 프로토타입 만들기

이번 챕터는 https://github.com/koeunyeon/ci4/tree/blog-data-design에 코드가 있습니다.

게시글 요건 정의하기

블로그는 글을 쓸 수 있는 공간이므로, 게시글이 가장 중요한 기능입니다. 따라서 게시글 기능부터 만들어 보겠습니다.

게시글은 회원이 쓸 수 있는 글입니다.
게시글의 속성은 아래와 같습니다.

  • 게시글 제목 : 4 - 100글자
  • 게시글 내용 : 10 - 512글자
  • 게시글 글쓴이 :

게시글의 권한은 아래와 같습니다.

  • 게시글은 누구나 볼 수 있습니다.
  • 게시글은 회원만 작성할 수 있습니다.
  • 게시글은 작성자만 수정할 수 있습니다.
  • 게시글은 작성자만 삭제할 수 있습니다.
  • 첫 페이지는 누구나 볼 수 있습니다.

만들고자 하는 기능의 주소는 아래와 같습니다.

데이터베이스 테이블 설계하기

먼저 게시글을 담을 데이터베이스를 설계해 보겠습니다. 대략적인 모습은 아래와 같습니다.

데이터베이스 테이블 이름은 posts 로 짓겠습니다.
보통 테이블 이름을 지을 때 접두어 [tbl_ + (업무구분) + 단수명사]로 붙이는 방법과 복수형으로 짓는 방법 둘 중 하나를 선택하는데요. 전자는 비즈니스 로직을 데이터베이스에서 주로 처리하는 경우, 후자는 비즈니스 로직을 프로그램에서 처리하는 경우에 많이 사용합니다.
우리는 가능한 비즈니스 로직을 프로그램에서 처리하는 방향으로 진행해 보기 위해 복수형 테이블 이름을 쓰겠습니다.

주 키 이름인 post_id로 단수형입니다. 테이블 이름은 복수지만 각 행은 단수이기 때문입니다.
게시글의 속성이 제목, 내용, 글쓴이 세 개이므로 이에 맞춰서 데이터베이스 열이 필요합니다. 각 열의 이름은 title, content, author로 하겠습니다.
추가로 우리는 자동 생성/수정 시간여부와 소프트 딜리트도 사용하겠습니다. 굳이 열 이름을 바꿔야 할 이유가 없으므로 기본 설정값을 사용합니다.

데이터베이스 테이블 만들기

CREATE TABLE IF NOT EXISTS `posts` (
  `post_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `content` varchar(512) NOT NULL,
  `author` varchar(100) NULL,
  `created_at` varchar(25) NOT NULL,
  `updated_at` varchar(25) NOT NULL,
  `deleted_at` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

author 열이 NULL임을 볼 수 있습니다. 아직 회원 기능이 없는데 일단 회원 정보를 담는 통만 만들어놓은 셈이므로, 우선 회원 데이터는 입력하지 않을 겁니다. 나중에 회원 기능을 만들면서 채워두겠습니다.

MVP는 데이터베이스 관점에서 보면 "나중에는 어떤 형태로 데이터베이스 테이블이 바뀔지 아직 모르는" 임시 데이터 저장소의 형태를 띕니다. 마이그레이션을 통해 테이블을 만드는 것은 일단 지양하고, 많은 개발자에게 익숙한 "직접 쿼리로 테이블을 생성하는 방법"을 선택합니다.

글 모델 만들기

글 요건에서 정의한 속성에 따라 모델을 만듭니다.
app/Models/PostsModel.php

<?php

namespace App\Models;

use CodeIgniter\Model;

class PostsModel extends Model
{
    protected $table = 'posts';
    protected $allowedFields = ['title', 'content', 'author'];
    protected $primaryKey = "post_id";

    protected $useSoftDeletes = true;
    protected $useTimestamps = true;
}

모델은 테이블과 매핑되므로 복수형 명사인 Posts + Model입니다.

profile
스타트업에 관심이 많은 10 + n년차 웹 개발자. 자바 스프링 (혹은 부트), 파이썬 플라스크, PHP를 주로 다룹니다.

2개의 댓글

comment-user-thumbnail
2021년 4월 12일

글쓸때가 없어서 여기다가 남깁니다. 혹시 csrf관련해서 사용법 같은것도 포스팅 올려주시면 감사하겠습니다.

1개의 답글