[mvc]간단한 php mvc 만들기 3

이 강좌의 앞 두 글에서 mvc의 기본 구현방법과 데이터베이스에 연결하여 데이터를 표시하는 방법에 대해 살펴보았다. 이제 마지막으로 데이터를 저장하고, 수정, 삭제하는 코드를 추가해보자. 주요 코드에 대한 설명은 이미 앞 두 강좌에서 했으므로 여기서는 변경되고 추가된 부분만 설명할 것이다.

● application\views\board\index.php 수정

board 관련 링크들이 모두 리스트 페이지(index)에 표시되어야 하므로 리스트 페이지를 수정한다. edit 링크와 delete 링크를 추가하고, 글쓰기 버튼은 이미 있었으므로 그대로 활용한다. 그리고 delete 버튼은 직접 링크로 처리하기 보다는 자바스크립트 함수로 만들어 확인후 링크로 이동하도록 처리하였다. 사실 write나 delete, edit 같은 기능은 경우에 따라서는 보안을 요하는 부분이므로 로그인 관련 코드들이 추가되거나 외부의 주소 입력에 의한 접근을 차단하기 위해 delete의 경우에도 post로 값을 넘기거나 해야 하지만 여기서는 그런 과정을 생략하고 간단히 처리하였다.

아래 코드는 board의 리스트 페이지의 view 파일인 index.php 파일을 수정한 코드이다. 이 파일의 위치는 application\views\board 폴더이다.

이렇게 수정한 화면은 다음과 같다.

게시판 목록

게시판 목록

● application\controller\board.php 수정

글 쓰기가 가능혀려면 폼의 내용을 전송받을 링크가 있어야 한다. 이 예제는 mvc를 위한 것이므로 board 콘트롤러에 폼을 전송받을 메서드가 있어야 한다. 즉 127.0.0.1/board/add 와 같은 주소로 값을 전송하려면 콘트롤러에 add 메서드가 있어야 한다는 것이다. 이런 식으로 글 추가, 수정, 삭제 관련 메스드들을 추가하였다. 다음은 수정된 board 콘트롤러 board.php 파일의 내용이다.

# board controller 전체 수정 코드

위에서 보면 add, edit, update, del 세 개의 메서드가 추가되었다. 각각에 대해 살펴보자.

# add() 메서드

이 메서드는 write.php 파일의 폼에서 내용을 입력하고 전송 버튼을 눌렀을 때 값을 전달받을 페이지 역할을 한다. 즉 write.php의 폼에서 action 속성의 값을 127.0.0.1/board/add 와 같이 해주면 이 메서드가 값을 전달 받게 된다.

이 부분은 뒤에 view 파일인 write.php를 수정하여 submit 버튼의 name을 submit_insert_board 로 하고, 전송 버튼을 눌렀을 대 submit_insert_board가 전송되었는지를 확인하고 참이면 그 안의 코드를 실행하는 것이다. 이렇게 함으로써 폼의 submit 버튼이 클릭되었을 때만 db 관련 작업을 하도록 할 수 있다.

그리고 BoardModel 클래스를 생성한 후 모델의 addBoard 메서드를 호출하는 다음 코드가 이어진다.

addBoard 메서드를 호출 할 때 세 개의 값을 파라미터로 넘겨주는데 폼으로 부터 전송받은 title, content, writer 의 값들이다.

나중에 boardmodel.php 파일을 수정할 때 addBoard 메서드를 추가하고 위 세 개의 값을 받아 실제 데이터베이스에 추가(insert)해주도록 코딩을 하면 된다.

그리고 위 코드는 게시물 추가 작업 후에 board/index 페이지로 이동하도록 처리한다.

# edit() 메서드

이 메서드는 글을 수정하기 위한 페이지를 표시하는 메서드이다. 글 목록에 edit 링크가 있는데 이 링크는 127.0.0.1/board/edit/3 과 같은 url로 연결해준다. 그러면 이 edit 메서드가 호출되면 파라미터로 $idx를 받아들인다.

코드 안에서는 역시 board 모델을 불러 객체를 생성하고, view 파일인 edit.php를 실행하도록 추가 되어 있다.

이 코드는 $board_data 에 getBoardView 메서드를 호출하여 얻어온 게시물의 정보를 배열로 저장한다. 그런데 getBoardView는 이미 글 보기 메서드에서도 사용한 적이 있다. 수정하기 위하여 데이터를 얻어오는 것이나 보기 위하여 얻어오는 것이나 전혀 다를 것이 없으므로 재활용한 경우이다.

$board_data는 지정된 레코드(줄)의 모든 데이터 값을 저장한 배열인데 이 배열은 edit.php 에서 사용할 수 있다.

# update 메서드

이 메서드는 edit 메서드에서 실행한 edit.php 파일의 수정 폼에서 수정된 값을 전송할 위치(action)가 된다. 즉 edit.php 파일에서 action의 값을 127.0.0.1/board/update로 하면 이 메서드가 호출되는 것이다. 역시 post로 넘어온 값을 받아 board 모델의 updateBoard 메서드 호출한다. $idx 값을 추가로 넘겨주는 것은 실제 db에 update를 처리할 때 고유키가 되는 idx 칼럼의 값을 조건으로 처리해야 하기 때문이다.

# del 메서드

이 메서드는 글을 삭제할 때 호출되는 메서드이다.

글번호 $idx를 파라미터로 받아들이고, board 모델의 deleteBoard 메서드를 호출한 후 목록 페이지로 돌아가도록 코딩되어 있다.

이렇게 해서 콘트롤러 board.php 파일에 추가된 내용을 알아보았다.

● view 파일들을 수정 및 추가

# application\views\board\write.php

