본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/php

CodeIgniter : PHP Framework

by 차누감 2020. 1. 14.

문서를 구분하는 기준 - 역할을 나눠 코드 관리

  • MVC ( Model-View-Control ) Model : 데이터만 취급, View : 화면, Control : 기능
  • MVP ( Model-View-Presenter) 안드로이드로 예를 들면mainActivity에 코드를 쓰지 않고 별도의 문서로 나누면 MVP
  • MVVM ( Model-View-ViewModel )
  • Flux

 


Back-Ecd

  • PHP
    • CodeIgniter
    • LaLavel
  • JSP
    • Spring
    • 전자정부프레임워크

Front-End (html-css-JS)            Hybrid-APP  (JQM library : 옛날 방식 1세대, cordova : 1.5세대, )

Angular - 구글         ----------->   Ionic + cordova

React - 페이스북      ----------->   Reac Native

Vue                       ----------->   Flutter

RxJava, RxAndroid

 


ci.zip
3.59MB

이번 예제는 php Framework를 이용하는 것이다. 

이것은 기본 틀로 코드를 구분하기에 보기도 편하고 인수인계가 편리하다. 실력이 없어도 틀만 구분을 잘하면 티가 안날 수 있다.

CodeIgniter로 MVC 패턴 알아보기 위해 우선 아래 경로에서 다운을 받자

 

https://codeigniter.com/

 

CodeIgniter Web Framework

The latest is Version 3.1.11

codeigniter.com

php 파일을 확인하기 위해 미리 XAMPP를 켜두자.

임의로 작업할 폴더( ci )를 만들었다. 여기서 작업을 해보자. 

아까 다운 받은 CodeIgniter의 압축푼 파일들을 ci 폴더로 복붙하자.

그리고 제대로 됐는지 확인해보자.  잘 옮겨졌다면 Welcome to CodeIgniter를 볼 수 있을 것이다.

크게 폴더는 3개로 나뉜다. (application, system, user_guide이다. 우리는 application 폴더만 사용할 것이다.)

application 폴더 안에 controllers폴더가 있을 것이다. 거기에 intro.php 파일을 만들자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
// 코드를 웹에서 직접 점근하는 경우를 허용하지 않게 해주는 
defined('BASEPATH') or exit('직접 접근은 불가합니다.');
 
// 클래스명은 파일명과 같아야함.
// 그리고 컨트롤러는 CI_Controller를 상속받아야함.
class Intro extends CI_Controller{
    // 이 컨트롤러 클래스인 Intro가 처음 실행될 때 별도의 지정이 없다면
    // 무조건 호출되는 메소드(마치 index.html 같은)
    public function index(){
        echo "Intro index!!!!<br>";
        
    }
 
    // Intro를 실행할 때 특정 메소드를 지정해서 실행할 수도 있음
    public function show(){
        echo "Intro show!!!!";
 
    }
 
}
 
?>

그런데 주소창에 index.php파일까지 사용하는건 불편하다. 다른 사이트를 접속해도 저렇게는 안나온다. 

index.php 파일을 생략하자.

config.php 파일을 들어가보면 index_page 란에 빈값으로 변경하자. 그리고 추가 작업이 있다.

위 작업을 해주려면 .htaccess 파일 필요하다. index.php 파일과 같은 경로에 넣자.

.htaccess
0.00MB

그리고 이제 해당 페이지를 보여주려면 ci에서 해당 메소드명을 써야 한다.

ci 경로까지만 썼을때 기본으로 보여주게 할 수 있다.

그러나 주의할 점은 아까 만든 show와 index 메소드의 내용을 보려면 Intro를 써줘야한다.

이제 MVC에서 VC으로 코딩해보자.  V : 화면에 보여주는 부분, C : load만 하는 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Intro View</title>
</head>
<body>
 
    <h2>Intro index method</h2>
    <p>This is index method....</p>
    
</body>
</html>

intro.php 에서는 load만 하여 intro_view.php 내용을 보여준다. view할때 .php는 생략 가능하다.

같은 방법으로 show 메소드에도 load해보자.

application 폴더 안에 views폴더 안에 intro_show.php 파일을 만들자.

intro.php 에서는 load만 하여 intro_show.php 내용을 보여준다. view할때 .php는 생략 가능하다.

한 메소드에서 여려개 load도 가능하다.

views폴더 안에 module 폴더를 만들고, module폴더 안에 header.php 파일을 만들자.

아래 사진처럼  html 태그  </body> </html>를 끝내지 않고 저장하였다. 

엔드태그를 다른 문서에서 작성 가능하다. 같은 경로에 module 폴더 안에 content.php 파일을 만들자.

이제 intro.php에서 load 해보자. start 태그와 end 태그를 나눴으므로 둘다 load 해주자.

이미지 추가도 가능하다. ci폴더 안에 images라는 폴더를 만들고, 임의 이미지 파일을 놓자.

content.php 파일 끝나기 전에 이미지를 추가해보자. 경로는 인터넷 주소처럼 써야 한다.

