본문 바로가기
코드이그나이터와 php7와 mysql

코드이그나이터4. 코드이그나이터답게 모델화!

코드이그나이터4 모델화 Class 프로그래밍

1. 오토셋 APM 인스톨러 ( apache + php7.2 + mariadb ) 설치 | https://itadventure.tistory.com/93

2. 코드이그나이터 4 ( codeigniter 4 ) 설치 | https://itadventure.tistory.com/95

3. 비주얼 스튜디오 코드 에디터 설치 & 한글 설정 | https://itadventure.tistory.com/96

4. 폴더열기 / 웹페이지 편집(1) | https://itadventure.tistory.com/97

5. 웹페이지 편집(2) | https://itadventure.tistory.com/101

6. 코드이그나이터4의 URL 규칙 | https://itadventure.tistory.com/105

7. php, 네임스페이스 [ namespace ] ?! | https://itadventure.tistory.com/118

8. 코드이그나이터의 네임스페이스, 그리고 모델 | https://itadventure.tistory.com/122

9. 코드이그나이터 뷰의 파라미터 전달 | https://itadventure.tistory.com/147

10. 코드이그나이터 뷰를 나눠 볼까요? | https://itadventure.tistory.com/174

11. MYSQL 이 뭐여? [ 마이에스큐엘은 서류철이다! ] | https://itadventure.tistory.com/175

12. MYSQL 콘솔에 접속해보자! | https://itadventure.tistory.com/178

13. MySql에 넣었다가 꺼냈다가, 뭘? | https://itadventure.tistory.com/265

14. 검색진열대 MYSQL | https://itadventure.tistory.com/267

15. 편집의 왕자 MySQL | https://itadventure.tistory.com/269

16. 코드이그나이터4, MYSQL과 손잡다. | https://itadventure.tistory.com/271

17. MySQL -> 컨트롤러 -> 뷰 트리플 패스! | https://itadventure.tistory.com/272

18. 코드이그나이터! MySQL 에 입력하다! ( insert ) | https://itadventure.tistory.com/273

19. 해킹을 막아라! MySQL인젝션 보안 | https://itadventure.tistory.com/274

20. MySQL과 친해지는 phpmyadmin | https://itadventure.tistory.com/277

21. 코드이그나이터4에서 책 정보를 편집해볼까요? | https://itadventure.tistory.com/280

22. 코드이그나이터4에서 책을 지워봅시다. DELETE! | https://itadventure.tistory.com/282

23. 코드이그나이터4, 페이징 기술 | https://itadventure.tistory.com/285

24. 코드이그나이터4. 검색! | https://itadventure.tistory.com/295

25. 코드이그나이터4. 검색어 자동 추천! | https://itadventure.tistory.com/303

26. 코드이그나이터4. 네이버 검색 따라잡기-1. 대용량 자료 쾌속 검색!(1) | https://itadventure.tistory.com/304

27. 코드이그나이터4. 네이버 검색 따라잡기-2. 대용량 자료 쾌속 검색!(2) | https://itadventure.tistory.com/306

28. 코드이그나이터4. 네이버 검색 따라잡기-3. 대용량 자료 쾌속 검색!(3) | itadventure.tistory.com/310

29. 코드이그나이터4. 코드이그나이터답게 모델화! M!(Model)


오랜만에 코드이그나이터4 글을 올려보도록 하겠습니다 :)

MVC 패턴의 핵심 중 하나는 뭐니 뭐니해도 객체 지향형 프로그래밍입니다.
잘 만든 클래스와 도큐먼트가 사이트 전체를 얼마나 심플하게 관리할 수 있는지를 전적으로 의미하게 되는데요.

이는 하나의 주제화된 큰 개념을 캡슐화함으로써
여러가지를 동시에 이것 저것 생각하게 하는 프로그래밍 과정을 단순하게 해줍니다.
단순한 샘플 코드를 작성하는 정도라면 클래스가 필요없지만,
사이트의 규모가 커지면 커질수록 재활용 가능한 방식의 프로그래밍은 매우 중요합니다.

