3층 1구역 - 개발의 장/Spring

spring - 회원제 게시판 구현하기 - 게시판(2) [목록 보기] (2022-11-07)

상이태상 2022. 11. 7. 19:32

1. 서론

게시물에 필자가 게시글을 남겨보았다.

이제 이 게시물의 데이터를 DB에서 가져와서 웹에서 볼 수 있게끔 작업하도록 하자.

 

2. 본론

먼저 top.jsp에서 게시판 a태그의 href를 교체해주도록 하자. 이건 전에 했던 회원목록 조회와 비슷한 맥락이다.

 

개념은 요기서 잡자!!!

2022.11.06 - [3층 - 개발의 장/Spring] - spring - 회원제 게시판 구현하기 - 회원 목록(1) [목록] (2022-11-06)

 

spring - 회원제 게시판 구현하기 - 회원 목록(1) [목록] (2022-11-06)

1. 서론 회원가입까지 끝났다. 이제 관리자 혹은 회원들이 자신의 개인정보를 확인해보거나 회원 탈퇴 및 수정 할 수 있는 페이지를 만들어보고자 한다. 이 페이지는 나중에 프로젝트 진행 시 관

sukw9512.tistory.com

 

top.jsp(전체)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<style type="text/css">
<!--

a:link{color:black;font-family:sans-serif;text-decoration:none;}
a:visited{color:black;font-family:sans-serif;text-decoration:none;}
a:hover{color:#cc3300; font-weight:bold; }
a:active{color:#ff00cc; text-decoration:underline; }
-->
</style>
<!-- root를 변수로 지정하여 '/'값을 넣어준다. -->
<c:url var="root" value="/" />
<table width=900>
	<tr><td align="center" colspan=5><h1>CARE Lab</h1></td></tr>
	<tr align="right">
		<td width=600></td>
		
		<!-- ${root}를 통해 http://localhost:8085/pra/경로까지 불러오고?
		index?formpath=HomeController.java의 value값을 지정하여 각 value가 갖고있는
		return값을 가져올 수 있다. -->
		<td><a href="${root }index?formpath=home">홈</a></td>
		<c:choose>
			<c:when test="${empty sessionScope.id }">
				<td><a href="${root }index?formpath=login">로그인</a></td>
			</c:when>
			<c:otherwise>
				<td><a href="${root }logout">로그아웃</a></td>
				<td><a href="${root }memberListProc">회원목록</a></td>
			</c:otherwise>
		</c:choose>
		<td><a href="${root }index?formpath=member">회원가입</a></td>
		<td><a href="${root }boardProc">게시판</a></td>
	</tr>
	<tr><td align="center" colspan=5><hr/></td></tr>
</table>

top.jsp(변경된 부분)

<td><a href="${root }boardProc">게시판</a></td>

간단하게 흐름만 말하자면??

 

게시물 작성, 회원가입, 로그인, 각종 수정요청

HomeController.java에서 페이지를 띄워준다 작성,로그인한다 → form태그가 controller로 정보를 보낸다

service가 검증 및 데이터를 저장하고 결과를 controller에게 보낸다 controller가 반환값을 띄운다.

 

회원목록, 게시판

controller에게 정보를 보낸다 sercvice가 해당하는 정보를 가져와 controller에게 보낸다 controller가 반환값을 homeController에게 보낸다 띄운다

 

top.jsp에서 boardProc이라고 value값을 보내면 그 값을 BoardController.java가 받게 된다.

 

BoardController.java(전체)

package com.care.pra.board.controller;

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.RequestMapping;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.care.pra.board.service.IBoardService;

@Controller
public class BoardController {
	
	//console창에 해당 로그가 찍힌다. 따라서 프로그램의 오류 발생 시 어디서 어떤 이유로 오류가 발생했는지
	//알 수 있어 이슈처리가 용이하다.
	final static Logger logger = LoggerFactory.getLogger(BoardController.class);
	
	@Autowired IBoardService service;
	
	@RequestMapping(value = "writeProc")
	public String writeProc(MultipartHttpServletRequest multi) {
		service.writeProc(multi);
		return "forward:boardProc";
	}
	
	@RequestMapping(value = "boardProc")
	public String boardProc(Model model) {
		service.boardProc(model, 0, null, null);
		return "forward:/index?formpath=board";
	}
}
@RequestMapping(value = "boardProc")
	public String boardProc(Model model) {
		service.boardProc(model, 0, null, null);
		return "forward:/index?formpath=board";
	}

그러면 서비스가 필요한 정보를 DAO에게 요청을 한다.

 

BoardServiceImpl.java(전체)

package com.care.pra.board.service;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.care.pra.board.BoardDTO;
import com.care.pra.board.repository.IBoardDAO;

@Service
public class BoardServiceImpl implements IBoardService{
	@Autowired IBoardDAO mapper;
	@Autowired HttpSession session;

	@Override
	public void writeProc(MultipartHttpServletRequest multi) {
		String id = (String)session.getAttribute("id");
		String title = multi.getParameter("title");
		String content = multi.getParameter("content");
		
		MultipartFile file = multi.getFile("fileName");
		
		BoardDTO dto = new BoardDTO();
		dto.setId(id);
		dto.setTitle(title);
		dto.setContent(content);
		dto.setHit(0);
		
		SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd");
		Date date = new Date();
		String writeDate = writeFormat.format(date);
		dto.setWriteDate(writeDate);

		if(file.getSize() != 0) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss-");
			Calendar calen = Calendar.getInstance();
			
			String fileName = sdf.format(calen.getTime()) + file.getOriginalFilename();
			dto.setFileName(fileName);
			File save = new File(IBoardService.FTLE_LOCATION + "\\" + fileName);
			try {
				file.transferTo(save);
			} catch (Exception e) {
			e.printStackTrace();
		}
	}else
		dto.setFileName("파일 없음");
		
		mapper.writeProc(dto);
		}

	@Override
	public void viewProc(int no, Model model) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void boardProc(Model model, int currentPage, String search, String select) {
		ArrayList<BoardDTO> boardList = mapper.boardProc();
		model.addAttribute("boardList", boardList);
		
	}

	@Override
	public void upHit(int no) {
		// TODO Auto-generated method stub
		
	}

}
@Override
	public void boardProc(Model model, int currentPage, String search, String select) {
		ArrayList<BoardDTO> boardList = mapper.boardProc();
		model.addAttribute("boardList", boardList);
		
	}

 

IBoardDAO.java(전체)

package com.care.pra.board.repository;

import java.util.ArrayList;

import org.springframework.stereotype.Repository;

import com.care.pra.board.BoardDTO;

@Repository
public interface IBoardDAO {
	
	void writeProc(BoardDTO dto);
	
	ArrayList<BoardDTO> boardProc();
}

 

boardMapper.xml(전체)

<?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="com.care.pra.board.repository.IBoardDAO">

	<insert id="writeProc" parameterType="com.care.pra.board.BoardDTO">
			<selectKey keyProperty="no" resultType="int" order="BEFORE">
				SELECT nvl(max(no), 0)+1 FROM quiz_board
			</selectKey>
		INSERT INTO quiz_board VALUES(#{no}, #{id}, #{title}, #{content}, #{fileName}, #{writeDate}, #{hit} )
	</insert>
	
	<select id="boardProc" resultType="com.care.pra.board.BoardDTO">
		SELECT * FROM quiz_board
	</select>

</mapper>

 

BoardServiceImpl.java(일부)

@Override
	public void boardProc(Model model, int currentPage, String search, String select) {
		ArrayList<BoardDTO> boardList = mapper.boardProc();
		model.addAttribute("boardList", boardList);
		
	}

model을 통해 받은 값은??

 

boardForm.jsp(전체)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<center>
<table style="width: 650px; ">
	<thead>
	<tr>
		<th style="width: 40px; height:20px;" align="center">선택</th>
		<th style="width: 330px; height:20px;" align="center">제 목</th>
		<th style="width: 80px; height:20px;" align="center">작성자</th>
		<th style="width: 120px; height:20px;" align="center">작성일</th>
		<th style="width: 80px; height:20px;" align="center">조회수</th>
	</tr>
	</thead>
	<tr>
		<td style="width: 40px; height:20px;" align="center"><hr/></td>
		<td style="width: 330px; height:20px;" align="center"><hr/></td>
		<td style="width: 80px; height:20px;" align="center"><hr/></td>
		<td style="width: 120px; height:20px;" align="center"><hr/></td>
		<td style="width: 80px; height:20px;" align="center"><hr/></td>
	</tr>
	<c:forEach var="list" items="${boardList }">
	<tr>
		<td style="width: 40px; height:40px;" align="center"><input value="${list.no }" type="checkbox"/></td>
		<td style="width: 330px; height:40px;" align="center">${list.title }</td>
		<td style="width: 80px; height:40px;" align="center">${list.id }</td>
		<td style="width: 120px; height:40px;" align="center">${list.writeDate }</td>
		<td style="width: 80px; height:40px;" align="center">${list.hit }</td>
	</tr>
	</c:forEach>
	<tr><td colspan=5><hr/></td></tr>
	<tr>
		<td colspan=2><input type="checkbox"/>전체선택</td>
		<td colspan=3 align="right">
			<input type="button" value='삭제' style="width: 100px; "/>
			<input type="button" value='글쓰기' style="width: 100px; " onclick="location.href='${root }index?formpath=write'" />
		</td>
	</tr>
	<tr><td colspan=5><hr/></td></tr>
</table>
이전 1 2 3 4 다음
<table>
<tr>
<td>
	<select>
		<option>전체</option>
		<option>제목</option>
		<option>작성자</option>
	</select>
	<input type=text name='search'/>
	<input type=button name='searchBtn' value='검색' style="width: 80px; "/>
</td>
</tr>
</table>
</center>

위 코드에서 forEach문을 사용할 때 쓰이게 된다. forEach가 돌면서 DAO값을 나열한다.

그래서 결과를 확인해 보면???

 

게시판에 게시물 목록이 전부 나오는 것을 볼 수 있고??

 

데이터베이스에서도 동일한 모습을 볼 수 있다.