이제 보여주는 페이지에 데이터를 전달해보자.

아직 존재하지는 않지만 trans폴더 안에 first파일에 데이터를 전달할 것이다.

데이터를 전달할때는 배열로 줘야한다.

이제 views 폴더 안에미리 경로를 쓴 trans폴더와 first.php 파일을 만들자.

name과 msg라는 변수가 없지만 전달받은 연관배열의 요소가 자동으로 변수로 사용할 수 있다.

전달한 SAM과 Hello CodeIgniter가 잘 전달되었다.

이제 다시 intro.php에 메소드를 작성하자.

이번에는 load로 바로 view에 해당하는 php파일을 보여주지 않고 문자열로 리턴 받아서 보여줄 수 있다.

intro_view.php 는 아까 처음에 만들었다. 내용을 아래 사진과 같다.

이제 추가로 MVC 에서 M : 데이터를 취급하는 곳을 나눠서 작업해보자.

application 폴더 안에 models폴더 안에 Member.php 파일을 만들자.

예제에서는 변수에 직접 값을 썼지만, 원래 코드에서는 DB에서 값을 받아온다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
 
    // 코드이그나이터에서 직접 이문서에 접속을 허용하지 않는 코드
    defined('BASEPATH') or exit('직접 문서 접속 불가');
 
    // CI에서 사용하는 모델 클래스 제작.반드시 CI_Model를 상속해야함.
    class Member extends CI_Model{
 
        // 멤버변수
        private $name;
        private $msg;
 
        // 생성자
        public function __construct(){
            parent::__construct();
 
            $this->name="SAM";
            $this->msg="Hello CI";
        }
 
        public function getName(){
            return $this->name;
        }
 
        public function getMessage(){
            return $this->msg;
        }
 
    }
 
 
?>
 

이제 intro.php 파일에서 데이터를 취급하는 Member.php 파일을 load하여 값을 표시하자.

받은 값들을 그냥 출력하면 모양이 예쁘지 않다. 받은 값을 다시 화면에 보여주는 임의 view.php에 전달해보자.

views폴더 안에 member 폴더를 만들고, member 폴더 안에 member_view.php 파일을 만들자.

추가로 Member.php를 load했을때 생성자명으로 참조를 해야했다. 이름을 따로 지정할 수 있다.

이제 DB를 이용하여 MVC 구조로 코드를 작성해보자.

우선 DB 데이터를 취급한 BoardDB.php 파일을 만들자. 

경로는 models 폴더 안에 board 폴더를 만들고, BoardDB.php 파일을 만들자.

그 전에 DB 작업을 하려면  config 폴더 안에 database.php 해당란을 채우자.

그리고 자신의 DB에 접속하여 table을 만들자.

테이블 만든명령어 :CREATE TABLE board2(num INTEGER AUTO_INCREMENT, name VARCHAR(20) NOT NULL, msg TEXT,PRIMARY KEY(num))charset=utf8;

 

이제 아까 만든 BoardDB.php 에 코딩하자.

BoardDB.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
 
defined('BASEPATH') or exit('직접 문서 접속 불가');
class BoardDB extends CI_Model{
    public function ____construct(){
        parent::__construct();
    }
 
        // board데이블의 레코드들 읽어오는 기능 함수
        public function getBoards(){
            // database를 관리하는 DBMS(Mysql)에 접속
 
            $this->load->database();
        
 
        // 위에서 로드하면 DB제어할 수 있는 객체($this->db) 생성됨
 
        // $this->db를 이용해서 원하는 쿼리 작성 ( PDO객체와 메소드가 다름 )
        $result=$this->db->query('SELECT * FROM board2');
 
        // $result객체에게 쿼리의 결과를 배열로 달라고 할 수 있음
        $rows=$result->result_array();  //result_array()함수는 쿼리의 결과를 2차원 배열로 리턴 : 각 레코드는 연관배열로 되어 있음.
        $this->db->close();
 
        // 가져온 2차원 배열 데이터를 리턴
        return $rows;
    }
        // 데이터를 삽입하는 메소드
        public function insertRecord($name, $msg){
            // DB접속
            $this->load->database();
 
            $datas= array('name'=>$name, 'msg'=>$msg);
            $this->db->insert('board2',$datas);
 
            // 리스트를 보여주는 화면 로딩
            // $this->load->view('board/board_view');
        }
    }
?>
 

intro.php 로 다시와서 database() 메소드를 작성하자.

그리고 곧 만들 board/board_view.php 로 가져온 데이터를 보여줄 것이다.

아직 DB board2 테이블에는 값이 없어서 안보일 것이다.

아까 cmd창에서 테이블에 데이터를 추가하자.

전달 받은 데이터를 보여줄 board_view.php 를 만들자.

경로는 views폴더 안에 board 폴더를 만들고, 거기에 borad_view.php 파일을 만들자.

