spring-mvc/board

Spring legacy 프로젝트 게시판 만들기(2) - 전체 조회

crone 2021. 6. 17. 13:08

 

이전 글

 

Spring legacy 프로젝트 게시판 만들기(1) - 설정

spring으로 간단한 흐름과 기능적으로 동작하는 게시판을 만들 예정입니다. Jungsangjin0/spring-board Contribute to Jungsangjin0/spring-board development by creating an account on GitHub. github.com 프로..

cronex.tistory.com

소스코드


이전 글에 이어서  이번 글에서는 간단한 조회를 해볼 예정입니다.

 

폴더구조는 아래와 같습니다.

webapp 폴더구조

 

jsp파일

include 할 때 사용할 sidebar.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<style type="text/css">
body{
    margin : 0;
    padding : 0;
}

.sidebar{
    position: fixed;
    left : 0;
    width : 180px;
    height : 100%;
    background: #5530EB;

}
.sidebar ul {
    margin: 0;
    padding: 0;
    list-style:  none;
}
.sidebar ul li a{

    text-decoration: none;
}
.sub-sidebar{
    
    position: fixed;
    left : 180px;
    width : 200px;
    height : 100%;
    background: #FFFFFF;
    
  
}
.sidebar header{
    font-size : 22px;
    color: white;
    text-align: center;
    line-height: 70px;
    user-select: none;
    box-sizing: border-box;
    border-bottom: 1px solid black;
    
}
.sidebar ul {
    height: 800px;
}

.sidebar ul a {
    display: block;
    height: 100%;
    width: 100%;
    line-height:10px;
    font-size: 14px;
    color: white;
    padding-left: 10px;
    transition: .3s;
}
.sidebar ul a img {
    margin-right: 16px;
}
.sidebar ul img{
    width: 20px;
}
.sidebar header img {
    width:  150px;
    margin-top: 30px;
}
.sidebar ul p {
   display: inline; 
}
.sidebar ul li{
    margin-top: 10px;
}
.sidebar .group {
    bottom: 30px;
    border: 1px solid white; 
    width: 70%; 
    font-size:14px; 
    left: 10px; 
    color: white;
    height: 40px;
    line-height: 40px; 
    padding-left:30px;
    margin-left: 8px;
    border-radius: 7px;

}
.sidebar p img {
    width: 20px;
}
.sidebar li  a {
    display: block;
    line-height: 40px;
}
.sidebar ul li {
    width: 150px;
    height: 40px;
    margin-left: 10px;
}
.sidebar li a:hover{
    background : rgba(255, 255, 255, 0.3);
}
.top-menu {
    width:calc(100% - 380px); 
    height: 70px; 
    background: #EEF1F6; 
    position: fixed; 
    left: 380px;
    z-index: 999;
}
.top-menu-icon {
    float:right;
    height: 70px; 
    line-height: 63px;
}
.search-place{
    display: inline-block;
    margin-right: 30px; 
    margin-bottom:20px;
}
.search-place > input:focus{
    outline: none;
}
.search-place > input:hover {
cursor: pointer;
}
.search-place > input[type=text] {
    height: 25px;
    width: 150px;
    line-height: 25px;
}
.search-place > input[type=button] {
    border: none;
    height:25px;
}
.top-alarm {
    width: 20px; 
    margin-right:30px; 
    vertical-align: middle;
}
.user-icon {
    width: 25px; 
    margin-right:50px; 
    vertical-align: middle;
}
.content {
    /* background:yellow; */
    width:calc(100% - 380px);  
    left: 380px;
    height: 1000px;
    position: relative;
    top:75px;
}
.content-body{
    background: white; 
    width: 100%;
    margin: 0 auto; 
    height: 100%;
}

.menuu {
    width: 90px;
    height: 150px; 
    background: rgb(247, 247, 247);
     position: absolute; 
     top:55px; 
     right: 48px; 
     box-shadow:0px 1px 7px rgb(0,0,0,0.2); 
     display: none;
}
.menuu ul li {
    font-size: 13px;
    height: 30px;
    text-align: center;
    line-height: 30px;
    margin: 0;
    padding: 0;
    list-style:  none;
}
.menuu ul {
    margin-top: 15px;
    padding : 0;
}

.menuu ul li:hover {
    background : rgba(172, 167, 167, 0.3);
}
.menuu ul li a {
    text-decoration: none;
}
.menuu ul li a span {
    color:  black;
}
.menu-e {
    display: block;
}
</style>
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/side.css">
<body>
    <div class="sidebar">
        <header></header>
         <ul>
            <li><a href="${pageContext.servletContext.contextPath }">
                    <p>홈</p>
                </a></li>
            <li><a href="board">
                    <p>페이징 게시판</p>
                </a></li>
            <li><a href="#"><p>더보기 게시판</p>
                </a></li>
            <li><a href="#"><p>사진 게시판</p>
                </a></li>
            <li><a href="#"><p>엑셀게시판</p>
                </a></li>
            <li><a href="#"><p>이메일</p>
                </a></li>
            <li><a href="#"><p>메신저</p>
                </a></li>
            <li><a href="#"><p>근태관리</p>
                </a></li>
        </ul>
    </div>

    <div class="top-menu">
        <div class="top-menu-icon">
            <div class="search-place">
                <input type="search" placeholder="통합검색">
                <input type="button" value="검색">
            </div>
            <a href="#"><img src="${pageContext.request.contextPath }/resources/images/sidebarLogo/상단 우측 알람 표시.png" class="top-alarm"></a>
            <a href="#"><img src="" alt=""><img src="${pageContext.request.contextPath }/resources/images/sidebarLogo/상단 우측 검색바.png" class="user-icon"></a>
            <div class="menuu">
                <ul>
                    <li><a href="#"><span>기본정보</span></a></li>
                    <li><a href="#"><span>알림설정</span></a></li>
                    <li><a href="#"><span>관리자 페이지</span></a></li>
                    <li><a href="#"><span>로그아웃</span></a></li>
                </ul>
            </div>

        </div>
    </div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    $(".user-icon").click(function() {
       $(".menuu").toggleClass("menu-e");
    })
</script>

sidebar.css

body{
    margin : 0;
    padding : 0;
}

