본문 바로가기

반응형
사용자의 접근 순서에 맞춰서 개발을 하겠습니다. List > Create > Read > Update > Delete

 

1. Mapper 생성

Mapper 생성

 

2. DataBase Table 확인

 

3. Mapper 작성 (resultMap)

<?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="BoardMapper">
	
	<resultMap id="Board" type="java.util.HashMap">
		<result column="BOARD_SEQ" property="boardSeq" />
		<result column="WRITER" property="writer" />
		<result column="TITLE" property="title" />
		<result column="CONTENT" property="content" />
		<result column="REG_DATE" property="regDate" />
		
		<result column="UPT_DATE" property="uptDate" />
		<result column="VIEW_CNT" property="viewCnt" />
	</resultMap>
   
</mapper>

DB에서는 _를 사용하는 스네이크 케이스, Java(Spring)에서는 대문자로 구분하는 카멜 케이스를 쓰기 때문에, resultMap으로 둘을 매칭해준다. 

4. List 출력문 작성 (Mapper)

<select id="showBoardList" resultMap="Board">
    select
        board_seq,
        writer,
        title,
        content,
        reg_date,
        upt_date,
        view_cnt
    from board
    order by board_seq desc
</select>

이 Table의 PK를 내림차순으로 정렬하며 출력해준다.

5. Dao, DaoImpl 작성

// Dao
public interface BoardDao {
	List<Map<String, Object>> getList();
}

// DaoImpl
@Repository
public class BoardDaoImpl implements BoardDao{
	@Autowired
	private SqlSessionTemplate sqlSession;
	
	@Override
	public List<Map<String, Object>> getList(){
		return sqlSession.selectList("BoardMapper.showBoardList");
	}
}
  • "List<Map<String, Object>>"를 선택한 이유
    1. "Map<String, Object>" 선택 이유:
      • 각 게시글의 column명인 seq, title, reg_date 등은 각각 number, varchar, date 등의 다양한 자료형을 가지고 있습니다.
      • 따라서, 각 column의 값을 표현하기 위해 가장 범용적인 자료형인 Object를 사용했습니다.
      • Map은 key와 value의 쌍으로 데이터를 저장하는데, 여기서 key는 column명을 나타내는 String 자료형이고, value는 해당 column의 데이터를 나타내는 Object 자료형입니다.
    2. "List<> 선택 이유":
      • 여러 개의 게시글이 존재하므로 단일한 Map이 아닌 여러 개의 Map이 필요합니다.
      • 이러한 다수의 Map을 담기 위해 List를 사용했습니다.

6. Service, ServiceImpl 작성

// Service
public interface BoardService {
	List<Map<String, Object>> getList();
}

// ServiceImpl
@Service
public class BoardServiceImpl implements BoardService{
	@Autowired
	private BoardDao boardDao;
	
	@Override
	public List<Map<String, Object>> getList(){
		return boardDao.getList();
	}
}

 

7. Controller 작성

@Controller
public class BoardController {

	@Autowired
	private BoardService boardSer;

	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String list(Model model) {
    	List<Map<String, Object>> boardList = boardSer.getList();
        
    	model.addAttribute("boardList", boardList);
        
    	return "listPage";
    }
}

 

8. listPage.jsp 생성

 

9. listPage.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 prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<c:set var="path" value="${ pageContext.request.contextPath }" />
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<link rel="stylesheet" href="/resources/assets/css/style.css">
	<title>List Page</title>
</head>
<body>

	<header>
	<div class="container">
		<h1>List Page</h1>
	</div>
	</header>
	
	<nav>
		<div class='container'>
			<ul>
				<li><a href='#'>Home</a></li>
				<li><a href='#'>About</a></li>
				<li><a href='#'>Contact</a></li>
			</ul>
		</div>
	</nav>
	
	<main>
		<div class='container'>
			<table>
				<thead>
					<tr>
						<th><input type='checkbox' id='allChk'></th> <!-- 체크박스 -->
						<th>번호</th>
						<th>글쓴이</th>
						<th>제목</th>
						<th>만든 날짜</th>
						<th>수정 날짜</th>
						<th>조회수</th>
					</tr>
				</thead>
				
				<tbody>
					<c:forEach var="boardList" items='${boardList}'>
						<tr>
							<td><input type="checkbox" name="chkBox" value="${boardList.seq}"></td>
							<td>${boardList.boardSeq}</td>
							<td>${boardList.writer}</td>
							<td>${boardList.title}</td>
							<td><fmt:formatDate value="${boardList.regDate}" pattern="yyyy-MM-dd" /></td>
							<td><fmt:formatDate value="${boardList.uptDate}" pattern="yyyy-MM-dd" /></td>
							<td>${boardList.viewCnt}</td>
						</tr>
					</c:forEach>
				</tbody>
			</table>
		</div>
	</main>

</body>
</html>

 

10. 결과물

DB 데이터들


후기

가장 쉬운 부분이라 금방 할 줄 알았는데 사소한 오타로 고생을 꽤나 했습니다.
items를 item으로, type을 tyle로 써서 아예 실행이 안 되기도 하고 체크박스가 안나오고 다른 엉뚱한 것이 나오기도 했습니다. 가장 당황했던 부분은 DB 정보를 적지 않고 실행해서 생긴 오류였습니다...

오류 체크
1. items > item : /WEB-INF/views/listPage.jsp (행: [48], 열: [5]) TLD에 따르면, 속성 [item]은(는) 태그 [forEach]을(를) 위해 유효하지 않습니다.
2. DB 정보 오류 : Could not get JDBC Connection

 

반응형

'Spring > CRUD Project' 카테고리의 다른 글

[CRUD] Delete : 글 삭제하기  (1) 2023.11.27
[CRUD] Update : 글 수정하기  (1) 2023.11.24
[CRUD] Read : 글 읽기  (1) 2023.11.23
[CRUD] Create : 글 쓰기  (0) 2023.11.22
[CRUD] 개요 & 준비  (1) 2023.11.20
댓글