글쓰기와 수정은 기본적으로 동일하다.

차이가 있다면 사용자 입력 폼을 호출할 때,

글쓰기는 빈 입력 상자들만 출력하고,

글 수정은 지정된 글번호에 대한 데이터를 조회하여

입력상자들의 초기값으로 지정하여 출력한다.


저장 처리에 있어서는 SQL문만 다를 뿐 동일하다.

즉, 폼에서는 글번호 값이 있으면 데이터를 가져오는 서비스를 호출하고

없으면 그냥 JSP파일을 호출한다.

JSP에서는 값이 없으면 텍스트 박스에 빈 값이 들어가기 때문에 새 글을 입력하게 된다.

따라서 글쓰기 컨트롤(boardForm)에

글수정 컨트롤(boardUpdate) 내용을 복사해서 다음과 같이 넣어주면 된다.

두 컨트롤을 합쳐서 글 번호(brdno) 값이 있으면 해당 데이터를 불러와서 수정으로,

없으면(null)  그냥 입력 폼을 호출하게 된다.

public String boardForm(HttpServletRequest request, ModelMap modelMap) throws Exception {
        String brdno = request.getParameter("brdno");
        if (brdno!=null) {
            boardVO boardInfo = boardSvc.selectBoardOne(brdno);
             modelMap.addAttribute("boardInfo", boardInfo);
        }
       
        return "board2/boardForm";
}

board2Ctr.java

JSP 파일은 글 수정 파일(boardUpdate.jsp)의 내용을 글쓰기(boardUpdate.jsp)에 넣어준다.

글 수정과 관련된 컨트롤과 jsp 파일은 삭제 한다.


저장 컨트롤에서도 Insert와 Update를 글번호 값(brdno) 존재 여부에 따라

다음 코드와 같이 각각 필요한 것을 호출해 준다.

public String boardSave(@ModelAttribute boardVO boardInfo) throws Exception {
       
        if (boardInfo.getBrdno()==null)
               boardSvc.insertBoard(boardInfo);
        else boardSvc.updateBoard(boardInfo);

        return "redirect:/board2List";
}

board2Ctr.java

여기에서는 두 개의 서비스를 호출했는데

if문을 서비스(board2Svc.java)에 넣어서 처리하는 것이 보다 효율적일 수 있다.

하나의 서비스에서 다른 2개의 SQL문을 상황에 따라 호출하는 것이 더 좋을 것이다.

직접 해보길 바란다.


다음과 같이 boardForm.jsp의 폼(form) 테그 method를 Post로 지정하는 것이 좋다.

<form name="form1" action="board2Save" method="post">

별도의 지정이 없는 경우 GET 이 기본(METHOD="GET")으로 지정된다.

GET 방식은 다음과 같이 URL 뒤에 변수이름과 값이 전송되는 형태이다.

http://localhost/board1/board1List?searchType=brdname&searchKeyword=홍

호출되는 URL의 물음표(?)뒤에 변수명과 값이 이퀄(=)로 구분되고, 

다수의 변수는 &로 구분되어 전송된다.

예에서는 searchType와 searchKeyword 두개의 변수가 사용되었다.


POST 방식은 지정된 방식에 의해 인코딩한 다음 서버로 전송되는 것으로

브라우저의 주소 입력란에 내용이 나타나지 않는다. 

일정한 크기 이상의 데이터를 전송할 때, 

GET은 내용이 잘릴 수 있지만 POST 방식은 모두 전송되기 때문에 

사용자가 입력하는 게시물 내용이나 첨부 파일 같이 전송되는 데이터가 많을 경우 POST방식을 사용한다.




'Java > 게시판 2' 카테고리의 다른 글

1. 게시판 확장 - 준비  (0) 2016.03.28
3. 게시판 확장 - 조회수  (5) 2016.03.28
4. 게시판 확장 - 삭제에서 숨기기로  (0) 2016.03.28
5. 게시판 확장 - 페이징  (10) 2016.03.20