.sidebar{
    position: fixed;
    left : 0;
    width : 180px;
    height : 100%;
    background: #5530EB;

}
.sidebar ul {
    margin: 0;
    padding: 0;
    list-style:  none;
}
.sidebar ul li a{

    text-decoration: none;
}
.sub-sidebar{
    
    position: fixed;
    left : 180px;
    width : 200px;
    height : 100%;
    background: #FFFFFF;
    
  
}
.sidebar header{
    font-size : 22px;
    color: white;
    text-align: center;
    line-height: 70px;
    user-select: none;
    box-sizing: border-box;
    border-bottom: 1px solid black;
    
}
.sidebar ul {
    height: 800px;
}

.sidebar ul a {
    display: block;
    height: 100%;
    width: 100%;
    line-height:10px;
    font-size: 14px;
    color: white;
    padding-left: 10px;
    transition: .3s;
}
.sidebar ul a img {
    margin-right: 16px;
}
.sidebar ul img{
    width: 20px;
}
.sidebar header img {
    width:  150px;
    margin-top: 30px;
}
.sidebar ul p {
   display: inline; 
}
.sidebar ul li{
    margin-top: 10px;
}
.sidebar .group {
    bottom: 30px;
    border: 1px solid white; 
    width: 70%; 
    font-size:14px; 
    left: 10px; 
    color: white;
    height: 40px;
    line-height: 40px; 
    padding-left:30px;
    margin-left: 8px;
    border-radius: 7px;

}
.sidebar p img {
    width: 20px;
}
.sidebar li  a {
    display: block;
    line-height: 40px;
}
.sidebar ul li {
    width: 150px;
    height: 40px;
    margin-left: 10px;
}
.sidebar li a:hover{
    background : rgba(255, 255, 255, 0.3);
}
.top-menu {
    width:calc(100% - 380px); 
    height: 70px; 
    background: #EEF1F6; 
    position: fixed; 
    left: 380px;
    z-index: 999;
}
.top-menu-icon {
    float:right;
    height: 70px; 
    line-height: 63px;
}
.search-place{
    display: inline-block;
    margin-right: 30px; 
    margin-bottom:20px;
}
.search-place > input:focus{
    outline: none;
}
.search-place > input:hover {
cursor: pointer;
}
.search-place > input[type=text] {
    height: 25px;
    width: 150px;
    line-height: 25px;
}
.search-place > input[type=button] {
    border: none;
    height:25px;
}
.top-alarm {
    width: 20px; 
    margin-right:30px; 
    vertical-align: middle;
}
.user-icon {
    width: 25px; 
    margin-right:50px; 
    vertical-align: middle;
}
.content {
    /* background:yellow; */
    width:calc(100% - 380px);  
    left: 380px;
    height: 1000px;
    position: relative;
    top:75px;
}
.content-body{
    background: white; 
    width: 100%;
    margin: 0 auto; 
    height: 100%;
}

.menuu {
    width: 90px;
    height: 150px; 
    background: rgb(247, 247, 247);
     position: absolute; 
     top:55px; 
     right: 48px; 
     box-shadow:0px 1px 7px rgb(0,0,0,0.2); 
     display: none;
}
.menuu ul li {
    font-size: 13px;
    height: 30px;
    text-align: center;
    line-height: 30px;
    margin: 0;
    padding: 0;
    list-style:  none;
}
.menuu ul {
    margin-top: 15px;
    padding : 0;
}

.menuu ul li:hover {
    background : rgba(172, 167, 167, 0.3);
}
.menuu ul li a {
    text-decoration: none;
}
.menuu ul li a span {
    color:  black;
}
.menu-e {
    display: block;
}

board.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>페이징 게시판</title>
<style type="text/css">

	.table > tbody tr:hover {
	 background : rgb(200, 200, 200);
	 cursor: pointer;
	}
</style>

</head>
<body>
	<jsp:include page="../common/sidebar.jsp"/>
	<div class="content">
		<div style="align-items: center;">
			<table class="table" style="border-collapse: collapse;">
				<thead>
					<tr>
						<th>번호</th>
						<th>제목</th>
						<th>작성자</th>
						<th>작성일</th>
					<tr>
				</thead>
				<tbody class="board-tbody">
				<!-- foreach -->
					<tr>
						<td>1</td>
						<td>이제곧바뀐다..</td>
						<td>sj</td>
						<td style="padding-left: 20px;">2021.06.15</td>
					</tr>	
					<tr>
						<td>2</td>
						<td>이제곧바뀐다..</td>
						<td>sj</td>
						<td style="padding-left: 20px;">2021.06.15</td>
					</tr>
				<!-- /foreach -->		
				</tbody>
			</table>
		</div>
	</div>
</body>
</html>

 

table 목록이 뜨는 것을 볼 수 있습니다.

이제 tbody 부분을 db에서 데이터를 사용하여 구성하도록 하겠습니다.

 

 

먼저 tomcat을 실행해서 page에 들어가보면 이러한 페이지를 볼 수 있습니다.

home page

다음으로 http://127.0.0.1:8001/board/board 로 페이지를 요청했을 때 실행 할 controller를 작성하겠습니다. (사이드 바에서 페이징 게시판입니다.)

package com.js.board;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class BoardController {

	@RequestMapping(value ="/board", method = RequestMethod.GET)
	public String board() {
		
		return "board/board";
	}
	
}

 controller 작성후 해당 페이지로 요청을 하게 되면 작성한 테이블을 보실 수 있습니다. 

board.jsp page

 

먼저 package 구조를 변경하겠습니다.

board 아래 controller와 model 로 나누고 model 안에 dto, repository service를 만들었습니다.

 

이어서 Service 와 Repository를 작성 하겠습니다.

 

Service Repository 작성

첫 번째로 board테이블에 해당하는 dto를 작성하겠습니다.

package com.js.board.model.dto;

import java.sql.Date;

/*
 * board 데이터를 가져올 때 사용할 Board class
 * */
public class BoardDTO {

	private long board_id; /*글 아이디(기본 키)*/
	private int board_category; /*글 카테고리(0이 기본 게시판)*/
	private String board_writer; /*글 작성자*/
	private String board_title; /*글 제목*/
	private String board_text; /*글 내용*/
	private Date board_date; /*글 작성일*/
	private int board_reply; /*참조 번호(댓글)*/
	private int board_level; /*글 레벨(0이 본문 1이 댓글)*/
	private char board_status; /*글 삭제 여부(Y가 삭제)*/
	
	public BoardDTO() {}
	
	public BoardDTO(long board_id, int board_category, String board_writer, String board_title, String board_text,
			Date board_date, int board_reply, int board_level, char board_status) {
		super();
		this.board_id = board_id;
		this.board_category = board_category;
		this.board_writer = board_writer;
		this.board_title = board_title;
		this.board_text = board_text;
		this.board_date = board_date;
		this.board_reply = board_reply;
		this.board_level = board_level;
		this.board_status = board_status;
	}

