모델 Models

모델은 전통적인 MVC 패턴을 구현하고자 하는 사람들이 선택적으로 사용할 수 있습니다.

모델이란 무엇인가 What is a Model?

모델은 데이터베이스와 연동하여 사용하기위한 PHP 클래스입니다. 예를들이, CodeIgniter 를 이용하여 블로그를 관리한다고합시다. 아마 삽입,조회,수정 등의 기능을 가진 모델클래스가 필요할 것입니다.

모델클래스의 형태 예제:

class Blog_model extends CI_Model {

        public $title;
        public $content;
        public $date;

        public function __construct()
        {
                // Call the CI_Model constructor
                parent::__construct();
        }

        public function get_last_ten_entries()
        {
                $query = $this->db->get('entries', 10);
                return $query->result();
        }

        public function insert_entry()
        {
                $this->title    = $_POST['title']; // please read the below note
                $this->content  = $_POST['content'];
                $this->date     = time();

                $this->db->insert('entries', $this);
        }

        public function update_entry()
        {
                $this->title    = $_POST['title'];
                $this->content  = $_POST['content'];
                $this->date     = time();

                $this->db->update('entries', $this, array('id' => $_POST['id']));
        }

}

Note

위의 함수들은 쿼리 빌더(Query Builder) 를 이용하여 데이터베이스를 이용하는 방법을 보여줍니다.

Note

이 예제에서는 단순화하기 위하여 $_POST 를 바로 사용하였습니다. 일반적으로는 나쁜 예죠. 일반적인 접근법은 입력클래스(Input Library)를 다음과 같이 사용하는 것입니다. $this->input->post('title').

모델의 해부 Anatomy of a Model

모델클래스는 application/models/ 폴더에 저장됩니다. 서브 폴더에 저장하셔도 됩니다.

모델클래스의 기본 프로토타입 예:

class Model_name extends CI_Model {

        public function __construct()
        {
                parent::__construct();
        }

}

Model_name 은 여러분의 클래스 이름으로 바꾸세요. 클래스이름의 첫 글자는 반드시 대문자로 시작해야하며 나머지 글자들은 소문자라야 합니다. 여러분의 클래스는 반드시 Model 클래스에서 상속(extends)받아야 합니다.

파일명은 클래스명과 같아야 합니다. 예를 들면:

class User_model extends CI_Model {

        public function __construct()
        {
                parent::__construct();
        }

}

파일명은 아래와 같아야 합니다:

application/models/User_model.php

모델 로딩하기 Loading a Model

모델은 일반적으로 컨트롤러(controller) 내에서 로드되어 호출됩니다. 모델은 아래와 같은 방법으로 로드합니다:

$this->load->model('model_name');

모델이 하위 폴더에 있다면 상대경로로 모델 폴더를 적어줍니다. 예를 들어 모델이 application/models/blog/Queries.php 경로에 위치해 있다면 아래와 같이 로드할 수 있습니다.

$this->load->model('blog/queries');

모델이 로드되면 모델클래스의 이름과 같은 객체로 모델 내의 함수를 사용할 수 있습니다:

$this->load->model('model_name');

$this->model_name->method();

모델을 다른 객체 이름으로 할당하여 사용하고 싶다면 두 번째 파라미터에 사용하고 싶은 이름을 넘겨서 로드하시면 됩니다:

$this->load->model('model_name', 'foobar');

$this->foobar->method();

아래는 모델을 로드하여 그 데이터를 뷰에 넘겨주는 예제입니다:

class Blog_controller extends CI_Controller {

        public function blog()
        {
                $this->load->model('blog');

                $data['query'] = $this->blog->get_last_ten_entries();

                $this->load->view('blog', $data);
        }
}

모델 자동로딩 Auto-loading Models

프로그램 전체에 걸쳐 글로벌로 모델을 로드해야할 경우라면 자동로드 설정을 통해 자동으로 로드하도록 할 수 있습니다. application/config/autoload.php 파일을 열어서 autoload 배열에 원하는 모델을 추가하세요.

데이터베이스에 연결하기 Connecting to your Database

모델이 로드되었을 때 그 모델이 자동으로 데이터베이스에 연결하지는 않습니다. 다음의 옵션을 사용하여 연결하세요:

  • 표준 데이터베이스 메소드(상세설명)를 이용하여 컨트롤러나 모델에서 데이터베이스에 연결할 수 있습니다.

  • 모델을 로드할 때 세 번째 파라미터를 TRUE (boolean)로 설정하여 자동연결할 수 있습니다. 이때 database config 파일에 설정된 정보가 사용될것입니다:

    $this->load->model('model_name', '', TRUE);
    
  • 세 번째 파라미터로 데이터베이스 연결정보를 넘겨주어서 연결할 수도 있습니다:

    $config['hostname'] = 'localhost';
    $config['username'] = 'myusername';
    $config['password'] = 'mypassword';
    $config['database'] = 'mydatabase';
    $config['dbdriver'] = 'mysqli';
    $config['dbprefix'] = '';
    $config['pconnect'] = FALSE;
    $config['db_debug'] = TRUE;
    
    $this->load->model('model_name', '', $config);