멀티 게시판은 말 그대로 게시판이 많다는 의미로,

비슷하게 생기고 비슷한 기능을 가진

공지사항, 일반 게시판, FAQ, 커뮤니티 등을 하나의 게시판으로 구현하는 것이다.

또는 토론 주제별로 게시판을 만들어 사용할 수도 있다.

멀티 게시판이 적용된 게시판은

화면은 리스트, 글읽기, 글쓰기/수정 등의 화면이 공통으로 사용되고,

기능도 유사하기 때문에 쉽게 구현할 수 있다.

게시물을 구별할 수 있는 구별자만 있으면 된다.

즉, 게시물을 구별할 수 있는 필드를 추가해주고

다음 그림과 같이 이 필드의 값을 항상 가지고 다니면 된다.

이러한 구분 필드를 여기에서는 게시판 그룹 번호(bgno)라고 명명했다.



- 글 리스트는 그룹 번호(bgno)에 해당하는 내용들만 조회해서 출력하고,
  읽기/쓰기로 넘어갈 때 그룹 번호(bgno)를 넘겨 준다.

- 글 읽기는 게시물 번호(brdno)에 해당하는 글을 조회해서 출력하고,
  그룹 번호는 전달(게시물 삭제/수정)을 위해서 가지고 있는다.

- 글 쓰기/수정은 그룹 번호 필드를 추가해서 저장하고, 그룹 번호를 가지고 글 리스트로 돌아간다.

- 글 삭제는 게시물 번호에 해당하는 글을 지우고, 그룹 번호를 가지고 글 리스트로 돌아간다.

이상의 내용을 통해 다시 강조하면

링크를 통해 움직일 때

항상 그룹 번호(bgno)를 넘겨주거나 넘겨주기 위해 가지고 있어야 한다.

따라서, 그룹 번호만 신경 쓰면 되기 때문에 매우 간단하게 개발할 수 있다.


프로그램을 작성하기 전에 다음 SQL문을 이용하여

그룹 번호(bgno)를 테이블(tbl_board)에 추가한 뒤 1로 채워준다.

기존 게시판 데이터는 모두 1로 저장하겠다는 의미이다.

             ALTER TABLE TBL_BOARD ADD BGNO INTEGER;

    UPDATE TBL_BOARD SET BGNO = 1;


BoardVO클래스에도 다음과 같이 그룹 번호(bgno) 변수를 추가한다.

public class BoardVO {

    private String bgno;
    private String brdno;
    private String brdtitle;

~~ 생략 ~~
    public String getBgno() {
        return bgno;
    }