	public long getBoard_id() {
		return board_id;
	}

	public void setBoard_id(long board_id) {
		this.board_id = board_id;
	}

	public int getBoard_category() {
		return board_category;
	}

	public void setBoard_category(int board_category) {
		this.board_category = board_category;
	}

	public String getBoard_writer() {
		return board_writer;
	}

	public void setBoard_writer(String board_writer) {
		this.board_writer = board_writer;
	}

	public String getBoard_title() {
		return board_title;
	}

	public void setBoard_title(String board_title) {
		this.board_title = board_title;
	}

	public String getBoard_text() {
		return board_text;
	}

	public void setBoard_text(String board_text) {
		this.board_text = board_text;
	}

	public Date getBoard_date() {
		return board_date;
	}

	public void setBoard_date(Date board_date) {
		this.board_date = board_date;
	}

	public int getBoard_reply() {
		return board_reply;
	}

	public void setBoard_reply(int board_reply) {
		this.board_reply = board_reply;
	}

	public int getBoard_level() {
		return board_level;
	}

	public void setBoard_level(int board_level) {
		this.board_level = board_level;
	}

	public char getBoard_status() {
		return board_status;
	}

	public void setBoard_status(char board_status) {
		this.board_status = board_status;
	}

	@Override
	public String toString() {
		return "BoardDTO [board_id=" + board_id + ", board_category=" + board_category + ", board_writer="
				+ board_writer + ", board_title=" + board_title + ", board_text=" + board_text + ", board_date="
				+ board_date + ", board_reply=" + board_reply + ", board_level=" + board_level + ", board_status="
				+ board_status + "]";
	}
	
	
	
	
}

 

먼저 테스트를 통해 DB에서 데이터를 잘 가져와지는지 확인해 보도록 하겠습니다.

 

 

Service는 나중에 확장성 및 유지보수를 위해 interface 작성 후 interface를 구현한 serviceImpl로 작성하겠습니다.

 

BoardService.java

package com.js.board.model.service;

import java.util.List;

import com.js.board.model.dto.BoardDTO;

public interface BoardService {
	
	/*select board*/
	public List<BoardDTO> selectBoardList();

}

BoardServiceImpl.java

package com.js.board.model.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.js.board.model.dto.BoardDTO;

@Service("boardService")
public class BoardServiceImpl implements BoardService{

	@Override
	public List<BoardDTO> selectBoardList() {
		
		return null;
	}

}

Repository로 interface작성 후 구현하는 식으로 진행하겠습니다.

 

BoardRepository.java

package com.js.board.model.repository;

import java.util.List;

import com.js.board.model.dto.BoardDTO;

public interface BoardRepository {

	/*select Board*/
	public List<BoardDTO> selectBoardList();
	
}

BoardRepositoryImpl.java

package com.js.board.model.repository;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.js.board.model.dto.BoardDTO;

@Repository("boardRepository")
public class BoardRepositoryImpl implements BoardRepository{

	@Override
	public List<BoardDTO> selectBoardList() {
		
		return null;
	}
	
}

 이제 기본 틀은 만들었으니 controller에서 부터 repository까지 흐름이 이어 질 수 있도록 return와 autowired및 코드를  작성하겠습니다.

 

BoardController.java

package com.js.board.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.js.board.model.dto.BoardDTO;
import com.js.board.model.service.BoardService;

@Controller
public class BoardController {

	private final BoardService boardService;
	
	@Autowired
	public BoardController(BoardService boardService) {
		this.boardService = boardService;
	}
	
	@RequestMapping(value ="/board", method = RequestMethod.GET)
	public String board(Model model) {
		
		List<BoardDTO> list = boardService.selectBoardList();
		
		return "board/board";
	}

}

BoardServiceImpl.java

package com.js.board.model.service;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.js.board.model.dto.BoardDTO;
import com.js.board.model.repository.BoardRepository;

@Service("boardService")
public class BoardServiceImpl implements BoardService{

	private final BoardRepository boardRepository;
	private final SqlSessionTemplate sqlSession;
	
	@Autowired
	public BoardServiceImpl(BoardRepository boardRepository, SqlSessionTemplate sqlSession) {
		this.boardRepository = boardRepository;
		this.sqlSession = sqlSession;
	}
	
	@Override
	public List<BoardDTO> selectBoardList() {
		
		return boardRepository.selectBoardList(sqlSession);
	}

}

Repository로 sqlSession 객체를 넘기고 있으므로 Repository와 구현체인 RepositoryImpl에도 추가해줍니다.

 

RepositoryImpl.java

package com.js.board.model.repository;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

import com.js.board.model.dto.BoardDTO;

@Repository("boardRepository")
public class BoardRepositoryImpl implements BoardRepository{

	@Override
	public List<BoardDTO> selectBoardList(SqlSessionTemplate sqlSession) {
		
		return sqlSession.selectList("board.selectList");
	}
	
}

마지막으로 RepositoryImpl 에서 mybatis를 이용해 db에서 데이터를 가져오겠습니다.

selectList는 select로 목록을 조회해서 가져올 때 사용하는 메소드로 매개변수로 mapper의 namespace와 id값을 전달합니다(board.selectList :: board(mapper의 namespace).selectList(쿼리문 id)). 쿼리문을 실행할 때 전달한 값이 있다면 뒤에 콤마를 찍고 객체를 전달하도록 합니다.

 

board-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 <mapper namespace="board">
 
 	<select id="selectList">
 		SELECT 
 		       BOARD_ID
	             , BOARD_CATEGORY
		     , BOARD_WRITER
 	             , BOARD_TITLE
		     , BOARD_TEXT
		     , BOARD_DATE
		     , BOARD_REPLY
		     , BOARD_LEVEL
		     , BOARD_STATUS
		FROM BOARD
 	</select>
 	
 	
 </mapper>

테스트를 생각 난 김에 진행 하도록 하겠습니다.

package selectTest;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.js.board.model.dto.BoardDTO;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/root-context.xml"})
public class SelectListTest {

	
	@Autowired
	SqlSessionTemplate sqlSession;
	
	Logger log = LoggerFactory.getLogger(SelectListTest.class);
	
