4/10/2018

(구버전) 스프링 게시판 만들기 #2. 목록 기능 구현

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

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

게시물 작성이 가능하다면, 이를 조회할 수 있는 화면이 필요합니다. 하지만 그전에 게시물의 전체 목록을 확인할 수 있어야합니다.

스프링 게시판 만들기 #1에서 이미 CRUD(생성, 조회, 수정, 삭제)를 만들었지만, 목록은 없으므로 새로 만들어야하는 기능입니다.

꼭 지켜야할 순서는 아니지만, 쿼리문 작성(SQL) → 매퍼 추가 → DAO 작성 → Service 작성 → Controller 작성 → JSP 작성 순으로 진행하겠습니다.

먼저, 현재 게시판 테이블에 있는 모든 값을 출력하는 쿼리문을 작성합니다.

작성한 쿼리문을 매퍼에 복사합니다. 매퍼에서는 세미콜론(;)을 사용하지 않음에 주의합니다.
매퍼에 바로 추가하지 않고 디벨로퍼에서 작성한 다음 복사하는 이유는, 정상적으로 잘 작동되는지 확인하기 위해서입니다.

 <!-- 목록 -->
 <select id="list" resultType="com.kuzuro.domain.BoardVO">
  select bno, title, writer, regDate
      from myBoard
          order by bno desc
 </select>

resultType에 BoardVO이 있는 이유는, 이 쿼리문의 결과가 BoardVO의 형태로 출력되기 때문입니다.

매퍼에 연결되는 DAO 인터페이스를 작성하고

 // 목록
 public List<BoardVO> list() throws Exception;

DAO 인터페이스의 구현부인 DAOImpl를 작성합니다.

 // 목록
 @Override
 public List<BoardVO> list() throws Exception {
  return sql.selectList(namespace + ".list");
 }

같은 방법으로 DAO에 연결되는 Service 인터페이스를 작성하고

 // 목록
 public List<BoardVO> list() throws Exception;

구현부인 ServiceImpl를 작성합니다.

 // 목록
 @Override
 public List<BoardVO> list() throws Exception {
  return dao.list();
 }

이제 서비스를 호출하며, jsp파일을 실행할 컨트롤러에 코드를 추가합니다.

 // 글 목록
 @RequestMapping(value = "/list", method = RequestMethod.GET)
 public void list(Model model) throws Exception {
  logger.info("get list");
  
  List<BoardVO> list = service.list();
  
  model.addAttribute("list", list);
 }

Model은 컨트롤러(Controller)에서 처리한 결과를 화면(View), 즉 jsp에 전달하는 역할을 합니다.

BoardVO 형태의 리스트(List) 변수 list를 선언하고, 이를 모델에 추가(model.addAttribute)합니다. 이때 추가하는 명칭은 쌍따옴표의 list이며, 추가되는 값은 변수 list가 됩니다.

이름을 똑같이 만든 이유는, 그 역할 때문에 그렇습니다. 꼭 저렇게 할 필요는 없지만, 글 목록이니까 list로 한 것 뿐입니다.

board 폴더에 list.jsp파일을 생성하고, 코드를 작성합니다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ 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">
  <h2>글 목록</h2>
  
  <table>
   <tr><th>글 번호</th><th>글 제목</th><th>작성자</th><th>작성일자</th></tr>
   
   <!-- 목록 시작 -->
   <c:forEach items="${list}" var="list">
   <tr>
    <td>${list.bno}</td><td>${list.title}</td><td>${list.writer}</td>
    <td><fmt:formatDate value="${list.regDate}" pattern="yyyy-MM-dd" /></td>
   </tr>
   </c:forEach>
   <!-- 목록 끝 -->
   
  </table>

 </section>

<hr />

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

</div>

</body>
</html>

컨트롤러에서 받아온 list를 이용하여 반복문 forEach를 실행합니다. 이때 forEach는 list의 값 갯수만큼 반복됩니다. list의 각 요소들, 그러니까 글번호(bno), 글 제목(title)등은 EL문법을 이용하여 ${list.bno}, ${list.title} 처럼 사용합니다.

목록 화면에 바로 접속할 수 있도록, home.jsp파일에 목록으로 이동할 수 있는 링크를 추가합니다.

이제 실행하면 아래와 같은 화면이 나옵니다.

글 목록을 클릭하여 목록 화면으로 이동합니다.

현재까지 작성한 게시물들이 목록형태로 잘 출력됩니다.

게시물 수정
  1. 익명3/28/2019

    안녕하세요! 잘보고있습니다!!
    혹시 list.jsp에서
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    구문을 두번이나 입력하는 이유가 있나요??

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <--여기
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <-- 여기
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

    답글삭제
    답글
    1. 안녕하세요?

      같은 코드를 두번이나 쓴 이유는.. 제가 그때 깜빡 졸았나 봅니다ㅠㅠ...

      삭제
  2. 익명8/18/2019

    작성자가 댓글을 삭제했습니다.

    답글삭제
    답글
    1. 익명8/18/2019

      작성자가 댓글을 삭제했습니다.

      삭제
    2. 안녕하세요? 해당 에러는 임포트(파일 상단에 추가되는 코드들)가 잘못된 경우일 확률이 높습니다. 임포트가 제대로 되었는지 확인해보시거나, 프로젝트-클린을 해주시면 될 것 같습니다.

      삭제
    3. 익명8/19/2019

      작성자가 댓글을 삭제했습니다.

      삭제
  3. 혹시 session 값을 가지고 와서 자기가 등록한 게시물만 볼려면 어떻게 할까요 ??

    답글삭제
  4. 궁금한점이 있습니다 controller의 list 메소드를 void 값으로 줘서 return 값이 반환안되게 해놓으셨는데 일반적인방식은 데이터를 전달할 jsp를 지정해줘야 되는데 제가 한방식은 list의 void 방식을 String 으로 바꿔서 return "/board/list"를 줘서 list.jsp로 model 객체를 전달해줬는데 void 방식으로 jsp를 지정해주지않으면 프로젝트가 많아지면 문제가 생기지않나요 ?
    블로그를 참고하며 공부하고 있는데 궁금해서 여쭤봅니다 일단해결방법은 알고있는데 void로 리턴 jsp를 안해주면 어떤방식으로 list.jsp한테 데이터를 넘겨주는지 궁금하네요

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      기본적으로 컨트롤러에 리턴이 없는 경우, 매핑된 URL로 접속이 됩니다. 그런데 리턴값으로 경로를 넣는 경우는 대체 뭐냐한다면...

      대표적인 예를 들자면, 스프링 프로젝트를 새로 만들면 HomeController가 생성됩니다. 여기서 프로젝트를 실행하면 실제로 접속되는 파일은 Home.jsp인데, 컨트롤러의 경로는 /Home가 아니라 /입니다. 이처럼 URL의 경로와 실제 파일이 있는 경로가 다를 경우, 컨트롤러 메서드에 리턴값으로 경로를 설정하여 URL과 상이한 경로에 있는 jsp파일을 실행할 수 있게 됩니다.

      게시물 본문에 있는 url은 실제 파일 경로와 일치하므로, 굳이 리턴값을 넣지 않고 void로 하더라도 아무 문제 없이 동작됩니다.

      삭제