ㅁ 실제 db 연동을 해본다.
ㅁ src/main/webapp/WEB-INF/views에 main.jsp 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>메인페이지</h2>
<a href="${ contextPath }/notice/list.do">공지사항 목록페이지로 이동</a>
</body>
</html>
ㅁ NoticeContoller
package com.br.sbatis.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.br.sbatis.dto.NoticeDto;
import com.br.sbatis.service.NoticeService;
import lombok.RequiredArgsConstructor;
@RequestMapping("/notice")
@RequiredArgsConstructor
@Controller
public class NoticeController {
private final NoticeService noticeService;
@GetMapping("/list.do")
public void noticeList() {
List<NoticeDto> list = noticeService.selectNoticeList();
}
}
ㅁ NoticeServiceImpl
package com.br.sbatis.service;
import java.util.List;
import org.springframework.stereotype.Service;
import com.br.sbatis.dao.NoticeDao;
import com.br.sbatis.dto.NoticeDto;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
public class NoticeServiceImpl implements NoticeService {
private final NoticeDao noticeDao;
@Override
public List<NoticeDto> selectNoticeList() {
return noticeDao.selectNoticeList();
}
@Override
public NoticeDto selectNoticeByNo(int noticeNo) {
return null;
}
@Override
public int insertNotice(NoticeDto n) {
return 0;
}
@Override
public int updateNotice(NoticeDto n) {
return 0;
}
@Override
public int deleteNotice(String[] deleteNo) {
return 0;
}
}
- db연동을 해도, 우리가 close할 필요 없다.
ㅁ NoticeDao
package com.br.sbatis.dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
import com.br.sbatis.dto.NoticeDto;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Repository
public class NoticeDao {
private final SqlSessionTemplate sqlSession;
public List<NoticeDto> selectNoticeList() {
return sqlSession.selectList("noticeMapper.selectNoticeList");
}
}
- 완성된 sql문이라 매개변수 하나짜리 selectList() 메소드를 사용한다.
ㅁ notice-mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="noticeMapper">
<resultMap id="noticeResultMap" type="NoticeDto">
<result column="no" property="no" />
<result column="title" property="title" />
<result column="content" property="content" />
</resultMap>
<select id="selectNoticeList" resultMap="noticeResultMap">
select
no
, title
, content
from notice
order
by no desc
</select>
</mapper>
- 지금은 컬럼명과 필드명이 같아서 resultMap을 작성하지 않아도 되지만, 나중에는 다른 경우가 많다.
resultMap도 만든다.
- resultMap의 type에는 풀클래스명이나 별칭이 와야 한다.
ㅁ logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender class="ch.qos.logback.core.ConsoleAppender" name="consoleLog">
<encoder>
<pattern>%-5level: [%date{yyyy-MM-dd HH:mm:ss}] [%logger:%line] - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="INFO" />
<logger name="com.br.sbatis" level="DEBUG" />
<root level="WARN">
<appender-ref ref="consoleLog" />
</root>
</configuration>
- 파일, 롤링파일 어펜더는 다 지웠다. 주석은 다 지웠다. root 태그에서도 파일, 롤링파일 어펜더는 다 지웠다.
ㅁ NoticeController 수정
package com.br.sbatis.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.br.sbatis.dto.NoticeDto;
import com.br.sbatis.service.NoticeService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RequestMapping("/notice")
@RequiredArgsConstructor
@Controller
public class NoticeController {
private final NoticeService noticeService;
@GetMapping("/list.do") // /notice/list.do
public void noticeList(Model model) {
List<NoticeDto> list = noticeService.selectNoticeList();
log.debug("list: {}", list);
model.addAttribute("list", list);
// return "notice/list"; void여도 포워딩하려 한다. url mapping("/notice/list")를 가지고 ~
}
}
- 응답 데이터 확인을 위해 로그를 찍어보고 싶을 때 Logger 객체를 내가 직접 필드로 선언해서 써도 되지만,
Lombok을 사용 중이라면 클래스 위에 @Slf4j 어노테이션을 붙이는 것만으로 log 객체를 사용할 수 있다.
- log.info(), log.debug() 등의 메서드를 통해 쉽게 로그를 출력할 수 있다.
ㅁ list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>공지사항 목록 페이지</h3>
<c:choose>
<c:when test="${ empty list }">
존재하는 공지사항이 없습니다
</c:when>
<c:otherwise>
<table border="1">
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>내용</th>
</tr>
</thead>
<tbody>
<c:forEach var="n" items="${ list }">
<tr>
<td>${ n.no }</td>
<td>${ n.title }</td>
<td>${ n.content }</td>
</tr>
</c:forEach>
</tbody>
</table>
</c:otherwise>
</c:choose>
</body>
</html>
'Spring' 카테고리의 다른 글
[Spring] MyBatis(4) 공지사항 목록페이지 -> 상세페이지 (0) | 2024.10.22 |
---|---|
[Spring] MyBatis(3) 자리 옮김 (2) | 2024.10.21 |
[Spring] MyBatis(1) 세팅 (0) | 2024.10.21 |
[Spring] MVC2 (7) ajax 회원관리 2번 페이지 (0) | 2024.10.21 |
[Spring] MVC2 (6) ajax5 - 6번째 버튼 (0) | 2024.10.21 |