	@Test
	public void test() {
		List<BoardDTO> list = sqlSession.selectList("board.selectList");
		log.info("list : {}", list);
	}
	
}

 테스트를 진행하였더니 아래와 같은 예외가 발생하였습니다.

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'board.selectList'.  It's likely that neither a Result Type nor a Result Map was specified.
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
	at com.sun.proxy.$Proxy16.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:222)
	at selectTest.SelectListTest.test(SelectListTest.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
	at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'board.selectList'.  It's likely that neither a Result Type nor a Result Map was specified.
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.validateResultMapsCount(DefaultResultSetHandler.java:291)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:193)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:136)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	... 35 more

잘 읽어보면 알 수 있듯이 쿼리문의 결과를 담을 객체에 대한 정보를 작성하지 않아서 나는 예외였습니다. board-mapper.xml 에서 실행했던 쿼리문 selectList 에 대한 결과를 담을 객체를 설정해 줍니다.

 

board-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 <mapper namespace="board">
 
 	<select id="selectList" resultType="com.js.board.model.dto.BoardDTO">
 		SELECT 
 		       BOARD_ID
			 , BOARD_CATEGORY
			 , BOARD_WRITER
			 , BOARD_TITLE
			 , BOARD_TEXT
			 , BOARD_DATE
		     , BOARD_REPLY
			 , BOARD_LEVEL
			 , BOARD_STATUS
		FROM BOARD
 	</select>
 	
 	
 </mapper>

위에서 만들어 두었던 DTO를 resultType으로 설정해도 되고 간편하게 map으로 설정해도 됩니다.(후 처리 해줘야 함)

테스트를 다시 실행해주면 결과를 가져오는 것을 확인할 수 있습니다.

INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener]
INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@305fd85d, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@458c1321, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@11438d26, org.springframework.test.context.support.DirtiesContextTestExecutionListener@34cd072c, org.springframework.test.context.transaction.TransactionalTestExecutionListener@7a1ebcd8, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@5faeada1, org.springframework.test.context.event.EventPublishingTestExecutionListener@528931cf]
INFO : selectTest.SelectListTest - list : [BoardDTO [board_id=1, board_category=0, board_writer=sj, board_title=제목1, board_text=내용1, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=2, board_category=0, board_writer=sj, board_title=제목2, board_text=내용2, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=3, board_category=0, board_writer=sj, board_title=제목3, board_text=내용3, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=4, board_category=0, board_writer=sj, board_title=제목4, board_text=내용4, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=5, board_category=0, board_writer=sj, board_title=제목5, board_text=내용5, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=6, board_category=0, board_writer=sj, board_title=제목6, board_text=내용6, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=7, board_category=0, board_writer=sj, board_title=제목7, board_text=내용7, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=8, board_category=0, board_writer=sj, board_title=제목8, board_text=내용8, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=9, board_category=0, board_writer=sj, board_title=제목9, board_text=내용9, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=10, board_category=0, board_writer=sj, board_title=제목10, board_text=내용10, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=11, board_category=0, board_writer=sj, board_title=제목11, board_text=내용11, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=12, board_category=0, board_writer=sj, board_title=제목12, board_text=내용12, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=13, board_category=0, board_writer=sj, board_title=제목13, board_text=내용13, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=14, board_category=0, board_writer=sj, board_title=제목14, board_text=내용14, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=15, board_category=0, board_writer=sj, board_title=제목15, board_text=내용15, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=16, board_category=0, board_writer=sj, board_title=제목16, board_text=내용16, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=17, board_category=0, board_writer=sj, board_title=제목17, board_text=내용17, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=18, board_category=0, board_writer=sj, board_title=제목18, board_text=내용18, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=19, board_category=0, board_writer=sj, board_title=제목19, board_text=내용19, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=20, board_category=0, board_writer=sj, board_title=제목20, board_text=내용20, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=21, board_category=0, board_writer=sj, board_title=제목21, board_text=내용21, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=22, board_category=0, board_writer=sj, board_title=제목22, board_text=내용22, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=23, board_category=0, board_writer=sj, board_title=제목23, board_text=내용23, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=24, board_category=0, board_writer=sj, board_title=제목24, board_text=내용24, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=25, board_category=0, board_writer=sj, board_title=제목25, board_text=내용25, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=26, board_category=0, board_writer=sj, board_title=제목26, board_text=내용26, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=27, board_category=0, board_writer=sj, board_title=제목27, board_text=내용27, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=28, board_category=0, board_writer=sj, board_title=제목28, board_text=내용28, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=29, board_category=0, board_writer=sj, board_title=제목29, board_text=내용29, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=30, board_category=0, board_writer=sj, board_title=제목30, board_text=내용30, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=31, board_category=0, board_writer=sj, board_title=제목31, board_text=내용31, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=32, board_category=0, board_writer=sj, board_title=제목32, board_text=내용32, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=33, board_category=0, board_writer=sj, board_title=제목33, board_text=내용33, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=34, board_category=0, board_writer=sj, board_title=제목34, board_text=내용34, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=35, board_category=0, board_writer=sj, board_title=제목35, board_text=내용35, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=36, board_category=0, board_writer=sj, board_title=제목36, board_text=내용36, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=37, board_category=0, board_writer=sj, board_title=제목37, board_text=내용37, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=38, board_category=0, board_writer=sj, board_title=제목38, board_text=내용38, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=39, board_category=0, board_writer=sj, board_title=제목39, board_text=내용39, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=40, board_category=0, board_writer=sj, board_title=제목40, board_text=내용40, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=41, board_category=0, board_writer=sj, board_title=제목41, board_text=내용41, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=42, board_category=0, board_writer=sj, board_title=제목42, board_text=내용42, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=43, board_category=0, board_writer=sj, board_title=제목43, board_text=내용43, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=44, board_category=0, board_writer=sj, board_title=제목44, board_text=내영44, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=45, board_category=0, board_writer=sj, board_title=제목45, board_text=내용45, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=46, board_category=0, board_writer=sj, board_title=제목46, board_text=내용46, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=47, board_category=0, board_writer=sj, board_title=제목47, board_text=내용47, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=48, board_category=0, board_writer=sj, board_title=제목48, board_text=내용48, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=49, board_category=0, board_writer=sj, board_title=제목49, board_text=내용49, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=50, board_category=0, board_writer=sj, board_title=제목50, board_text=내용50, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=51, board_category=0, board_writer=sj, board_title=제목51, board_text=내용51, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=52, board_category=0, board_writer=sj, board_title=제목52, board_text=내용52, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=53, board_category=0, board_writer=sj, board_title=제목53, board_text=내용53, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=54, board_category=0, board_writer=sj, board_title=제목54, board_text=내용54, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=55, board_category=0, board_writer=sj, board_title=제목55, board_text=내용55, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=56, board_category=0, board_writer=sj, board_title=제목56, board_text=내용56, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=57, board_category=0, board_writer=sj, board_title=제목57, board_text=내용57, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=58, board_category=0, board_writer=sj, board_title=제목58, board_text=내용58, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=59, board_category=0, board_writer=sj, board_title=제목59, board_text=내용59, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=60, board_category=0, board_writer=sj, board_title=제목60, board_text=내용60, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=61, board_category=0, board_writer=sj, board_title=제목61, board_text=내용61, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=62, board_category=0, board_writer=sj, board_title=제목62, board_text=내용62, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=63, board_category=0, board_writer=sj, board_title=제목63, board_text=내용63, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=64, board_category=0, board_writer=sj, board_title=제목64, board_text=내용64, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=65, board_category=0, board_writer=sj, board_title=제목65, board_text=내용65, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=66, board_category=0, board_writer=sj, board_title=제목66, board_text=내용66, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=67, board_category=0, board_writer=sj, board_title=제목67, board_text=내용67, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=68, board_category=0, board_writer=sj, board_title=제목68, board_text=내용68, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=69, board_category=0, board_writer=sj, board_title=제목69, board_text=내용69, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=70, board_category=0, board_writer=sj, board_title=제목70, board_text=내용70, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=71, board_category=0, board_writer=sj, board_title=제목71, board_text=내용71, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=72, board_category=0, board_writer=sj, board_title=제목72, board_text=내용72, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=73, board_category=0, board_writer=sj, board_title=제목73, board_text=내용73, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=74, board_category=0, board_writer=sj, board_title=제목74, board_text=내용74, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=75, board_category=0, board_writer=sj, board_title=제목75, board_text=내용75, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=76, board_category=0, board_writer=sj, board_title=제목76, board_text=내용76, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=77, board_category=0, board_writer=sj, board_title=제목77, board_text=내용77, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=78, board_category=0, board_writer=sj, board_title=제목78, board_text=내용78, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=79, board_category=0, board_writer=sj, board_title=제목79, board_text=내용79, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=80, board_category=0, board_writer=sj, board_title=제목80, board_text=내용80, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=81, board_category=0, board_writer=sj, board_title=제목81, board_text=내용81, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=82, board_category=0, board_writer=sj, board_title=제목82, board_text=내용82, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=83, board_category=0, board_writer=sj, board_title=제목83, board_text=내용83, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=84, board_category=0, board_writer=sj, board_title=제목84, board_text=내용84, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=85, board_category=0, board_writer=sj, board_title=제목85, board_text=내용85, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=86, board_category=0, board_writer=sj, board_title=제목86, board_text=내용86, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=87, board_category=0, board_writer=sj, board_title=제목87, board_text=내용87, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=88, board_category=0, board_writer=sj, board_title=제목88, board_text=내용88, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=89, board_category=0, board_writer=sj, board_title=제목89, board_text=내용89, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=90, board_category=0, board_writer=sj, board_title=제목90, board_text=내용90, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=91, board_category=0, board_writer=sj, board_title=제목91, board_text=내용91, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=92, board_category=0, board_writer=sj, board_title=제목92, board_text=내용92, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=93, board_category=0, board_writer=sj, board_title=제목93, board_text=내용93, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=94, board_category=0, board_writer=sj, board_title=제목94, board_text=내용94, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=95, board_category=0, board_writer=sj, board_title=제목95, board_text=내용95, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=96, board_category=0, board_writer=sj, board_title=제목96, board_text=내용96, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=97, board_category=0, board_writer=sj, board_title=제목97, board_text=내용97, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=98, board_category=0, board_writer=sj, board_title=제목98, board_text=내용98, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=99, board_category=0, board_writer=sj, board_title=제목99, board_text=내용99, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=100, board_category=0, board_writer=sj, board_title=제목100, board_text=내용100, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=101, board_category=0, board_writer=sj, board_title=제목101, board_text=내용101, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=102, board_category=0, board_writer=sj, board_title=제목102, board_text=내용102, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=103, board_category=0, board_writer=sj, board_title=제목103, board_text=내용103, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=104, board_category=0, board_writer=sj, board_title=제목104, board_text=내용104, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=105, board_category=0, board_writer=sj, board_title=제목105, board_text=내용105, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=106, board_category=0, board_writer=sj, board_title=제목106, board_text=내용106, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=107, board_category=0, board_writer=sj, board_title=제목107, board_text=내용107, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=108, board_category=0, board_writer=sj, board_title=제목108, board_text=내용108, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=109, board_category=0, board_writer=sj, board_title=제목109, board_text=내용109, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=110, board_category=0, board_writer=sj, board_title=제목110, board_text=내영110, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=111, board_category=0, board_writer=sj, board_title=제목111, board_text=내용111, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=112, board_category=0, board_writer=sj, board_title=제목112, board_text=내용112, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=113, board_category=0, board_writer=sj, board_title=제목113, board_text=내용113, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=114, board_category=0, board_writer=sj, board_title=제목114, board_text=내용114, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=115, board_category=0, board_writer=sj, board_title=제목115, board_text=내용115, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=116, board_category=0, board_writer=sj, board_title=제목116, board_text=내용116, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=117, board_category=0, board_writer=sj, board_title=제목117, board_text=내용117, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=118, board_category=0, board_writer=sj, board_title=제목118, board_text=내용118, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=119, board_category=0, board_writer=sj, board_title=제목119, board_text=내용119, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=120, board_category=0, board_writer=sj, board_title=제목120, board_text=내용120, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=121, board_category=0, board_writer=sj, board_title=제목121, board_text=내용121, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=122, board_category=0, board_writer=sj, board_title=제목122, board_text=내용122, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=123, board_category=0, board_writer=sj, board_title=제목123, board_text=내용123, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=124, board_category=0, board_writer=sj, board_title=제목124, board_text=내용124, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=125, board_category=0, board_writer=sj, board_title=제목125, board_text=내용125, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=126, board_category=0, board_writer=sj, board_title=제목126, board_text=내용126, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=127, board_category=0, board_writer=sj, board_title=제목127, board_text=내용127, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=128, board_category=0, board_writer=sj, board_title=제목128, board_text=내용128, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=129, board_category=0, board_writer=sj, board_title=제목129, board_text=내용129, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=130, board_category=0, board_writer=sj, board_title=제목130, board_text=내용130, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=131, board_category=0, board_writer=sj, board_title=제목131, board_text=내용131, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=132, board_category=0, board_writer=sj, board_title=제목132, board_text=내용132, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=133, board_category=0, board_writer=sj, board_title=제목133, board_text=내용133, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=134, board_category=0, board_writer=sj, board_title=제목134, board_text=내용134, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=135, board_category=0, board_writer=sj, board_title=제목135, board_text=내용135, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=136, board_category=0, board_writer=sj, board_title=제목136, board_text=내용136, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=137, board_category=0, board_writer=sj, board_title=제목137, board_text=내용137, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=138, board_category=0, board_writer=sj, board_title=제목138, board_text=내용138, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=139, board_category=0, board_writer=sj, board_title=제목139, board_text=내용139, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=140, board_category=0, board_writer=sj, board_title=제목140, board_text=내용140, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=141, board_category=0, board_writer=sj, board_title=제목141, board_text=내용141, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=142, board_category=0, board_writer=sj, board_title=제목142, board_text=내용142, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=143, board_category=0, board_writer=sj, board_title=제목143, board_text=내용143, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=144, board_category=0, board_writer=sj, board_title=제목144, board_text=내용144, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=145, board_category=0, board_writer=sj, board_title=제목145, board_text=내용145, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=146, board_category=0, board_writer=sj, board_title=제목146, board_text=내용146, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=147, board_category=0, board_writer=sj, board_title=제목147, board_text=내용147, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=148, board_category=0, board_writer=sj, board_title=제목148, board_text=내용148, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=149, board_category=0, board_writer=sj, board_title=제목149, board_text=내용149, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=150, board_category=0, board_writer=sj, board_title=제목150, board_text=내용105, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=151, board_category=0, board_writer=sj, board_title=제목151, board_text=내용151, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=152, board_category=0, board_writer=sj, board_title=제목152, board_text=내용152, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=153, board_category=0, board_writer=sj, board_title=제목153, board_text=내용153, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=154, board_category=0, board_writer=sj, board_title=제목154, board_text=내용154, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=155, board_category=0, board_writer=sj, board_title=제목155, board_text=내용155, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=156, board_category=0, board_writer=sj, board_title=제목156, board_text=내용156, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N], BoardDTO [board_id=157, board_category=0, board_writer=sj, board_title=제목157, board_text=내용157, board_date=2021-06-17, board_reply=0, board_level=0, board_status=N]]

 이제 서버를 켜서 board페이지 요청 시 controller 까지 데이터를 잘 가져오는지 확인 해 보도록 하겠습니다.