조회수(BRDHIT)는 사용자가 글을 읽은 회수를 의미하며,

구현은 글 읽기가 호출되면 해당 글의 조회수를 1씩 증가(BRDHIT = BRDHIT + 1)시켜서 구현한다.

그리고, 리스트에서 그 값을 볼 수 있게 해주면 된다.




먼저, 조회수를 증가 시켜주는 다음과 같은 SQL문과 서비스를 작성한다(board2Svc.java).

<update id="updateBoard2Read" parameterType="String">
        UPDATE TBL_BOARD
              SET BRDHIT = BRDHIT + 1
         WHERE BRDNO=#{brdno}
</update>

Board2.xml

public void updateBoard2Read(String param) throws Exception {
    sqlSession.update("updateBoard2Read", param);
}

board2Svc.java

이 서비스(SQL)를 아래와 같이 글 읽기 컨트롤에서 호출하면 된다.

@RequestMapping(value = "/board2Read")
public String boardSave(HttpServletRequest request, ModelMap modelMap) throws Exception {
    String brdno = request.getParameter("brdno");
       
    boardSvc.updateBoard2Read(brdno);
    boardVO boardInfo = boardSvc.selectBoardOne(brdno);
    modelMap.addAttribute("boardInfo", boardInfo);
       
    return "board2/boardRead";
}

board2Ctr.java

이렇게 하여 사용자가 글을 읽을 때 마다 조회수를 증가시키게 된다.

이렇게 하여 증가된 조회수는 리스트에 다음의 코드를 추가하여 볼 수 있다.

즉 SELECT문으로 조회수(BRDHIT) 값을 가져오고,

<select id="selectBoard2List" resultType="gu.board2.boardVO" parameterType="gu.common.PageVO">
    SELECT BRDNO, BRDTITLE, BRDWRITER, DATE_FORMAT(BRDDATE,'%Y-%m-%d') BRDDATE, BRDHIT
      FROM TBL_BOARD
     WHERE BRDDELETEFLAG='N'
     ORDER BY BRDNO DESC
</select>

board2.xml

사용자에게 보여 주는 JSP에서 다음과 같이 출력하면 된다.

<thead>

                                <tr>

                                          <th>번호</th>

                                          <th>제목</th>

                                          <th>등록자</th>

                                          <th>등록일</th>

                                          <th>조회수</th>

                                </tr>

                     </thead>

                     <tbody>

                                <c:forEach var="listview" items="${listview}" varStatus="status">      

                                          <c:url var="link" value="board2Read">

                                                     <c:param name="brdno" value="${listview.brdno}" />

                                          </c:url>           

                                          <tr>

                                                     <td><c:out value="${listview.brdno}"/></td>

                                                     <td><a href="${link}"><c:out value="${listview.brdtitle}"/></a></td>

                                                     <td><c:out value="${listview.brdwriter}"/></td>

                                                     <td><c:out value="${listview.brddate}"/></td>

                                                     <td><c:out value="${listview.brdhit}"/></td>

                                          </tr>

                                </c:forEach>

                     </tbody>

boardList.jsp

이상의 과정으로 조회수 기능 추가는 끝인데, 이렇게만 두면 오작동할 수 있다.

다음과 같이 글 작성(Inset)시 추가한 두 개의 필드에 대한 값을 처리해 줘야 한다.

즉, 처음 쓰는 글이니 조회수는 0, 삭제되지 않았으니 N(no)을 넣어 준다.

테이블 생성시 Default 값으로 처리하는 것이 편하지만,

개인적으로 직관적인 것을 선호해서 Default처리를 잘 하지 않는다.

