스프링 프로젝트 1일차 - 2

BroJang·2022년 11월 1일

스프링

목록 보기
7/10

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를 사용

참고 한 게시글
링크1
링크2



기본 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의 멤버변수와 일치해야 한다.

값을 정상적으로 출력하는 것을 확인하였다.

profile
끊임없이 배우고 진보하는 백엔드 개발자입니다. 배움에 있어서 최선을 다하자!

0개의 댓글