본문 바로가기
개발/PHP

MVC모델을 적용한 블로그(게시판) 만들기 - 5. 글 저장 구현하기

by 똘똘이박사 2018. 7. 3.

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



5. '글 저장' 구현하기


게시판의 목록을 만들었는데 저장된 글이 없어 아무 내용도 출력되지 않았습니다.

이제 글을 저장해 게시판의 목록이 제대로 나오는지 확인할 차례 입니다.


이전 포스팅에서 글 쓰기 버튼 부분을 잠시 되돌아 보겠습니다.


application/views/board/index.php 의 일부


<a href="/board/writeView"> 글쓰기 </a>


글쓰기 역시 모든 요청이 Front Controller로 모이고 그 곳에서 분기 할 수 있도록 URL을 작성하였습니다.


현재까지 글쓰기 부분은 데이터베이스에 연결하여 어떤 처리도 하지 않을 것이므로 model 부분과 관련하여 수정할 사항은 없습니다.

따라서, controller 에서는 model을 호출하지 않고

바로 글쓰기와 관련된 view를 호출하면 됩니다.


application/controllers/BoardController.php 에 추가 되는 부분


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

    {

        require_once 'application/views/board/write.php';

    }




write.php - 글 등록 화면


이제 글을 써서 등록 할 수 있는 화면을 만들어 봅니다.

간단하게 제목과 내용을 등록 할 수 있도록 만들었습니다.

(카테고리 선택 등과 같은 추가적인 기능은 나중에 기능 추가 포스팅에서 진행하도록 할 예정입니다.)


application/views/board/write.php



    <h1>글쓰기</h1>

    <form action="/board/insertBoard" method="POST">

        <p>글제목 : <input type="text" name="title" id="title" style="width:300px;"></p>

        <p>글내용 : </p>


        <P><textarea class="content" name="content" style="width:500px;height:200px"></textarea></P>


        <p><input type="submit" name="submit_insert_board" value="저장하기"> <button onclick="location.href='/board/index/story'">목록으로</button></p>

    </form>


'저장하기 버튼을 누르면 

데이터가 넘어 가는 곳은 /의 index.php 입니다.

여기서 application.php 를 통해 사용자의 요청이

'board' 에 'insertBoard' 라는 것을 구분 하게 됩니다.

즉, 'board' 라는 Class(controller) 를 호출하고 그 안에 'insertBoard' 라는 method를 호출 하겠다는 것입니다.



글쓰기(등록)의 흐름은 


 1. 글 작성 화면(view) 에서 '저장하기' 버튼을 클릭 하면

 2. Controller 에서 해당 글 등록에 해당하는 method (insertBoard())를 호출합니다.

 3. 글 등록 method(insertBoard) 는 DB에 글을 저장하기 위해 관련된 Model 을 호출 합니다.

 4. 글 등록 model의 method(insertBoard) 는 넘어온 입력된 내용을 데이터베이스에 저장하고

 5. 다시 리스트 화면 (board 의 index.php) 을 호출 합니다.

 6. 리스트 화면에서는 다시 목록을 조회에 화면을 출력합니다.


편의상 글 등록과 관련된 controller 와 model의 모든 메소드 명을 insert 로 작성하였습니다.



BoardController.php 의 수정


화면도 만들었고, 프로그램의 흐름이 어떻게 흘러가야 할지도 파악되었습니다.

이제 이 내용을 구현할 차례 입니다.


먼저 BoardController 에 insertBoard 라는 method를 추가해 봅니다.


application/controllers/BoardController.php 에 추가 되는 부분



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

    {


        $model = new \application\models\BoardModel();


        if (isset($_POST["submit_insert_board"])) {

            $model->insertBoard($_POST["title"], $_POST["content"]);

        }


        header('location:/board/index/');

    }



BoardController의 insertMethod에서는 글쓰기에서 넘어 오는 받아 model 로 전달합니다.

BoardModel의 insertBoard method 를 호출합니다.

데이터를 저장하는 것이기 때문에 별도의 반환값은 없습니다.


데이터 저장이 완료되면 다시 게시판의 목록으로 이동하도록 하였습니다.


게시판은 운영하는 방식에 따라 동작 하는 방식을 다양하게 만들 수 있습니다.

게시글을 작성하였다고 해서 무조건 목록 화면으로 돌아갈 필요는 없습니다.

어떤 서비스에서는 게시글 작성 후 자신의 글을 확인 할 수 있도록, '게시글 보기' 화면으로 넘어가는 경우도 있습니다.



BoardModel.php 의 수정


BoardModel 에서는 insert문을 사용해 데이터를 저장합니다.


application/models/BoardModel.php 에 내용 추가


public function insertBoard($title, $content)

    {

        try{

            $sql = 'INSERT INTO board (title, content, reg_date, edit_date)

                    VALUES (:title, :content, :reg_date, :edit_date)';

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

            $stmt->bindValue(':title', $title, PDO::PARAM_STR);

            $stmt->bindValue(':content', $content, PDO::PARAM_STR);

            $stmt->bindValue(':reg_date', date("Y-m-d H:i:s"), PDO::PARAM_STR);

            $stmt->bindValue(':edit_date', date("Y-m-d H:i:s"), PDO::PARAM_STR);

            $stmt->execute();

        } catch (Exception $e){

            var_dump('글 등록 중 에러 발생 : '. $e->getMessage());

        }

    }


저장해야 할 데이터는 PDO의 플레이스홀더 방식을 따랐습니다.

이 방식을 이용하면 sql injection 같은 해킹을 미연에 방지할 수 있습니다.


이제 데이터를 저장을 테스트 해봅시다.


글쓰기 화면에서 아래와 같이 간단한 메시지를 입력해 보았습니다.


이제 '저장하기' 버튼을 클릭하면 목록 글이 저장되며 목록 페이지로 넘어갈 것입니다.


글을 여러 번 입력해 보았습니다.


여러분도 잘 동작하고 있나요??


(여기에 사용된 모든 소스 코드는 곧 깃허브에 정리해서 올리도록 하겠습니다.)


  • 혹시 더 나은 방식으로 개선 할 수 있거나, 오류가 발생하는 부분이 있다면 댓글을 남겨 주시기 바랍니다.
  • 해당 소스나 포스팅을 공유 하실 때에는 꼭 출처를 남겨 주시기 바랍니다.


반응형