본문 바로가기
개발/PHP

MVC모델을 적용한 블로그(게시판) 만들기 - 3. Model (DB 처리 하기)

by 똘똘이박사 2018. 6. 26.

PHP MVC 모델을 적용한 블로그 만들기



3. Model (DB 처리 하기)



PHP 에서 데이터베이스 관련 작업을 할때 주로 mysqli 와 같은 함수를 사용하였으나

최근에는 PDO(PHP Data Objects) 를 많이 이용하고 있습니다.


우리가 작업하고 있는 블로그 만들기 에서는 이 PDO 를 이용해 작업을 할 계획 입니다.




config.php 수정 - DB 관련 정보 등록



우선 DB 접속을 위해 DB 관련 정보를 상수로 등록 할 필요가 있습니다.

물론 Model class 에 관련 정보를 저장해 두어도 괜찮지만

환경설정 같은 정보는 모두 한 곳에 모아 관리 하는게 나중에 유지보수 하기에도 좋습니다.


따라서 아래의 데이터베이스 관련 정보를 application/libs/config.php 파일에 추가해 줍니다.


application/libs/config.php 추가


define('_DBTYPE', 'mysql');

define('_HOST', 'localhost');

define('_DBNAME', 'chobo');

define('_DBUSER', 'root');

define('_DBPASSWORD', 'qwerqwer');

define('_CHARSET', 'utf8');





Model class



Model class 에서는 실질적으로 데이터베이스 접속에 필요한 역활을 생성자에서 처리하게 합니다.


그 이후 목록이나 게시글 보기, 수정, 삭제, 등록 등과 같은 세부 기능은 하위 클래스를 만들어 상세 기능을 구현하도록 하였습니다. 


Model class 는 아래와 같이 구현 하였습니다.


application/models/Model.php


<?php

namespace application\models;


use \PDO;


class Model

{

    public $pdo;


    public function __construct()

    {

        $dsn = _DBTYPE . ':host=' ._HOST. ';dbname=' . _DBNAME . ';charset=' . _CHARSET;


        try{

            $this->pdo = new PDO($dsn, _DBUSER, _DBPASSWORD);


            $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


        } catch (Execution $e) {

            var_dump("DB접속중 에러가 발생 하였습니다. : ". $e->getMessage());


        }

    }

}



BoardModel.php



DB접속 정보에 대한 구현이 끝났으므로

이 클래스를 상속하여 데이터를 처리하는 클래스를 만들어 보도록 하겠습니다.


application/models/BoardModel.php



<?php

namespace application\models;


use \PDO;


class BoardModel extends Model

{

    public function selectList($category, $idx, $pageNo)

    {

        $sql = 'SELECT idx, title FROM board ';


        $stmt = $this->pdo->prepare($sql);


        $stmt->execute();


        return $stmt->fetchAll(PDO::FETCH_OBJ);


    }

}


BoardController의 index 객체에서 selectList() 메소드를 호출한 것을 기억하고 계신가요?

이 부분은 board 게시판의 목록을 출력하는 하기위에 데이터를 읽어 오는 부분 입니다.


prepare는 쿼리를 실행할 준비를 하는 단계로 SQL문을 등록하는 단계라고 볼 수 있습니다.

그리고 execute() 명령을 통해 실제로 쿼리를 실행하게 됩니다.


여기서 데이터를 반환할때는 배열로 반환하였습니다.

첫번째 인자는 목록의 갯수이고 두번째 인자는 조회된 전체 데이터 입니다.


fetchAll 은 쿼리 실행 결과가 여러 줄일 경우 모든 결과를 가지고 옵니다.

이때 옵션으로 FETCH_OBJ 를 줬는데, 이 옵션으로 인해 우리는 반환된 값에 접근할때

객체에 접근 하는 것과 비슷한 방식으로 접근을 할 수 있습니다.

예를 들어 글 제목에 접근을 할따면 $stmt->title  과 같은 방식입니다.


여기서 목록의 조회 갯수를 포함하여 배열로 만들어 반환하는 이유는

view 에서 fetchAll()을 가지고 목록의 갯수를 파악하기 힘들기 때문입니다.

현재 글이 없다면 '작성된 글이 없습니다.' 라는 문구를 출력할 방법이 없기 때문입니다.

(제가 방법을 알고 있지 못할 수도 있습니다. 혹시 방법을 알고 계시다면 조언 부탁 드립니다.)


그런데 여기서 한가지 특이한 점이 있습니다.

PDO를 사용하기 위해 use 키워드를 사용해 PDO를 지정했다는 것입니다.


autoload는 정의되지 않은 사용자 정의 클래스를 자동으로 불러 오기 위해 만들어 졌습니다.

하지만 PDO 객체 역시 어디에도 정의하지 않은 않아 우선 autoload를 찾아 들어 가게 됩니다.

우리의 autoload 에서는 PDO가 정의된 클래스를 찾아 불러오는 부분이 없습니다.

결과 적으로 PDO 객체를 찾을 수 없다는 에러 메시지를 출력하게 됩니다.


PDO와 같이 PHP에서 지원하는 클래스들은 autoload를 하게 되면 정상적으로 동작할 수가 없습니다.

따라서 use 키워드를 통해 PDO를 선언해 주어야만 autoload사용으로 인한 문제 없이 PDO를 사용할 수 있습니다.


위 소스중에 크게 어려운 부분은 없을 것이라고 생각됩니다.

하지만 PDO를 이용한 데이터 처리에 익숙하지 않으신 분들은 조금 이해하기 힘들 수도 있습니다.
PDO를 이용한 데이터 처리 방식은 객체지향형 프로그램 방식으로 프로그램을 하지 않더라도 사용이 가능한 방법입니다.
따라서 되도록이면 PDO를 이용하는 방식으로 개발 하는 것이 좋을 것 같습니다.


반응형