반응형
사용자의 접근 순서에 맞춰서 개발을 하겠습니다. List > Create > Read > Update > Delete
1. 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>>"를 선택한 이유
- "Map<String, Object>" 선택 이유:
- 각 게시글의 column명인 seq, title, reg_date 등은 각각 number, varchar, date 등의 다양한 자료형을 가지고 있습니다.
- 따라서, 각 column의 값을 표현하기 위해 가장 범용적인 자료형인 Object를 사용했습니다.
- Map은 key와 value의 쌍으로 데이터를 저장하는데, 여기서 key는 column명을 나타내는 String 자료형이고, value는 해당 column의 데이터를 나타내는 Object 자료형입니다.
- "List<> 선택 이유":
- 여러 개의 게시글이 존재하므로 단일한 Map이 아닌 여러 개의 Map이 필요합니다.
- 이러한 다수의 Map을 담기 위해 List를 사용했습니다.
- "Map<String, Object>" 선택 이유:
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 |