servlet-context.xml
<context:component-scan base-package="com.brojang.controller" />
<context:component-scan base-package="com.brojang.model.vo" />
<context:component-scan base-package="com.brojang.model.service" />
com.brojang.controller / com.brojang.model.vo / com.brojang.model.service 패키지를 기준으로 클래스를 스캔한다. (미리 추가했습니다.)
context-scan
-> Bean으로 등록될 준비가 끝난 클래스를 Scan.
-> Bean으로 등록 (@Controller, @Service, @Component, @Repository 어노테이션을 붙인 클래스들이 Bean으로 등록될 준비를 마침. 4가지 어노테이션이 모두 Bean으로 등록된다.)
-> 일부 객체만 Bean으로 등록하고 싶을 경우 include-filter, exclude-filter를 사용
기본 home.jsp 실행
에러발생 : org.apache.jasper.JasperException 발생
원인 : pom.xml에 jstl jstl-1.2.jar 적용이 안되었던 문제
해당 jsp 소스에서 태그 라이브러리 관련해서 사용하려면 jstl 선언이 필요
해당 jstl 관련 라이브러리를 추가하지 않아서 문제 발생
localhost 실행 결과
정상적으로 출력되는 것을 확인하였으니, BOARD_TB 테이블 생성한 곳에 우선 데이터를 몇 행만 삽입한다.
결과
DB에 데이터를 넣었으니 홈페이지에서 데이터를 조회하는 기능을 구현해본다.
우선 데이터를 다루는 VO 객체를 생성한다. (vo 패키지에 BoardVO 생성)
package com.brojang.model.vo;
import java.util.Date;
public class BoardVO {
/**
* 게시글 번호
*/
private int bNo;
/**
* 게시글 작성자
*/
private String bWriter;
/**
* 게시글 제목
*/
private String bTitle;
/**
* 게시글 내용
*/
private String bContent;
/**
* 게시글 조회수
*/
private int bHitCount;
/**
* 게시글 작성일
*/
private Date bRegDate;
/**
* 게시글 수정일
*/
private Date bUpdate;
/**
* 게시글 삭제일
*/
private Date bDelDate;
/**
* 게시글 삭제 여부
*/
private String bDelBoard;
public int getbNo() {
return bNo;
}
public void setbNo(int bNo) {
this.bNo = bNo;
}
public String getbWriter() {
return bWriter;
}
public void setbWriter(String bWriter) {
this.bWriter = bWriter;
}
public String getbTitle() {
return bTitle;
}
public void setbTitle(String bTitle) {
this.bTitle = bTitle;
}
public String getbContent() {
return bContent;
}
public void setbContent(String bContent) {
this.bContent = bContent;
}
public int getbHitCount() {
return bHitCount;
}
public void setbHitCount(int bHitCount) {
this.bHitCount = bHitCount;
}
public Date getbRegDate() {
return bRegDate;
}
public void setbRegDate(Date bRegDate) {
this.bRegDate = bRegDate;
}
public Date getbUpdate() {
return bUpdate;
}
public void setbUpdate(Date bUpdate) {
this.bUpdate = bUpdate;
}
public Date getbDelDate() {
return bDelDate;
}
public void setbDelDate(Date bDelDate) {
this.bDelDate = bDelDate;
}
public String getbDelBoard() {
return bDelBoard;
}
public void setbDelBoard(String bDelBoard) {
this.bDelBoard = bDelBoard;
}
@Override
public String toString() {
return "BoardVO [bNo=" + bNo + ", bWriter=" + bWriter + ", bTitle=" + bTitle + ", bContent=" + bContent
+ ", bHitCount=" + bHitCount + ", bRegDate=" + bRegDate + ", bUpdate=" + bUpdate + ", bDelDate="
+ bDelDate + ", bDelBoard=" + bDelBoard + "]";
}
}
BoardMapper Interface 생성
package com.brojang.mapper;
import java.util.List;
import com.brojang.model.vo.BoardVO;
public interface BoardMapper {
/**
* 게시글 리스트
*/
public List<BoardVO> getList();
}
리스트의 개수가 한 개 이상이기 때문에 List로 BoardVO 객체를 담는다.
Mapper 작성
src/main/resources 폴더에 Mapper.xml 파일 생성
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mapper DTD 선언 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper>
<!-- 게시글 리스트 -->
<select id="getList" resultType="com.brojang.model.vo.BoardVO">
select * from board_tb
</select>
</mapper>
Mapper가 작성이 완료되면 해당 메서드가 정상적으로 작동하는지 테스트가 필요하다.
src/test/java 밑에 Mapper Test를 위한 패키지를 생성 후 JUnit 파일 생성
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class MapperTest {
private static final Logger log = LoggerFactory.getLogger(BoardMapper.class);
@Autowired
private BoardMapper mapper;
@Test
public void test() {
List list = mapper.getList();
for (int i = 0; i < list.size(); i++) {
log.info("" + list.get(i));
}
}
}
결과
정상적으로 값들을 가져오는 것을 확인하였다.
model.service 패키지에 BoardService 인터페이스 생성
import java.util.List;
import com.brojang.model.vo.BoardVO;
public interface BoardService {
/**
* 게시글 리스트
*/
public List<BoardVO> getList();
}
BoardServiceImpl class 생성 (BoardService Override)
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.brojang.mapper.BoardMapper;
import com.brojang.model.vo.BoardVO;
@Service
public class BoardServiceImpl implements BoardService{
@Autowired
private BoardMapper mapper;
@Override
public List<BoardVO> getList() {
return mapper.getList();
}
}
BoardMapper에 있는 getList를 가져온다.
id 값 = getList
Service에서도 값을 정상적으로 가져오는지 테스트 하기 위하여 BoardServiceTest Junit 생성
import org.junit.Test;
import org.junit.runner.RunWith;
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.brojang.model.service.BoardService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class BoardServiceTest {
private static final Logger log = LoggerFactory.getLogger(BoardServiceTest.class);
@Autowired
private BoardService boardService;
@Test
public void GetListTest() {
boardService.getList().forEach(list -> log.info("" + list));
}
}
결과
값들을 가져오는 것을 확인하였으니 Mapper -> Service -> Controller
BoardController 처리
View에 데이터를 전송해야 한다.
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.GetMapping;
import com.brojang.model.service.BoardService;
@Controller
public class BoardController {
private static final Logger log = LoggerFactory.getLogger(BoardController.class);
@Autowired
private BoardService boardService;
/**
* 게시판 목록
*/
@GetMapping("/list")
public void boardList(Model model) {
log.info("리스트 불러오기");
model.addAttribute("list", boardService.getList());
}
}
boardService의 getList 메소드에서 가져온 값을 "list" 속성에 담아온다.
그 후 list.jsp에 값을 출력한다.
views/list.jsp
list.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
<table border="1px solid black">
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="list">
<tr style="text-align: center;">
<td><c:out value="${list.bNo}" /></td>
<td><c:out value="${list.bTitle}" /></td>
<td><c:out value="${list.bWriter}" /></td>
<td><c:out value="${list.bRegDate}" /></td>
<td><c:out value="${list.bHitCount}" /></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</body>
</html>
items 속성에 서버에서 가져온 List 객체 ${list}를 속성값으로 부여한다 (key value)
${list 값 이후에는 BoardVO의 멤버변수와 일치해야 한다.
값을 정상적으로 출력하는 것을 확인하였다.