본문 바로가기

Language/PHP

[CodeIgniter] MVC

MVC

 디자인 패턴
  • 디자인패턴 : 건축에서 유래, 건축은 공법을 가지고 있다.
  • 소프트웨어에도 이 공법을 적용할 수 있다!라는 생각에서 건축기법을 가져옴

첫번째 공법 : 아주 뛰어난 엔지니어가 해결한 문제를 보통 엔지니어도 해결할 수 있는 방법론.
두번째 공법 : 엔지니어와의 효율적인 커뮤니케이션을 위함

 MVC 디자인 패턴
  • 소프트웨어의 개발의 디자인 패턴 중 하나
  • MODEL VIEW CONTROLLER 의 약자
  • 애플리케이션을 구현할 때 MVC 세가지 주체로 나누어 구현을 하면,좀 더 효율적으로구축할 수 있다.

  CodeIgniter의 MVC 원리 (흐름)

1.  Controller
사용자가 접근 한 URL에 따라서 그 URL에 따른 로직(사용자가 원하는 정보)이 실행될 수 있도록 하는 것

즉 URL 해석 : 사용자의 요구사항, 의도가 무엇인지 ex) 이 리스트의 1번글이 보고 싶어! ~/index.php/topic/get/1 

클래스, URL에 해당되는 메소드(Model, View 호출)가 정의되어 있다.


2. Model

사용자의 요구에 맞는 데이터를 가져온다.


3. View

사용자에게 최종적으로 보여줌.



Controller ( MVC 중에서 'C')

  • 작성한 코드 파일은 application > controllers 에 저장
  • URL에 맵핑되는 어떤 작업을 수행하는 것. ( URL과 연관성 )
  • URL에 대한 클래스나 메소드를 정의하면 코드이그나이터가 알아서 그것들을 호출해준다.


 규칙



1. 파일명과 동일한 class명(첫글자는 무조건 대문자, 나머지는 소문자 사용)을 사용한다(파일명도 첫글자 대문자;CIv3). (Line 4) 

extends CI_Controller : 부모클래스를 상속받도록 하는 것


2. 주소 뒤에 어떠한 이름도 쓰지 않았을 때, Topic이라고 하는 클래스에, index() 메소드를 호출하도록 약속되어 있다. (Line 6)

-> Address :  ~/odeIgniter-3.1.5/index.php/topic

-> Output : '토픽 페이지';


3. 특정 메소드 끝에 특정한 값을 전달하고 싶다면, 파라미터를 정의하자.  (Line 11)

-> Address :  ~/odeIgniter-3.1.5/index.php/topic/get

-> Output : '토픽';


-> Address :  ~/odeIgniter-3.1.5/index.php/topic/get/1

-> Output : '토픽1';  $id(~/get/$id) 값에 따라 숫자가 바뀜.






View ( MVC 중에서 'V')

  • applications>views 에 저장.

  • 화면상에 출력되어 있는 것과 관련되어 있다. (html, css, javascript)


 왜 view를 사용해야하는가?


  • Controller 안에 있는 시각적으로 표현되는 것들을 따로 모아 (applications>view), 독립된 파일인 것처럼 처리함으로써 깔끔하고 체계적으로 자원들을 관리하기 위해서.
  • 업무적으로, 개발자와 디자이너, 퍼블리셔가 자기 위치에서 업무를 수행함으로써 업무효율을 높이고, 수정 과정에서 오류 위험성도 낮출 수 있다.



 규칙



1. $this->load->view('파일명');

: view라고 하는 메소드에 topic이라고 하는 값을 인자로 전달하게되면, 코드이그나이터는 알아서 이 구문이 실행될 때 application>views>topic.php를 로드하도록 약속

인자에 '.php' 를 써주지 않아도 인식. (Line 8)


2. $this->load->view( '파일명' , 연관배열 );

: view의 두번째 인자로 연관배열을 전달하면, 연관배열에 있는 키 값에 따라서 main.php 코드 안의 $id가 그 값을 받아서 화면에 출력할 수 있다.
( * 기억: 연관배열의 키값은 VIEW에서 변수명으로 사용.)

1번과 동일하게 $this->load->view('main'); 으로 할 경우, 인자를 전달받지 못해 에러(출력모습 : 토픽 '.$id.' )가 나지만 이렇게 처리하면 에러가 나지 않는다. (Line 15~16)




<controller : topic.php>



<view : main.php >


* foreach문 에러시 빈값 체크를 해주어야 한다.

<?=$entry(전체)->뿌리고 싶은 필드명?>






MODEL ( MVC 중에서 'M')

  • controller가 복잡해지는 것을 막고, 역할에 따라 모듈화 하는 것.

  • DATABASE, 즉 데이터를 담당하는 곳.