이것이 가능한 것이 바로 클래스 프로그래밍,
즉 객체지향형(OOP:Object Oriented Program) 프로그래밍 방식인 것이지요.

PHP는 C# 이나 자바처럼 완벽한 객체 지향형 언어는 아닙니다.
그러나 일부 도입부를 제외하고는 객체 지향형 언어처럼 프로그래밍할 수 있는데요.
코드 이그나이터4는 이러한 도입부는 프레임 워크가 모두 알아서 처리하니,
실제로는 객체 지향형 부분만 코딩하면 됩니다.

그 중에서도 '꽃'이라고 할 수 있는 것이 바로 모델(Model)입니다.
어플리케이션에서는 보통 '클래스(Class)'라고 지칭하는 이것이,
코드이그나이터 MVC 패턴의 첫글자 'M'에 해당하는 Model 인 것입니다.
얼마나 중요하기에 첫글자에 넣었을까요? :)

지난 시간까지는 완전한 책의 목록과 검색, 삽입, 추가, 삭제 등의 기능, ajax 제어와 대용량 쾌속 검색을 위한 단어 사전 생성 등을 다루어 보았었는데요.
사실 그 때까지는 웬지 코드이그나이터의 특장점을 완전히 살리진 못한 방법이었습니다.

이렇게 가정을 해봅시다.
만일 '책을 관리하는 로봇'이 있어서
그 로봇에게 책을 등록해줘, 책 정보를 수정해줘, 책 정보를 삭제해줘 , 단어 사전을 만들어줘
이런 명령만 내리면 알아서 그 동작을 수행해준다면 어떨까요?

그렇다면 최소한의 화면만 제어하고 나머지는 로봇에게 시키면 되는 것입니다.
다음과 같이 명령을 내리면 알아서 작동이 된다면 insert 문이 update 문이 어떻고
이런걸 매번 신경쓸 필요가 없는 것입니다.

$책관리로봇->책등록해줘($책정보);
$책관리로봇->책수정해줘($번호, $책정보);
$책관리로봇->책삭제해줘($번호);
$책관리로봇->단어사전만들어줘();

대신 이 책을 관리하는 로봇은 오로지 책에 대한 기능만 수행한다고 선을 긋는 것이지요.

이 로봇이 바로 모델화이자 캡슐화입니다.
책이라는 '개념'을 만들고 그에 따른 몇가지 기능을 포함한 다음, 이 것을 객체(Object)화하는 것입니다.

구구절절 설명은 접고 뭐니뭐니 해도 코드를 보는 것이 제일이니
본격적으로 코드이그나이터에서 객체를 사용하는 코드를 확인해보겠습니다.

아래 소스를 구성해서 저장해주세요.
지난 강좌를 모두 따라하셨다면 이 파일이 이미 존재할텐데요. 그 파일에 덮어쓰시면 됩니다.
app\Models\BookModel.php

<?php namespace App\Models;

use CodeIgniter\Model;

class BookModel extends Model
{
    public $db;

    // 클래스 생성자
    public function __construct()
    {
        $this->db = \Config\Database::connect("default", false);
    }

    public function get_query()    
    {        
        $sql = "select * FROM book";
        return $this->db->query($sql);
    }