controller

controller까지 가져와 지는것을 확인 하였으니 model에 담아 jsp페이지(view)로 데이터를 전달하겠습니다. 

package com.js.board.controller;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.js.board.model.dto.BoardDTO;
import com.js.board.model.service.BoardService;

@Controller
public class BoardController {

	private static final Logger log = LoggerFactory.getLogger(BoardController.class);
	private final BoardService boardService;
	
	@Autowired
	public BoardController(BoardService boardService) {
		this.boardService = boardService;
	}
	
	@RequestMapping(value ="/board", method = RequestMethod.GET)
	public String board(Model model) {
		
		List<BoardDTO> list = boardService.selectBoardList();
		model.addAttribute("list", list);
		log.info("list : {}", list);
		
		return "board/board";
	}
	
}

controller에서 데이터를 넘겼으니 이제 board.jsp에서 table의 body부분을 데이터로 변경해 줍시다.

먼저 jstl을 사용하기 위해 taglib을 선언해 준 후 foreach문을 사용하여 데이터를 보여주겠습니다.

 

board.jsp (몇 가지 스타일을 수정하였습니다.)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!-- taglib 추가 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>페이징 게시판</title>
<style type="text/css">

	.table > tbody tr:hover {
	 background : rgb(200, 200, 200);
	 cursor: pointer;
	}
</style>

</head>
<body>
	<jsp:include page="../common/sidebar.jsp"/>
	<div class="content">
		<div>
			<table class="table" style="border-collapse: collapse;width:1200px;text-align: center;">
				<colgroup>
					<col width="15%">
					<col width="20%">
					<col width="40%">
					<col width="15%">
				</colgroup>
				<thead>
					<tr>
						<th>번호</th>
						<th>제목</th>
						<th>작성자</th>
						<th>작성일</th>
					<tr>
				</thead>
				<tbody class="board-tbody">
			<!-- forEach로 변경된 body부분 -->		
				<c:forEach items="${requestScope.list}" var="board">
					<tr>
						<td>${board.board_id}</td>
						<td>${board.board_title}</td>
						<td>${board.board_writer}</td>
						<td>${board.board_date}</td>
					</tr>					
				</c:forEach>	
				</tbody>
			</table>
		</div>
	</div>
</body>
</html>

크롬으로 확인해 보면

 

board page

데이터를 잘 가져와지는 것을 확인할 수 있습니다.

 

 

+추가

mybatis사용 시 db column 명과 DTO를 같게 해줬기 때문에 mybatis에서 자동으로 매핑을 해줬는데(setter작성) DTO를 다르게 작성 시 ResultMap을 통해 설정해 줄 수 있습니다.

 

-boardDTO2.java

package com.js.board.model.dto;

import java.sql.Date;

/*
 * board 데이터를 가져올 때 사용할 Board class
 * */
public class BoardDTO2 {

	private long id; /*글 아이디(기본 키)*/
	private int category; /*글 카테고리(0이 기본 게시판)*/
	private String writer; /*글 작성자*/
	private String title; /*글 제목*/
	private String text; /*글 내용*/
	private Date date; /*글 작성일*/
	private int reply; /*참조 번호(댓글)*/
	private int level; /*글 레벨(0이 본문 1이 댓글)*/
	private char status; /*글 삭제 여부(Y가 삭제)*/
	
	public BoardDTO2() {}
	