<insert id="insertBoard2" parameterType="gu.board2.boardVO" >
        INSERT INTO TBL_BOARD(BRDTITLE, BRDWRITER, BRDMEMO, BRDDATE, BRDHIT, BRDDELETEFLAG)
    VALUES (#{brdtitle}, #{brdwriter}, #{brdmemo}, NOW(), 0, 'N' )
</insert>

좀 더 나은 조회수 처리는 중복 데이터 방지일 것이다.

즉, 동일한 사람이 두 번 이상 읽은 경우 한번으로 처리하는 것이다.

별도의 테이블을 이용하여 해당 글을 읽은 사람의 이름(ID)를 저장하면 된다.

이 기능은 사용자 ID가 필요한데

본 예제에서는 사용자 관련 기능을 다루지 않기 때문에 구현하지 않는다.

각자 구현해 본다면 실력 향상에 도움이 될 것이다.







데이터 베이스에 저장된 데이터는 삭제 하지 않는 것이 좋다.

차후에 발생하는 여러 가지 문제를 막기 위해 실제로는 삭제하지 않고 개발한다.

즉, 실제로는 삭제하지 않고 삭제한 것처럼 사용한다는 의미로,

삭제 여부를 확인하는 필드(BRDDELETEFLAG)를 추가하여

삭제이면 안 보이게 처리하는 방식을 사용한다.

구현 방법은 다음과 같이 Delete문을 update문으로 수정하면 된다.

즉 삭제 필드(BRDDELETEFLAG)가 N이면 사용, Y이면 삭제가 되는 것이다.

<delete id="deleteBoard2One" parameterType="String">
        UPDATE TBL_BOARD
              SET BRDDELETEFLAG='Y'
         WHERE BRDNO=#{brdno}
</delete>

Board2.xml

데이터를 이용하는 SQL문도 다음과 같이 수정해 줘야 한다.

리스트의 경우 데이터를 가져올 때

삭제 되지 않은 데이터(WHERE BRDDELETEFLAG='N')만 가져오도록 수정한다.

<select id="selectBoard2List" resultType="gu.board2.boardVO" >
        SELECT BRDNO, BRDTITLE, BRDWRITER, DATE_FORMAT(BRDDATE,'%Y-%m-%d') BRDDATE, BRDHIT
          FROM TBL_BOARD
         WHERE BRDDELETEFLAG='N'
</select>

~~ 생략 ~~
   
<update id="updateBoard2" parameterType="gu.board2.boardVO">
        UPDATE TBL_BOARD
              SET BRDTITLE=#{brdtitle}
                   , BRDWRITER=#{brdwriter}
                   , BRDMEMO=#{brdmemo}
         WHERE BRDDELETEFLAG='N'
              AND BRDNO=#{brdno}
</update>
       
<select id="selectBoard2One" parameterType="String" resultType="gu.board2.boardVO">
        SELECT BRDNO, BRDTITLE, BRDWRITER, BRDMEMO, DATE_FORMAT(BRDDATE,'%Y-%m-%d') BRDDATE
           FROM TBL_BOARD
         WHERE BRDDELETEFLAG='N'
              AND BRDNO=#{brdno}
</select>


Board2.xml

글수정과 글읽기에서도 BRDDELETEFLAG 조건을 사용해야 한다.

이상의 SQL문에서

사용자가 글을 수정하고 저장(updateBoard2) 할 때

조건절에 BRDDELETEFLAG을 사용하였다.

글 읽기에서 데이터를 가져오는 SQL(selectBoard2One)에도

조건절에서 BRDDELETEFLAG을 사용하였다.

간단하게 생각하면 리스트에서 안보이니

굳이 여기에서 처리할 필요가 없을 것 같지만

북마크 하고, 시간이 지난 뒤 다시 찾아올 수 있다.

즉 주소를 직접 입력해서 접근할 수 있고,

이때, 삭제된 데이터는 수정하거나 읽을 수 없게 해야 한다.

여기에서는 구현하지 않았지만

삭제된 데이터라는 메시지를 준다면 더욱 좋을 것이다.


'Java > 게시판 2' 카테고리의 다른 글

1. 게시판 확장 - 준비  (0) 2016.03.28
2. 게시판 확장 - 글쓰기와 수정을 하나로  (0) 2016.03.28
3. 게시판 확장 - 조회수  (5) 2016.03.28
5. 게시판 확장 - 페이징  (10) 2016.03.20

+ Recent posts