    // 단어 사전 만들기
    public function MakeBookWord()
    {
        ini_set('memory_limit', -1);
        $query_cnt = $this->db->query("SELECT count(*) as cnt FROM book");
        $total = $query_cnt->getResultArray()[0]['cnt'];        
        $limit=1000; // 1000 건씩 끊어서 처리
        $word_arr=array();

        $special_chars=array(
            "[", "]", "(", ")", ",", ":", ";", "<", ">",
            "&", "?"
        );
        // 유지할 단어 + - * / . %
        for($step=0;$step<$total;$step+=$limit)
        {
            $results = $this->db->query(
                "SELECT number, title FROM book 
                order by number 
                limit $step, $limit"
            )->getResultArray();
            foreach($results as $result)
            {
                foreach($special_chars as $char){
                    $result['title']=str_replace($char, " ", $result['title']);
                }
                $explode = array_unique(explode(" ", trim($result['title'])));
                foreach($explode as $word)
                {
                    if(strlen($word)<=1)continue;                    
                    if(!empty($word_arr[$word]))$word_arr[$word].=",";
                    $word_arr[$word].=$result['number'];
                }                    
            }
        }

        echo count($word_arr)."개<br/>";
        ob_flush(); flush();

        $cnt=0;
        $this->db->query("drop table book_search");
        $this->db->query("create table book_search (
            word varchar(120),
            numbers text
        )");
        $i=0;
        $this->db->transStart();
        foreach($word_arr as $word=>$numbers){
            $i++;
            echo "$i: ".$word." / ".$numbers."<br/>";
            $sql="insert into book_search (word, numbers)
            values ('".addslashes($word)."', '".addslashes($numbers)."')";
            $this->db->query($sql);
            $cnt++;
            if($cnt>=100)
            {
                $this->db->transComplete();
                $this->db->transStart();
                $cnt=0;
            }
        }
        $this->db->transComplete();
        $this->db->query("ALTER TABLE book_search ADD INDEX(word);");
        
        echo "단어사전 입력이 완료되었습니다.";
    }

    // 책 삽입    
    public function BookInsert($data)
    {
        $set=array();
        foreach($data as $fld=>$value)
            $set[]="$fld='".
            $this->db->escapeString($value).
            "'";
        $this->db->query(
            "insert into book set ".
            implode(", ", $set)
        );
    }

    // 책 수정
    public function BookEdit($number, $data)
    {
        $set=array();
        foreach($data as $fld=>$value)
            $set[]="$fld='".
            $this->db->escapeString($value).
            "'";
        $this->db->query("update book set ".
            implode(", ", $set).
            "where number=".$number." limit 1"
        );
    }

    // 책 삭제
    public function BookDelete($number)
    {
        $this->db->query("delete from book
            where number=".$number." limit 1"
        );
    }
}

코드가 꽤 길어보일 텐데요.
사실 그동안의 단어사전 만들기, 책 삽입, 삭제, 수정 기능을 모두 이 클래스 하나에 몰아 넣었기 때문입니다.
이 파일에서는 사실 코드이그나이터에 내장된 Model 클래스의 기능은 전혀 사용하지 않으나
앞으로 사용할 예정이니 우선은 Model 클래스를 상속받는 아래 코드로 시작됩니다.

use CodeIgniter\Model;

class BookModel extends Model
{

이어서 $db 변수를 선언하는 부분이 나오는데요.
이 변수는 책을 삽입하거나 삭제하거나 등의 코드에서 연속된 DB 접속을 피하기 위해,
단 한번만 DB에 접속하기 위한 용도로 클래스 내부의 전역변수로 선언되는 것입니다.

public $db;

다음으로는 클래스 생성자 함수가 나옵니다. 클래스 생성자 함수는 클래스가 객체로 생성되는 순간 자동으로 실행되는데요. ( $BookModel = new BookModel() 이 실행될 때 )
이 때 Database 에 접속하고 그 연결 정보를 클래스 내의 $db 변수에 보관하는 것이지요.
클래스 내 변수에 접근할 때는 그냥  $db라고 사용하지 않고 $this->db 라고 사용하도록 되어 있습니다.

// 클래스 생성자
public function __construct()
{
   $this->db = \Config\Database::connect("default", false);
}

다음에 나오는 get_query() 함수는 지난 게시글 itadventure.tistory.com/175 에서 잠깐 예로 들었던 기능이며 여기서는 사용되지 않습니다. 그냥 지난 예제소스가 오류가 나지 않게 남겨둔 것이니 무시하셔도 됩니다 :)

public function get_query()    
{        
    $sql = "select * FROM book";
    return $this->db->query($sql);
}