    public void setBgno(String bgno) {
        this.bgno = bgno;
    }
~~ 생략 ~~

BoardVO.java



'Java > 게시판 8: 멀티게시판' 카테고리의 다른 글

2. 글 리스트  (0) 2016.06.04
3. 글 읽기 / 삭제  (0) 2016.06.04
4. 글 쓰기/수정  (0) 2016.06.04

기본적으로 글 리스트는 그룹 번호(bgno)에 해당하는 내용들만 조회하면 된다.

따라서 다음 코드와 같이 기존 SELECT문의 WHERE절에 조건 하나만 추가해 주면 된다.

<sql id=”includeBoard”>
     WHERE BGNO=#{bgno} AND BRDDELETEFLAG='N'
     <if test="searchKeyword!=null and searchKeyword!='' and searchType!=''">
          <foreach item="item" index="index" collection="searchTypeArr" separator=" OR " open="AND (" close=")">
             ${item} LIKE CONCAT('%', #{searchKeyword},'%' )
          </foreach>
    </if>              
</sql>

board8.xml

이렇게 수정한 후 웹 브라우저에서 다음과 같이 실행하면 결과를 확인할 수 있다.

http://localhost:8080/board/board8List?bgno=1

파라미터인 그룹 번호(bgno)를 1이 아닌 다른 값을 넣어서 실행해 보면

데이터가 유무에 따라 다른 결과를 얻는 것을 확인할 수 있다.


이 외에 그룹 번호(bgno) 값이 없을 때 처리와

글 읽기/쓰기 시 그룹 번호(bgno)값을 넘겨 주는 코드가 필요하다.

다음 코드와 같이 컨트롤에서

그룹 번호가 없는 경우(null) 1을 기본값으로 넣어줬다.

    @RequestMapping(value = "/board8List")
    public String boardList(SearchVO searchVO, ModelMap modelMap) {

       
        if (searchVO.getBgno() == null) {
            searchVO.setBgno("1");
        }
        searchVO.pageCalculate( boardSvc.selectBoardCount(searchVO) ); // startRow, endRow

        List<?> listview  = boardSvc.selectBoardList(searchVO);
       
        modelMap.addAttribute("listview", listview);
        modelMap.addAttribute("searchVO", searchVO);
       
        return "board8/BoardList";
    }

Board8Ctr.java

간단하게 처리하기 위해 이렇게 처리했을 뿐이고,

이 방식 외에도 없는 그룹 번호일 경우 오류 메시지를 출력할 수도 있다.

글쓰기 링크에 다음과 같이 그룹번호(bgno)를 파라미터로 넘겨주는 코드를 추가한다.

<a href="board8Form?bgno=<c:out value="${searchVO.bgno}"/>">글쓰기</a>

BoardList.jsp


개념상 글 리스트에서 글 읽기로 가는 링크에도

파라미터를 추가해 주는 것이 맞지만 구현하지 않았다.

모든 게시물은 그룹번호(bgno)를 가지고 저장되고

글 읽기용 SELECT문(selectBoard8One)에서

그룹번호를 가지고 오도록 처리했기 때문이다.


'Java > 게시판 8: 멀티게시판' 카테고리의 다른 글

1. 멀티 게시판 준비  (0) 2016.06.04
3. 글 읽기 / 삭제  (0) 2016.06.04
4. 글 쓰기/수정  (0) 2016.06.04

글 읽기는 게시물 번호(brdno)에 해당하는 글을 조회해서 출력하는 기능을 하는데,

그룹번호(bgno)별로 게시물 번호(brdno)를 따로 부여하는 것이 아니라서

파라미터로 받은 게시물만 조회해서 보여주면 된다.

다만, 앞서 언급한 바와 같이 그룹번호(bgno)를 파라미터로 받지 않고

데이터를 조회할 때(selectBoard8One) 그룹번호를 가지고 오도록 처리했다.

<select id="selectBoard8One" parameterType="String" resultType="gu.board8.BoardVO">
        SELECT BGNO, BRDNO, BRDTITLE, BRDWRITER, BRDMEMO, DATE_FORMAT(BRDDATE,'%Y-%m-%d') BRDDATE
          FROM TBL_BOARD
         WHERE BRDDELETEFLAG='N'
           AND BRDNO=#{brdno}
</select>

board8.xml

JSP 파일에서 게시판 기능과 관련된 돌아가기/삭제 링크에

다음과 같이 URL 파라미터로 그룹번호를 추가해 준다.

글 수정에 그룹번호를 지정하지 않는 것은

글 읽기와 마찬가지로 수정 데이터를 조회할 때 그룹번호를 같이 가지고 오기 때문이다.

<a href="board8List?bgno=<c:out value="${boardInfo.bgno}"/>">돌아가기</a>
<a href="board8Delete?bgno=<c:out value="${boardInfo.bgno}"/>&brdno=<c:out value="${boardInfo.brdno}"/>">삭제</a>
<a href="board8Form?brdno=<c:out value="${boardInfo.brdno}"/>">수정</a>

BoardRead.jsp


마지막으로

댓글 관련 기능에도 그룹번호(bgno)를 전달해야 할 것 같지만 필요하지 않다.


첫 번째 이유는 댓글은 게시 글 번호(brdno)을 대상으로 생성하기 때문이다.

해당 글 번호에 대하여 리스트를 조회하고 쓰기/수정/삭제가 이루어 진다.


두 번째 이유는 글 읽기(Board8Read)를 호출할 때

그룹번호가 없어도 되도록 구성했기 때문이다.

댓글 저장 후 다시 게시 글 읽기로 돌아올 때

게시 글 번호만 있어도 되기 때문이다.

더욱이 Ajax를 사용해 서버로 게시 글 번호와 필요 정보만 전송하면 된다.


글 삭제는 게시물 번호(brdno)에 해당하는 글을 지우고,

글 읽기에서 받은(getParameter) 그룹 번호를 가지고 글 리스트로 돌아간다(redirect).

    @RequestMapping(value = "/board8Delete")
    public String boardDelete(HttpServletRequest request) {

        String brdno = request.getParameter("brdno");
        String bgno = request.getParameter("bgno");
       
        boardSvc.deleteBoardOne(brdno);
       
        return "redirect:/board8List?bgno=" + bgno;
    }

Board8Ctr.java


'Java > 게시판 8: 멀티게시판' 카테고리의 다른 글

1. 멀티 게시판 준비  (0) 2016.06.04
2. 글 리스트  (0) 2016.06.04
4. 글 쓰기/수정  (0) 2016.06.04

글 쓰기는 리스트에서 넘겨 받은 그룹 번호(bgno)를 hidden 태그로 가지고 있다가,

서버로 전송 시 게시 글과 같이 전송되어 저장되고,

글 리스트로 돌아갈 때 파라미터로 넘겨준다.

글 수정 일 때는 테이블에서 같이 읽어와서 bgno 변수로 넘겨 준다.

이중 처리 하는 이유는 다음 코드에서 보듯이

글쓰기 일 때는 파라미터로 받아오고(getParameter),

수정 일 때는 테이블에서 읽어오기 때문이다(boardInfo.getBgno()).

    @RequestMapping(value = "/board8Form")
    public String boardForm(HttpServletRequest request, ModelMap modelMap) {
        String bgno = request.getParameter("bgno");
        String brdno = request.getParameter("brdno");
        if (brdno != null) {
            BoardVO boardInfo = boardSvc.selectBoardOne(brdno);
            List<?> listview = boardSvc.selectBoard8FileList(brdno);
       
            modelMap.addAttribute("boardInfo", boardInfo);
            modelMap.addAttribute("listview", listview);
            bgno = boardInfo.getBgno();
        }
        modelMap.addAttribute("bgno", bgno);
       
        return "board8/BoardForm";
    }

Board8Ctr.java

JSP에서는 다음 코드와 같이

컨트롤에서 넘겨 받은 그룹 번호(bgno)를 hidden 태그로 가지고 있도록 하면 된다.

<input type="hidden" name="bgno" value="<c:out value="${bgno}"/>">
<input type="hidden" name="brdno" value="<c:out value="${boardInfo.brdno}"/>">
<a href="#" onclick="fn_formSubmit()">저장</a>

Board8Ctr.jsp

글을 저장하는 컨트롤(board8Save)이나 서비스에서 특별히 처리할 것은 없다.

그룹 번호(bgno)는 다른 게시물 정보(BoardVO boardInfo)와 같이 컨트롤로 전송되기 때문에

저장 SQL문만 다음과 같이 수정하면 된다.

<insert id="insertBoard8" parameterType="gu.board8.BoardVO" >
        <selectKey resultType="String" keyProperty="brdno" order="BEFORE">
            SELECT IFNULL(MAX(BRDNO),0)+1 FROM TBL_BOARD
        </selectKey>
   
        INSERT INTO TBL_BOARD(BGNO, BRDNO, BRDTITLE, BRDWRITER, BRDMEMO, BRDDATE, BRDHIT, BRDDELETEFLAG)
        VALUES (#{bgno}, #{brdno}, #{brdtitle}, #{brdwriter}, #{brdmemo}, NOW(), 0, 'N' )
</insert>

Board8Ctr.xml

글이 저장되고 나면 다음과 같이

글 리스트로 돌아갈 때(redirect) 파라메터로 그룹 번호(bgno)를 넘겨준다.

그렇지 않으면 오류가 발생하거나 등록한 글을 찾을 수 없다.

    @RequestMapping(value = "/board8Save")
    public String boardSave(HttpServletRequest request, BoardVO boardInfo) {
        String[] fileno = request.getParameterValues("fileno");
       
        FileUtil fs = new FileUtil();
        List<FileVO> filelist = fs.saveAllFiles(boardInfo.getUploadfile());

        boardSvc.insertBoard(boardInfo, filelist, fileno);

        return "redirect:/board8List?bgno=" + boardInfo.getBgno();
    }

Board8Ctr.java


'Java > 게시판 8: 멀티게시판' 카테고리의 다른 글

1. 멀티 게시판 준비  (0) 2016.06.04
2. 글 리스트  (0) 2016.06.04
3. 글 읽기 / 삭제  (0) 2016.06.04

+ Recent posts