이 파일은 글 쓰기 폼이 표시되는 페이지를 구성한다. 콘트롤러의 변경에 따라 일부 변경하여 아래와 같이 수정해보자.

크게 바뀐 것은 없지만 <form>문의 내용이 조금 변경되었다.

이렇게 함으로써 입력된 데이터를 전송할 주소를 127.0.0.1/board/add 로 설정하고 전송방식도 POST로 하였다.

그리고 위와 같이 이전에 일반 버튼이었던 것을 submit 버튼으로 만들어 추가하였다. submit 버튼의 name이 submit_insert_board 인 것을 앞의 board 콘트롤러 코드에서 활용했던 것을 기억하자.

# application\views\board\edit.php

이 파일은 전에 없던 것을 새로 추가하는 것이다. write와 거의 같다. value에 값이 입력되도록 한 것과 $idx를 hidden 으로 추가해 준 것 정도가 차이점이다.

목록에서 [edit]를 클릭하면 아래와 같이 화면이 표시된다. 물론 model까지 모두 수정했을 때 정상 작동하므로 여기서는 미리 보여주는 것이다.

글 수정하기

글 수정하기

 

● model 파일 수정

# application\models\boardmodel.php

이제 실제 데이터를 저장하거나 업데이트 삭제처리를 위해 model 파일을 수정해보자. 이전에 만들어 두었던 boardmodel.php 파일에 세 개의 메서드를 추가할 것인데, 새로운 데이터를 추가하는 addBoard, 기존 데이터를 수정하는 updateBoard, 선택한 레코드를 삭제하는 deleteBoard 메서드이다. 이 메서드들은 모두 콘트롤러(\application\controller\board.php)에서 호출되어 실행되는 것들이다.

각각의 메서드들을 살펴보자.

# addBoard 메서드

이 메서드는 세 개의 값을 받아온다. 이 값을 이 메서드에 넘긴 것은 콘트롤러의 add 메서드이다. 이 메서드 안의 처음 세 줄은 입력받은 값들로부터 html 코드들을 제거해주기 위해 strip_tags를 사용했다. 이런 부분은 개발자가 환경에 맞게 사용하면 된다. 예를 들어 태그를 제거하지 않고 특수문자로 변환하거나 문자로 입력된 값이라도 강제로 정수로 변환한다거나 하는 등등의 작업은 개발자가 결정할 문제이다.

특이한 것은 다음 부분이다.

레코드 추가를 위한 INSERT 쿼리(Query)문인데 VALUES 부분에 실제 $title, $content, $writer 등과 같이 받아온 변수를 쓰지 않고 :title, :content, :writer, :wdate 를 사용했다. 이들은 변수도 상수도 아니고 실제 값도 아니다. 이런 것들을 placeholder라고 하는데 나중에 값을 넣기 위해 우선 빈 공간을 만들어 둔 것이라고 할 수 있다. 이렇게 하면 쿼리문을 조금 간단하게 할 수도 있고 데이터를 보다 안전하게 처리할 수 있는 장점이 있다. 이 placeholder는 나중에 쿼리문을 실행할 때 다음 코드처럼 배열로 입력된 값들로 순서대로 값을 치환하여 처리한다.

물론 위의 코드가 복잡하다면 다음과 같이 placeholder를 사용하지 않고도 쿼리문에 데이터를 직접 입력할 수도 있을 것이다.

 

# updateBoard 메서드

이 메서드도 addBoard 메서드와 거의 같다. 입력받은 값들을 변환하고 UPDATE 구분을 만들고 placeholder와 실제 값들을 치환하여 쿼리문을 실행함으로써 업데이트를 처리하는 것이다.

 

# deleteBoard 메서드

이 메서드는 선택된 레코드를 삭제하는 부분이다. 레코드를 삭제하는데는 다른 데이터가 필요하지 않으므로 $idx 만을 변수로 받아 DELETE 구분을 생성하고 이를 실행한다. 실제 완성된 프로그램이라면 삭제 부분에 보다 복잡한 인증작업이 이루어져 있어야 할 것이다. 로그인 되어 있는지, 권한은 있는지 등등이다. 여기서는 인증관련 코드가 없으니 생략하였다.

 

● 맺음말

지금까지 세 차례에 거쳐서 “간단한 php mvc 만들기”를 알아보았다. 지나치게 간단하여서 보통 웹 어플리케이션들이 갖춰야 할 요소들을 상당히 생략하였지만 mvc에 대해 조금이라도 이해하는데 도움이 되었다면 기쁠 것이다.

이 마지막 예제의 소스코드 다운로드와 온라인 데모 링크가 아래에 있다.

소스 파일 다운로드 : php-mvc-simple-htdocs-3.zip
온라인 데모 페이지 : http://webskills.kr/php-mvc/v3/

php mvc를 현장에서 활용하려면 직접 만드는 것도 좋지만 이미 훌륭하게 만들어져 무료로 배포되고 있는 open source framework들을 활용하는 것도 좋은 방법이다. 실제로 많은 개발자들이 이런 프레임워크를 사용하고 있다. 몇 가지 소개하면 다음과 같다.

CodeIgniter : http://ellislab.com/codeigniter
CakePHP : http://cakephp.org/
Yii : http://www.yiiframework.com/
FuelPHP : http://fuelphp.com/
Laravel : http://laravel.com/
Symfony : http://symfony.com/
Kohana : http://kohanaframework.org/

그리고 Zend Framework도 이에 해당한다.

프레임워크 관련 여러 리뷰들을 살펴보고 자신에 맞는 mvc 프레임워크를 찾아 활용해보는 것도 좋을 것이다.

 

Share the joy
  •  
  •  
  •  
  •  

One thought on “[mvc]간단한 php mvc 만들기 3

댓글 남기기