그 다음에 나오는 여러 함수들이 있을텐데요.
이 함수들이 바로 과거에 만들었던 기능들을 모두 BookModel 이라는 클래스 안에 담아 버린 것이지요.

 

// 단어 사전 만들기
public function MakeBookWord()
{
      :
}
    
// 책 삽입    
public function BookInsert($data)
{
      :
}

// 책 수정
public function BookEdit($number, $data)
{
      :
}

// 책 삭제
public function BookDelete($number)
{
      :
}

하나만 자세히 보도록 할까요?
책을 삽입하는 BookInsert 함수는 책 정보를 받아, 그 정보를 book 테이블에 insert 해 줍니다.

// 책 삽입    
public function BookInsert($data)
{
    $set=array();
    foreach($data as $fld=>$value)
        $set[]="$fld='".
        $this->db->escapeString($value).
        "'";
    $this->db->query(
        "insert into book set ".
        implode(", ", $set)
    );
}

책을 삽입하는 코드가 지난번과 다르게 일부 바뀌어 있을텐데요.

우선 이 BookModel 클래스 내에 이 함수를 사용하는 방법은 아래와 같습니다.

$BookModel = new BookModel();
$BookModel->BookInsert([
    "title"=>"제목",
    "body"=>"본문",
    "totalpage"=>"페이지",
    "author"=>"작성자"
]);

아래와 같이 정의된 배열이 $data 변수에 넘어오는 것이지요.

[
    "title"=>"제목",
    "body"=>"본문",
    "totalpage"=>"페이지",
    "author"=>"작성자"
]

이 변수는 함수 내에서 각각 다음과 같이 참조할 수 있습니다.

$data["title"]
$data["body"]
$data["totalpage"]
$data["author"]

그러면 이 변수들을 그대로 받아서 아래와 같이 책을 삽입할 수 있도록 코딩할 수도 있지만

$db->query("insert into book set
    title='".$data['title']."',
    body='".$data['body']."',
    totalpage='".$data['totalpage']."',
    author='".$data['author'])."'");

한 단계 더 나아가도록 합시다.
만일 입력하는 요소가 대략 100개라면? 코드가 엄청나게 길어지게 됩니다.

이 때는 넘겨받은 배열변수를 바탕으로 title='제목', body='본문', .... 과 같은 문장을 자동으로 만들어 주는게 좋습니다.
해당 코드는 아래와 같은데요.

    $set=array();
    foreach($data as $fld=>$value)
        $set[]="$fld='".
        $this->db->escapeString($value).
        "'";

먼저 $set 이라는 변수를 요소가 0인 배열 변수로 만들고
각 배열 요소를 순서대로 하여 이름='값' 이라는 문장을 구성해서 배열 요소를 추가, 추가해줍니다.

만일 아래와 같은 입력값이 $data 에 주어진다면, 

[
    "title"=>"지구는 둥글다",
    "body"=>"본문",
    "totalpage"=>"123",
    "author"=>"크레이"
]

foreach 반복문을 거친 후에는 $set 배열 변수에 아래와 같은 내용이 보관됩니다. 

[
"title='지구는 둥글다'"
"body='본문'"
"totalpage='123'"
"author='크레이'"
]

그리고 이 결과를 implode 문으로 합치면

implode(", ", $set)

SQL에 입력할 수 있는 형태로 바뀌는 것이지요. 마치 마법같이 말입니다.

"title='지구는 둥글다', body='본문', totalpage='123', author='크레이'"

아래 코드가 바로 이 결과를 이용 책 테이블에 책을 삽입하는 부분입니다.
코드가 한결 깔끔해 지겠지요 ? :)

$this->db->query(
    "insert into book set ".
    implode(", ", $set)
);

이제 개선된 일부 소스를 나열하겠습니다.
책 목록이야 아직 클래스에 포함시키지 않아서 소스가 아직 길지만 나머지는 소스가 얼마나 깔끔해졌는지 볼까요?

\app\Controllers\BookList6.php
이 소스의 기능들은 아직 모델에 포함시키지 않았습니다.
몇가지 더 추가할 부분들이 있어서 말이지요 :)

