4/11/2018

(구버전) 스프링 게시판 만들기 #3. 조회 기능 구현

'(구버전) 스프링 게시판 만들기'는 내용이 부족하다고 판단하여
스프링 게시판 만들기를 새로 작성하였습니다.

링크 및 참조용으로 현재 게시물은 남겨두겠지만,
가급적이면 새로운 스프링 게시판 만들기를 참조해주시기 바랍니다.

게시물 목록을 만들었으니, 게시물을 하나씩 조회할 수 있도록 해야합니다.

일반적인 게시판 목록에서는 게시물의 제목을 클릭하여 게시물 조회 페이지로 이동하게 됩니다.

게시물 조회시 가장 중요한 요소는 모든 게시물을 구분할 수 있는 고유값이 있어야 한다는것 입니다.

작성자와 날짜로는 게시물을 구분할 수 없습니다. 한명의 작성자는 여러개의 게시물을 작성할 수 있으며, 하루에 다수의 게시물을 작성할 수 있으니까요.

글 제목은 게시물을 구분할 수 있을것 같지만, 같은 제목의 게시물을 작성할 수 있기 때문에 글 제목만으로 게시물을 구분할 수 없습니다.

그렇게 때문에 게시물의 고유 번호(bno)가 필요합니다. 굳이 번호가 아니라 코드(=문자)여도 상관없으며, 다른 게시물과 겹치지 않는 고유한 값을 가져야 합나다.

쿼리문은 스프링 게시판 만들기 #1에서 미리 만들어두었으며

DAO와 Servier도 미리 만들어 두었기 때문에, 아직 구현되지 않은 컨트롤러(Controller)와 화면(View)의 JSP파일만 만들면 되겠습니다.

컨트롤러에 조회용 코드를 추가합니다.

 // 글 조회
 @RequestMapping(value = "/read", method = RequestMethod.GET)
 public void getRead(@RequestParam("bno") int bno, Model model) throws Exception {
  logger.info("get read");
  
  BoardVO vo = service.read(bno);
  
  model.addAttribute("read", vo);
  
 }

매개변수로 @RequestParam("bno") int bnoModel model이 사용됩니다. Model은 컨트롤러에서 처리한 결과를 화면에 전달하는 역할을 합니다.

새로 쓰이는 @RequestParam("bno") int bno는 컨트롤러가 넘겨받은 값중 bno의 값을 받아서, int형 변쉬 bno에 값을 넘겨줍니다. 그렇다면 컨트롤러는 어디서 값을 넘겨받는가인다, 여기서는 주소형식으로 값을 넘겨받습니다.

board폴더에서 write.jsp파일을 복사(Ctrl + C) → 붙여넣기(Ctrl + V)를 한 후 이름을 read.jsp로 저장한 뒤 read.jsp의 코드를 수정합니다.

write.jsp와 거의 똑같은데, 값이 없는 input, textarea 태그에 값을 넣어줍니다. 그리고 이후에 사용할 글 번호와 작성날짜를 넣어주면 됩니다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html>
<head>
 <title>kuzuro 게시판</title>
</head>
<body>

<div id="root">
 <header>
  <h1>kuzuro 게시판</h1>
 </header>

<hr />
 
 <nav>
  처음화면 - 글쓰기 - 로그인
 </nav>

<hr />

 <section id="container">
 
  <form role="form" method="post" autocomplete="off">
  
   <p>
    <label for="bno">글 번호</label><input type="text" id="bno" name="bno" value="${read.bno}" readonly="readonly" />
   </p>
   
   <p>
    <label for="title">글 제목</label><input type="text" id="title" name="title" value="${read.title}" readonly="readonly"  />
   </p>
   <p>
    <label for="content">글 내용</label><textarea id="content" name="content" readonly="readonly" >${read.content}</textarea>
   </p>
   <p>
    <label for="writer">작성자</label><input type="text" id="writer" name="writer" value="${read.writer}" readonly="readonly" /><br />
    <label>작성 날짜</label> <span><fmt:formatDate value="${read.regDate}" pattern="yyyy-MM-dd" /></span>
   </p>
   <p>
    
   </p>  
  </form>

 </section>

<hr />

 <footer>
  <p>만든이 : kuzuro</p>  
 </footer>

</div>

</body>
</html>

이제 list.jsp파일로 이동하여, <td>${list.title}</td> 태그를  <td><a href="/board/read?bno=${list.bno}">${list.title}</a></td>로 바꿔줍니다.

링크를 이용하여 게시물 조회 페이지에 접속할 수 있도록 했으며, 이 때 컨트롤러의 getRead에 전달한 값인 bno가 있습니다.

글 제목의 링크에 마우스를 가져가면, 주소의 형식이 보입니다.

read?bno=23으로 되어있는데, read 페이지에 접속하며 이때 bno의 값인 23을 같이 전달합니다.

클릭해보면 이미 작성되어있던 게시물을 볼 수 있습니다.

그런데 글 번호, 글 제목, 글 내용, 작성자 모두 수정할 수 있습니다. 수정한다고해서 데이터 베이스에 있는 값까지 바뀌는건 아니지만, 착각할 수 있으므로 수정할 수 없도록 태그를 수정합니다.

각 태그, 그러니까 input 태그와 textarea 태그에 readonly="readonly"를 추가하면 임의로 수정할 수 없게됩니다.

게시물 수정