board_view.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>board_view</title>
</head>
<body>
 
    <h2>게시판</h2>
    <table>
    <thead>
        <tr>
            <th>num</th>
            <th>name</th>
            <th>message</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($rows as $row) : ?>
            <tr>
                <th><?=$row['num']?></th>
                <th><?=$row['name']?></th>
                <th><?=$row['msg']?></th>
 
            </tr>
        
        <?php endforeach ?>
    </tbody>
    </table>
 
    <form action="http://localhost/ci/Intro/insertBoard" method="post">
        <input type="text" name="name">
        <input type="text" name="msg">
        <input type="submit">
    </form>
    
</body>
 
 

이제 intro.php에서 insertBoard() 메소드를 만들자. 제출 버튼 기능이다.

intro.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
 
// 코드를 웹에서 직접 점근하는 경우를 허용하지 않게 해주는 
defined('BASEPATH') or exit('직접 접근은 불가합니다.');
 
// 클래스명은 파일명과 같아야함.
// 그리고 컨트롤러는 CI_Controller를 상속받아야함.
class Intro extends CI_Controller{
    // 이 컨트롤러 클래스인 Intro가 처음 실행될 때 별도의 지정이 없다면
    // 무조건 호출되는 메소드(마치 index.html 같은)
    public function index(){
        echo "Intro index!!!!<br>";
 
        // echo로 화면을 만드는 것을 불편함. 또한, 이 클래스의 코드가 매우 복잡함
        // 화면에 보여지는 것들은 별도로 views 폴더 안에 별도 문서로 제작하고 이를 불러와서 보여주기
        $this->load->view('intro_view');
        
    }
 
    // Intro를 실행할 때 특정 메소드를 지정해서 실행할 수도 있음
    public function show(){
        echo "Intro show!!!!";
 
        // 별도의 view문서로 화면 설계하고 보여주기
        $this->load->view('intro_show');
 
        // 하나의 함수안에 여러뷰를 load할 수 있음
        $this->load->view('intro_show_second');
    }
 
    // 이를 이용해서 웹페이지의 공통 모듈작업 가능함
    public function module(){
        // headerview 추가
        $this->load->view('module/header.php');
 
        // 콘텐츠 추가
        $this->load->view('module/content.php');
    }
 
    // 뷰에 데이터를 전달하기
    public function transmisstion(){
 
        // 뷰를 로드하면서 보내줄 데이터들 연관배열로
        $datas= array("name"=>"SAM""msg"=>"Hello CodeIgniter");
 
        $this->load->view('trans/first',$datas);
    }
 
    // 뷰를 로딩하여 화면에 보여주는 것이 아니라 문자열로 리턴해주기
    public function returnView(){
        // 세번째 파라미터 : 문자열로 리턴할지 여부
        $str=$this->load->view('intro_view','',true); //매개변수 1:문서이름 2:전달할 값 3:기본값 false
        echo "로딩한 뷰의 문자열 데이터 : ".$str;
    }
 
    // 이제 데이터를 관리하는 Model문서에 대해서 .......
    public function members(){
        //application/models/Member.php문서 로드하기
        $this->load->model('Member');
 
        // 위에서 로딩을 하면 이 컨트롤러 클래스의 객체(Intro)의 멤버변수로 Member라는 클래스 객체 참조변수가 생김
        $name=$this->Member->getName();
        $msg= $this->Member->getMessage();
        // echo "$name, $msg";
 
        // 뷰에 전달할 연관배열
        $datas= array();
        $datas['name']= $name;
        $datas['msg']= $msg;
 
        // 뷰문서로 이쁘게 보여주기위해 데이터를 전달
        $this->load->view('member/member_view',$datas);
 
        // 참고 //
        // 모델 로딩하면 자동으로 Controller클래스의 멤버변수가 만들어짐
        // 이때, 기본 변수명은 Model class의 클래스명과 같음
        // 이 이름을 별명으로 변경할 수 있음
        // $this->load->model('Member','aaa');
        // $name=$this->aaa->getName();
        // $msg= $this->aaa->getMessage();
 
    }
 
    // CI데이터베이스 사용하기
    public function database(){
        // 모델 문서의 데이터를 데이터베이스에서 읽어오기
        // 그 작업은 모델문서에서 작업
 
        $this->load->model('board/BoardDB');
 
        $rows=$this->BoardDB->getBoards();
        foreach($rows as $row){
            echo $row['num'].", ".$row['name'].", ".$row['msg']."<hr>";
        }
 
        // 이쁘게 하기 위해 뷰문서를 이용
        $datas['rows']=$rows;
        $this->load->view('board/board_view',$datas);
    }
 
    // DB에 값 입력하는 메소드
    public function insertBoard(){
        $name= $_POST['name'];
        $msg= $_POST['msg'];
 
        $this->load->model('board/BoardDB');
        $this->BoardDB->insertRecord($name, $msg);
 
        //리스트를 보여주는 화면 로딩하는 메소드 실행 
        $this->database();
    }
 
}
 
?>
 

댓글