<?php
namespace App\Controllers;
use CodeIgniter\Controller;
class BookList6 extends Controller
{
    function get_time() {
        $t=explode(" ",microtime());
        return (float)$t[0]+(int)$t[1]; 
    }
    public function index()
    {        
        $start = $this->get_time();
        $pageview=20;
        $page=$this->request->getVar("page");
        $searchword=trim($this->request->getVar("searchword"));

        if($page=="")$page=1;
        $startlimit=($page-1)*$pageview;

        $db = \Config\Database::connect("default", false);
        $where_sql="";        
        if($searchword!=""){
            $query_search=$db->query(
                "SELECT numbers FROM book_search 
                where word like '".addslashes($searchword)."%'");
        
            $results_search = $query_search->getResultArray();
            $numbers = array();
            foreach($results_search as $one)
            {
                $tmp=explode(",", $one['numbers']);
                $numbers = array_merge($numbers, $tmp);
            }
            $total=count($numbers);
            sort($numbers);
            $numbers=implode(",", $numbers);
            if($numbers!="")
                $where_sql="where number in ($numbers)";
            else $where_sql="where 0";
        }
        else 
        {
            $query_count = $db->query(
                "SELECT count(*) FROM book $where_sql");
            $results_count = $query_count->getResultArray();
            $total = $results_count[0]['count(*)'];    
        }

        $totalpage = ceil($total / $pageview);
        $pagestr="{$total}건, {$totalpage}페이지 / ";

        // 페이지 목록
        $page_begin=$page;
        if($page_begin>$totalpage-10)$page_begin=$totalpage-10;
        if($page_begin<1)$page_begin=1;
        $page_end=$page+9;
        if($page_end>$totalpage)$page_end=$totalpage;
        if($page>1)
            $pagestr .= 
                "<a href='?page=1&searchword=$searchword' 
                style='text-decoration:none'>처음</a> ... ";
        for($i=$page_begin;$i<=$page_end;++$i){
            $pagestr .= 
                "<a href='?page=$i&searchword=$searchword' 
                style='text-decoration:none'>";
            if($i==$page)
                $pagestr .= 
                    "<span style='color:red;font-weight:bold'>[";
            $pagestr .= "$i";
            if($i==$page)$pagestr .= "</span>]";
            $pagestr .= "</a> ";
        }

        if($i-1<$totalpage)
            $pagestr .= 
                " ... <a href='?page=$totalpage&searchword=$searchword' 
                style='text-decoration:none'>끝</a>";

        $query = $db->query(
            "SELECT * FROM book $where_sql 
            order by number desc 
            limit $startlimit, $pageview");    
        $results = $query->getResultArray();
        $data = [
            'title'=>"도서 목록",
            'booklist'=>$results,
            'pagestr'=>$pagestr,
            'searchword'=>$searchword
        ];
        $end = $this->get_time();
        echo "응답속도:".($end - $start)."<br/>";
        return view('booklist6', $data);
    }
}

\app\Views\booklist6.php
책목록을 보여주는 뷰입니다. 모델화로 딱히 줄어드는 부분은 없으며 책 입력하는 버튼이 하나 추가되었습니다.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
    .title_style { font-size:12pt; color:blue}
    .author_style { font-size:9pt; color:gray}
    #preview {
        top:0px;left:0px;
        width:500px;height:200px;
        border:1px solid black;`
        background-color:white;
        overflow:auto;
    }
</style>
<script>
function findbook()
{
  if($('#searchword').val()=='')
  {
      $("#preview").hide();
      return;
  }
  $.ajax({
    url: "./bookAjax5",
    type: "POST",
    data: {searchword : $('#searchword').val() },
    dataType: "html",
    success: function(data) {
      $("#preview").html(data);
      $("#preview").show();
    }
  });  
}

function search_input(obj)
{
    $("#searchword").val($(obj).text());
    document.frm.submit();
}
</script>
<u><b><?=$title?></b></u><br/>
<?=$pagestr?>
<form name="frm" method=post action="bookList5">
제목 검색 : <input type=text name=searchword id=searchword value="<?=$searchword?>" onkeyup="findbook()">
<input type=submit value="검색">
<input type=button value="단어사전만들기" onclick="location.href='MakeBookWord2'">
<input type=button value="책 입력" onclick="location.href='bookInput'">
</form>
<div style="position:relative">
    <div id="preview" style="position:absolute;display:none;background-color:white">

    </div>
</div>
<hr/>
<? foreach ($booklist as $book){?>
<span class=title_style><?= $book['title']?></span>
<span class=author_style>/ <?= $book['author']?></span>
<span class=author_style>/ <a href="bookEdit?number=<?= $book['number']?>">[편집]</a></span>
<span class=author_style>/ <a href="bookDelete?number=<?= $book['number']?>">[삭제]</a></span>
<br/>
<? } ?>
<hr/>
<?=$pagestr?><br/>

\app\Views\bookInput.php
책을 입력하는 View 페이지입니다. 입력하는 액션만 bookInputAct2 로 변경되었습니다.

<style>
    .title_style { font-size:12pt; color:blue}
    .body_style { font-size:10pt; color:black}
    .author_style { font-size:9pt; color:gray}
</style>
<b><u>책 정보 입력</u></b><br/>
<form method=POST action="bookInputAct2">
<div class=body_style>
    제목 : <input type=text name=title value=""><br/>
    본문 : <input type=text name=body value=""><br/>
    페이지수 : <input type=text name=totalpage value=""><br/>
    작성자 : <input type=text name=author value=""><br/>
    <input type=submit value="도서 추가">
</div>
</form>
</form>

\app\Controllers\BookInputAct2.php
책을 입력하는 액션 페이지인데 획기적으로 바뀌었습니다.
BookModel 클래스를 사용하여 BookInsert 명령문을 실행합니다.
이 소스에서는 DB에 연결하거나 insert 문을 구성하는 데에 전혀 신경쓸 필요가 없습니다.
단지 BookModel의 BookInsert 메소드 사용법만 알면 되는 것이지요.

<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\HTTP\Response;
use App\Models\BookModel;

class BookInputAct2 extends Controller
{
    public function index()
    {
        $BookModel = new BookModel();
        $BookModel->BookInsert([
            "title"=>$this->request->getVar("title"),
            "body"=>$this->request->getVar("body"),
            "totalpage"=>$this->request->getVar("totalpage"),
            "author"=>$this->request->getVar("author")
        ]);
        echo $title . " 책 정보가 입력되었습니다.";
    }
}

\app\Views\bookedit.php
책을 편집하는 뷰입니다. 단순히 수정액션이 bookEditAct2 로 링크되는 부분만 변경되었습니다..

<b><u>책 정보 편집</u></b><br/>
<form method=POST action="bookEditAct2">
<div class=body_style>
    <input type=hidden name=number value="<?=$book['number']?>">
    시스템 일련번호 : <?=$book['number']?><br/>
    제목 : <input type=text name=title value="<?=$book['title']?>"><br/>
    본문 : <input type=text name=body value="<?=$book['body']?>"><br/>
    페이지수 : <input type=text name=totalpage value="<?=$book['totalpage']?>"><br/>
    작성자 : <input type=text name=author value="<?=$book['author']?>"><br/>
    <input type=submit value="도서 수정">
</div>
</form>

\app\Controllers\BookEditAct2.php
책을 입력하는 액션과 마찬가지로 책을 수정하는 액션 역시 BookModel 클래스를 사용하는 방법으로 단순화되었습니다.

<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use App\Models\BookModel;

class BookEditAct2 extends Controller
{
    public function index()
    {
        $BookModel = new BookModel();
        $BookModel->BookEdit(
            $this->request->getVar("number"),
            [
                "title"=>$this->request->getVar("title"),
                "body"=>$this->request->getVar("body"),
                "totalpage"=>$this->request->getVar("totalpage"),
                "author"=>$this->request->getVar("author")        
            ]
        );
        return redirect()->to('./bookList6');
    }
}

\app\Views\bookdelete.php
책을 삭제하는 뷰 페이지입니다.
단순히 액션만 bookDeleteAct2 로 변경되었습니다.

<b><u>책 정보 삭제</u></b><br/>
<form method=POST action="bookDeleteAct2">
<div class=body_style>
<input type=hidden name=number value="<?= $book['number']?>">
    시스템 일련번호 : <?= $book['number']?><br/>
    제목 : <?= $book['title']?><br/>
    본문 : <?= $book['body']?><br/>
    페이지수 : <?= $book['totalpage']?><br/>
    작성자 : <?= $book['author']?><br/>
    <input type=submit value="삭제 확안">
</div>
</form>

\app\Controllers\BookDeleteAct2.php
책을 삭제하는 액션 페이지입니다. 역시 BookModel 클래스를 사용하는 방식으로 바뀌었습니다.

<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use App\Models\BookModel;

class BookDeleteAct2 extends Controller
{
    public function index()
    {
        $BookModel = new BookModel();
        $BookModel->BookDelete($this->request->getVar("number"));
        return redirect()->to('./bookList6');
    }
}

 

\app\Controllers\MakeBookWord2.php
마지막으로 단어 사전을 만드는 페이지인데 긴 코드는 모두 BookModel 클래스로 흡수되었기 때문에,
몇 줄의 단순한 코드만 남았습니다.

<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use App\Models\BookModel;

class MakeBookWord2 extends Controller
{
    public function index()
    {        
        // 도서에 관련된 기능이 내장된 클래스를 오브젝트 생성
        $BookModel = new BookModel();
        // 사전을 만드는 기능 실행
        $BookModel->MakeBookWord();
    }
}

기능적으로는 지난번과 달라진 것은 아무것도 없습니다.
하지만 이러한 방식으로 프로그래밍하는 것으로 코드를 재활용할 수 있고
개념적인 생각을 더욱 단순화할 수 있으며, 이는 개발속도의 향상으로 이어집니다.

하지만 그 과정에 빼놓을 수 없는건 문서화입니다.
이 클래스에 무슨 무슨 메소드가 있고 각 기능들을 문서로 나열하는 것이지요.

아무리 클래스를 잘 만들어도 사용법을 몰라서 클래스를 다시 분석해야 한다면,
그다지 클래스를 사용하는 효용성이 없습니다.

문서의 양식은 자유로우나 아래와 같은 방법도 좋습니다.
그냥 이 문서를 한달 후에 다시 보았을 때 각 기능들이 기억나는 수준으로 한다면 잘 정리된 것입니다.

클래스명 : BookModel
내용 : 책 테이블을 관리하는 클래스
메소드
    // 단어 사전 만들기
    public function MakeBookWord();
    
    // 책 삽입
    // 입력) 
    //   $data : 필드명=>값으로 구성된 배열
    public function BookInsert($data);
    
    // 책 수정
    // 입력) 
    //   $number : 책의 키값
    //   $data : 필드명=>값으로 구성된 배열
    public function BookEdit($number, $data);
    
    // 책 삭제
    // 입력)
    //   $number : 책의 키값
    public function BookDelete($number);
}

코드 이그나이터의 모델을 이용한 객체 지향형 프로그램 방식을 다루어 보았습니다.
필요하신 분에게 도움이 되셨을지 모르겠습니다.

다음번에는 모델에 기능을 추가하면서 새로운 시도를 보여드리도록 하겠습니다.
오늘도 여기까지 읽어 주셔서 감사합니다 :)


하나님의 말씀을 마음에 담아두면 어려울때 힘이 됩니다.

은사는 여러 가지나 성령은 같고 직임은 여러 가지나 주는 같으며 또 역사는 여러 가지나 모든 것을 모든 사람 가운데서 역사하시는 하나님은 같으니
- 고린도전서 12:4-6절 말씀 -