▣ 코드 작성하기

1. 데이터베이스 설정


application>config> databases.php 파일 수정  : 이 파일은 보안상 위험하고 취약한 파일, permission을 소유자(apache)에게만 읽을 수 있는 권한을 주고 나머지 사용자에게는 어떠한 권한을 주지 않는 것이 좋다. 버전관리시스템에 올릴 때 , 공개 되기 때문에 버전관리시스템에 올릴때 ignore 설정을 해야함.

(* 설정과 관련된 파일들이 있는 디렉토리 : applicaition > config)


- 변경 항목 -

hostname

database username

database password

database : 사용 DB 명

dbdriver : mysqli (데이터베이스 시스템 적기 : database 폴더 아래 drivers 폴더 아래 폴더 이름 참고해서 적기)



2. databases라는 라이브러리 로드하기


  • 실제로 DB를 핸들링하기 위해서 여러가지 편의를 제공하기 위한 라이브러리를 코드이그나이터가 제공해줌.

  • 그것을 사용하기 위해서는 이 해당 라이브러리를 로드하는 방법을 알아야함


1. application > config > autoload.php 열기


libraries 라는 배열에 database 넣기 ($autoload['libraries'] = array('database);)

: 코드이그나이터가 실행될때, 자동으로 데이터베이스와 관련된 라이브러리를 로드해줌 (따라서 한번만 설정해 주면 됨)


* db를 자주 사용하지 않는 서비스를 만든다면 비효율적, 이 때는 이 작업을 하지 않고, controller에서 해당 작업을 해주면 된다. (대부분의 경우)

: $this->load->database();


2. model 만들기


application > model > new file 생성 (파일명도 첫글자 대문자;CIv3)

테이블 이름을 가진 모델을 하나씩 생성해주는 것이 일단은 깔끔한 규칙(무조건인 규칙은 아니다.)

ex) topic_model.php : topic이라고 하는 테이블을 핸들링하는 모델을 만든 것





 
규칙


1.  function __construction(){ parent::__construct(); ......... }

Line 3: 코디이그나이터에서 제공하는 CI_MODEL이라는 클래스를 꼭! 상속해주어야 한다.

Line 5~7 : __construct()는 php 생성자로, 해당 클래스가 내부적으로 생성될 때 제일 먼저 실행되는 일종의 초기화와 관련된 함수이다.

모델에서 어떤 메소드를 호출하던간에 언제나 동일하게 사용되는 작업이 있다면 여기(parent::__contruct(); 다음에)에 기술하면 된다.





2. 테이블의 데이터 리스트 가져오기 API : gets()

public function gets(){    }


3. 테이블 데이터 가져오기


방법 1) query문

: return $this->db->query('SELECT * FROM topic')->result();

  • $this->db : 현재 우리가 설정한 db에 접속할 수 있는 인스턴스

  • query() API : ()안에 작성된 query문을 이용해서 결과값을 어떤 방식으로(result())로 보여줄지 결정하는 것. result() 결과값은 객체의 형태로 담겨져 있다.

  • result() 또는 result_array() : 배열객체와 연관배열의 차이 (선택적 사용)


방법 2) Active record

: return $this->db->get_where('테이블명', array('담고싶은필드명' => '담고 싶은 필드명을 저장할 변수')->result() 또는 row() ... ;


  • return $this->db->get_where('topic', array('id'=>$topic_id))->row();
    ( == return $this->db->query('SELECT * FROM topic WHERE id='$topic_id'')->result(); )

  • row(): get을 통해서 (where 조건에 의해) 단 한 건의 데이터를 가져올 때 사용.


* 일반적으로 방법2를 많이 씀. why?


각각의 DB 서비스들은 표준 sql문을 공통으로 사용하기 때문에 이식성( 다른 데이터베이스로 넘어r가는 것. )이 좋기 때문.



 



코드이그나이터에서 파일 다루기



1. html,css,js,image 등 개발자 작성 파일

일반적 : 루트디렉토리(코드이그나이터가 설치된 위치) 아래 특정 폴더(디렉토리)생성 > 그 아래 img, js, css 등 언어에 따른 폴더 생성


2. 사용자가 업로드 한 파일.



* 부트스트랩과 같은 라이브러리는 1번에서 루트디렉토리 아래 생성한 폴더에서 > lib라는 폴더 생성후, 그 곳에 설치.


'Language > PHP' 카테고리의 다른 글

[CodeIgniter] 로그  (0) 2017.08.19
[CodeIgniter] 설정  (0) 2017.08.19
[CodeIgniter] Helper  (0) 2017.08.18
[CodeIgniter] URI Routing  (0) 2017.08.17
CodeIgniter (코드이그나이터)  (0) 2017.08.17