	public BoardDTO2(long id, int category, String writer, String title, String text, Date date, int reply, int level,
			char status) {
		super();
		this.id = id;
		this.category = category;
		this.writer = writer;
		this.title = title;
		this.text = text;
		this.date = date;
		this.reply = reply;
		this.level = level;
		this.status = status;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public int getCategory() {
		return category;
	}

	public void setCategory(int category) {
		this.category = category;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public int getReply() {
		return reply;
	}

	public void setReply(int reply) {
		this.reply = reply;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public char getStatus() {
		return status;
	}

	public void setStatus(char status) {
		this.status = status;
	}

	@Override
	public String toString() {
		return "BoardDTO2 [id=" + id + ", category=" + category + ", writer=" + writer + ", title=" + title + ", text="
				+ text + ", date=" + date + ", reply=" + reply + ", level=" + level + ", status=" + status + "]";
	}
	
	
	
}

 

-board-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 <mapper namespace="board">
 
 	<resultMap type="com.js.board.model.dto.BoardDTO2" id="boardList">
 		<id column="BOARD_ID" property="id"/> <!-- 기본 키 -->
 		<result column="BOARD_CATEGORY" property="category"/>
 		<result column="BOARD_WRITER" property="writer"/>
 		<result column="BOARD_TITLE" property="title"/>
 		<result column="BOARD_TEXT" property="text"/>
 		<result column="BOARD_DATE" property="date"/>
 		<result column="BOARD_REPLY" property="reply"/>
 		<result column="BOARD_LEVEL" property="level"/>
 		<result column="BOARD_STATUS" property="status"/>
 	</resultMap>
 		
 
 	<select id="selectList" resultMap="boardList">
 		SELECT 
 		       BOARD_ID
			 , BOARD_CATEGORY
			 , BOARD_WRITER
			 , BOARD_TITLE
			 , BOARD_TEXT
			 , BOARD_DATE
		     , BOARD_REPLY
			 , BOARD_LEVEL
			 , BOARD_STATUS
		FROM BOARD
 	</select>
 	
 	
 	
 </mapper>

테스트를 통해 데이터를 가져오는지 확인해 보도록 하겠습니다.

package selectTest;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.js.board.model.dto.BoardDTO;
import com.js.board.model.dto.BoardDTO2;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/root-context.xml"})
public class SelectListTest {

	
	@Autowired
	SqlSessionTemplate sqlSession;
	
	Logger log = LoggerFactory.getLogger(SelectListTest.class);
	
	@Test
	public void test() {
//		List<BoardDTO> list = sqlSession.selectList("board.selectList");
		List<BoardDTO2> list = sqlSession.selectList("board.selectList");
		log.info("list : {}", list);
	}
	
}
INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener]
INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@305fd85d, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@458c1321, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@11438d26, org.springframework.test.context.support.DirtiesContextTestExecutionListener@34cd072c, org.springframework.test.context.transaction.TransactionalTestExecutionListener@7a1ebcd8, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@5faeada1, org.springframework.test.context.event.EventPublishingTestExecutionListener@528931cf]
INFO : selectTest.SelectListTest - list : [BoardDTO2 [id=1, category=0, writer=sj, title=제목1, text=내용1, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=2, category=0, writer=sj, title=제목2, text=내용2, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=3, category=0, writer=sj, title=제목3, text=내용3, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=4, category=0, writer=sj, title=제목4, text=내용4, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=5, category=0, writer=sj, title=제목5, text=내용5, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=6, category=0, writer=sj, title=제목6, text=내용6, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=7, category=0, writer=sj, title=제목7, text=내용7, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=8, category=0, writer=sj, title=제목8, text=내용8, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=9, category=0, writer=sj, title=제목9, text=내용9, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=10, category=0, writer=sj, title=제목10, text=내용10, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=11, category=0, writer=sj, title=제목11, text=내용11, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=12, category=0, writer=sj, title=제목12, text=내용12, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=13, category=0, writer=sj, title=제목13, text=내용13, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=14, category=0, writer=sj, title=제목14, text=내용14, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=15, category=0, writer=sj, title=제목15, text=내용15, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=16, category=0, writer=sj, title=제목16, text=내용16, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=17, category=0, writer=sj, title=제목17, text=내용17, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=18, category=0, writer=sj, title=제목18, text=내용18, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=19, category=0, writer=sj, title=제목19, text=내용19, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=20, category=0, writer=sj, title=제목20, text=내용20, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=21, category=0, writer=sj, title=제목21, text=내용21, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=22, category=0, writer=sj, title=제목22, text=내용22, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=23, category=0, writer=sj, title=제목23, text=내용23, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=24, category=0, writer=sj, title=제목24, text=내용24, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=25, category=0, writer=sj, title=제목25, text=내용25, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=26, category=0, writer=sj, title=제목26, text=내용26, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=27, category=0, writer=sj, title=제목27, text=내용27, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=28, category=0, writer=sj, title=제목28, text=내용28, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=29, category=0, writer=sj, title=제목29, text=내용29, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=30, category=0, writer=sj, title=제목30, text=내용30, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=31, category=0, writer=sj, title=제목31, text=내용31, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=32, category=0, writer=sj, title=제목32, text=내용32, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=33, category=0, writer=sj, title=제목33, text=내용33, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=34, category=0, writer=sj, title=제목34, text=내용34, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=35, category=0, writer=sj, title=제목35, text=내용35, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=36, category=0, writer=sj, title=제목36, text=내용36, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=37, category=0, writer=sj, title=제목37, text=내용37, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=38, category=0, writer=sj, title=제목38, text=내용38, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=39, category=0, writer=sj, title=제목39, text=내용39, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=40, category=0, writer=sj, title=제목40, text=내용40, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=41, category=0, writer=sj, title=제목41, text=내용41, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=42, category=0, writer=sj, title=제목42, text=내용42, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=43, category=0, writer=sj, title=제목43, text=내용43, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=44, category=0, writer=sj, title=제목44, text=내영44, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=45, category=0, writer=sj, title=제목45, text=내용45, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=46, category=0, writer=sj, title=제목46, text=내용46, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=47, category=0, writer=sj, title=제목47, text=내용47, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=48, category=0, writer=sj, title=제목48, text=내용48, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=49, category=0, writer=sj, title=제목49, text=내용49, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=50, category=0, writer=sj, title=제목50, text=내용50, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=51, category=0, writer=sj, title=제목51, text=내용51, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=52, category=0, writer=sj, title=제목52, text=내용52, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=53, category=0, writer=sj, title=제목53, text=내용53, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=54, category=0, writer=sj, title=제목54, text=내용54, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=55, category=0, writer=sj, title=제목55, text=내용55, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=56, category=0, writer=sj, title=제목56, text=내용56, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=57, category=0, writer=sj, title=제목57, text=내용57, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=58, category=0, writer=sj, title=제목58, text=내용58, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=59, category=0, writer=sj, title=제목59, text=내용59, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=60, category=0, writer=sj, title=제목60, text=내용60, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=61, category=0, writer=sj, title=제목61, text=내용61, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=62, category=0, writer=sj, title=제목62, text=내용62, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=63, category=0, writer=sj, title=제목63, text=내용63, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=64, category=0, writer=sj, title=제목64, text=내용64, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=65, category=0, writer=sj, title=제목65, text=내용65, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=66, category=0, writer=sj, title=제목66, text=내용66, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=67, category=0, writer=sj, title=제목67, text=내용67, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=68, category=0, writer=sj, title=제목68, text=내용68, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=69, category=0, writer=sj, title=제목69, text=내용69, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=70, category=0, writer=sj, title=제목70, text=내용70, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=71, category=0, writer=sj, title=제목71, text=내용71, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=72, category=0, writer=sj, title=제목72, text=내용72, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=73, category=0, writer=sj, title=제목73, text=내용73, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=74, category=0, writer=sj, title=제목74, text=내용74, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=75, category=0, writer=sj, title=제목75, text=내용75, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=76, category=0, writer=sj, title=제목76, text=내용76, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=77, category=0, writer=sj, title=제목77, text=내용77, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=78, category=0, writer=sj, title=제목78, text=내용78, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=79, category=0, writer=sj, title=제목79, text=내용79, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=80, category=0, writer=sj, title=제목80, text=내용80, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=81, category=0, writer=sj, title=제목81, text=내용81, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=82, category=0, writer=sj, title=제목82, text=내용82, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=83, category=0, writer=sj, title=제목83, text=내용83, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=84, category=0, writer=sj, title=제목84, text=내용84, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=85, category=0, writer=sj, title=제목85, text=내용85, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=86, category=0, writer=sj, title=제목86, text=내용86, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=87, category=0, writer=sj, title=제목87, text=내용87, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=88, category=0, writer=sj, title=제목88, text=내용88, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=89, category=0, writer=sj, title=제목89, text=내용89, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=90, category=0, writer=sj, title=제목90, text=내용90, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=91, category=0, writer=sj, title=제목91, text=내용91, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=92, category=0, writer=sj, title=제목92, text=내용92, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=93, category=0, writer=sj, title=제목93, text=내용93, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=94, category=0, writer=sj, title=제목94, text=내용94, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=95, category=0, writer=sj, title=제목95, text=내용95, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=96, category=0, writer=sj, title=제목96, text=내용96, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=97, category=0, writer=sj, title=제목97, text=내용97, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=98, category=0, writer=sj, title=제목98, text=내용98, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=99, category=0, writer=sj, title=제목99, text=내용99, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=100, category=0, writer=sj, title=제목100, text=내용100, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=101, category=0, writer=sj, title=제목101, text=내용101, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=102, category=0, writer=sj, title=제목102, text=내용102, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=103, category=0, writer=sj, title=제목103, text=내용103, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=104, category=0, writer=sj, title=제목104, text=내용104, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=105, category=0, writer=sj, title=제목105, text=내용105, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=106, category=0, writer=sj, title=제목106, text=내용106, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=107, category=0, writer=sj, title=제목107, text=내용107, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=108, category=0, writer=sj, title=제목108, text=내용108, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=109, category=0, writer=sj, title=제목109, text=내용109, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=110, category=0, writer=sj, title=제목110, text=내영110, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=111, category=0, writer=sj, title=제목111, text=내용111, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=112, category=0, writer=sj, title=제목112, text=내용112, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=113, category=0, writer=sj, title=제목113, text=내용113, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=114, category=0, writer=sj, title=제목114, text=내용114, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=115, category=0, writer=sj, title=제목115, text=내용115, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=116, category=0, writer=sj, title=제목116, text=내용116, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=117, category=0, writer=sj, title=제목117, text=내용117, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=118, category=0, writer=sj, title=제목118, text=내용118, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=119, category=0, writer=sj, title=제목119, text=내용119, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=120, category=0, writer=sj, title=제목120, text=내용120, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=121, category=0, writer=sj, title=제목121, text=내용121, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=122, category=0, writer=sj, title=제목122, text=내용122, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=123, category=0, writer=sj, title=제목123, text=내용123, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=124, category=0, writer=sj, title=제목124, text=내용124, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=125, category=0, writer=sj, title=제목125, text=내용125, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=126, category=0, writer=sj, title=제목126, text=내용126, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=127, category=0, writer=sj, title=제목127, text=내용127, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=128, category=0, writer=sj, title=제목128, text=내용128, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=129, category=0, writer=sj, title=제목129, text=내용129, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=130, category=0, writer=sj, title=제목130, text=내용130, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=131, category=0, writer=sj, title=제목131, text=내용131, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=132, category=0, writer=sj, title=제목132, text=내용132, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=133, category=0, writer=sj, title=제목133, text=내용133, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=134, category=0, writer=sj, title=제목134, text=내용134, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=135, category=0, writer=sj, title=제목135, text=내용135, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=136, category=0, writer=sj, title=제목136, text=내용136, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=137, category=0, writer=sj, title=제목137, text=내용137, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=138, category=0, writer=sj, title=제목138, text=내용138, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=139, category=0, writer=sj, title=제목139, text=내용139, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=140, category=0, writer=sj, title=제목140, text=내용140, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=141, category=0, writer=sj, title=제목141, text=내용141, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=142, category=0, writer=sj, title=제목142, text=내용142, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=143, category=0, writer=sj, title=제목143, text=내용143, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=144, category=0, writer=sj, title=제목144, text=내용144, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=145, category=0, writer=sj, title=제목145, text=내용145, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=146, category=0, writer=sj, title=제목146, text=내용146, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=147, category=0, writer=sj, title=제목147, text=내용147, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=148, category=0, writer=sj, title=제목148, text=내용148, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=149, category=0, writer=sj, title=제목149, text=내용149, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=150, category=0, writer=sj, title=제목150, text=내용105, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=151, category=0, writer=sj, title=제목151, text=내용151, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=152, category=0, writer=sj, title=제목152, text=내용152, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=153, category=0, writer=sj, title=제목153, text=내용153, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=154, category=0, writer=sj, title=제목154, text=내용154, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=155, category=0, writer=sj, title=제목155, text=내용155, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=156, category=0, writer=sj, title=제목156, text=내용156, date=2021-06-17, reply=0, level=0, status=N], BoardDTO2 [id=157, category=0, writer=sj, title=제목157, text=내용157, date=2021-06-17, reply=0, level=0, status=N]]

test

변경 한 DTO로 데이터를 잘 가져와 지는 것을 확인할 수 있습니다.