~홍~

Spring 게시판 (3) _ 게시판 전체리스트 / 글작성 / 게시물 상세 정보 / 게시글 수정 본문

Spring/-

Spring 게시판 (3) _ 게시판 전체리스트 / 글작성 / 게시물 상세 정보 / 게시글 수정

~홍~ 2021. 4. 5. 19:30
728x90

1. 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.spring.board.BoardMapper">

<!-- 컬럼이름 : mybatis-config.xml의 name
	${컬럼이름} : DB 테이블의 열
	#{컬럼이름} : 입력받은 데이터 -->
	
	<!-- DB 쿼리 작성 -->
	<!-- id : dao의 메소드와 연결하기 위해 사용 -->
	
	<!-- 게시물 작성 -->
	<insert id="board_insert">
		insert into ${board} (${title}, ${content}, ${writer})
		values (#{title}, #{content}, #{writer})
	</insert>
	
	<!-- 게시물 전체 리스트 -->
	<select id="board_select_all" resultType="BoardVO">
		select * from ${board}
		order by ${bNo} desc
	</select>
	
	<!-- 게시물 상세 정보 -->
	<select id="board_select_bNo" resultType="BoardVO">
		select * from ${board}
		where ${bNo} = #{bNo}
	</select>
	
	<!-- 게시물 수정 -->
	<update id="board_update">
		update ${board}
		set ${title} = #{title}, ${writer} = #{writer}, ${content} = #{content}
		where ${bNo} = #{bNo}
	</update>
	
	
	<!-- resultType : select를 했을때 리턴하는 레코드 타입 선언
	- 일반적으로 패키지 이름을 포함한 전체경로의 클래스 이름을 사용해야함
	- mybatis-config.xml에서 typeAliases 속성을 package로 정의하여 클래스 이름만 사용 -->

</mapper>

 

 

2. DAO 생성  

- Java Resource >> src/main/java >> com.spring.board.persistence  package 생성 

- com.spring.board.persistence >> BoardDAO.java (interface)

 

BoardDAO 

package com.spring.board.persistence;

import java.util.List;

import com.spring.board.domain.BoardVO;

public interface BoardDAO {
	
	public abstract int insertBoard(BoardVO vo) throws Exception; // 게시글 작성

	public abstract List<BoardVO> selectBoard() throws Exception; // 전체 리스트
	public abstract BoardVO selectBoard(int bNo) throws Exception; // 게시글 정보 보기 
	
	public abstract int updateBoard(BoardVO vo) throws Exception; // 게시글 수정 
	
} // end BoardDAO 

 

3. DAOImple 생성  

- Java Resource >> src/main/java >> com.spring.board.persistence >> BoardDAOImple.java 

 

BoardDAOImple 

package com.spring.board.persistence;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.spring.board.domain.BoardVO;

@Repository // @Component
//- 영속 계층(Persistence Layer)의 DB 관련 기능을 담당
//- Spring Component bean으로 등록함
//- 스프링 프레임워크가 bean을 생성하기 위해서는
//root-context.xml에 bean으로 등록해야함
//- <context:component-scan ... />

public class BoardDAOImple implements BoardDAO {

	private static final Logger LOGGER = 
			LoggerFactory.getLogger(BoardDAOImple.class);
	private static final String NAMESPACE = 
			"com.spring.board.BoardMapper";
	
	// MyBatis의 SqlSession을 사용하기 위해서
		// 스프링 프레임워크가 생성한 bean을 주입(injection)받음
	@Autowired
	private SqlSession sqlSession;
	
	// 게시글 작성 
	@Override
	public int insertBoard(BoardVO vo) throws Exception {
		LOGGER.info("insertBoard() 호출");
		return sqlSession.insert(NAMESPACE + ".board_insert", vo);
	}

	// 게시글 전체 리스트 
	@Override
	public List<BoardVO> selectBoard() throws Exception {
		LOGGER.info("selectBoard() 전체 리스트 호출");
		return sqlSession.selectList(NAMESPACE + ".board_select_all");
	}

	// 게시글 정보 보기 
	@Override
	public BoardVO selectBoard(int bNo) throws Exception {
		LOGGER.info("selectBoard() 호출 : bNo = " + bNo);
		return sqlSession.selectOne(NAMESPACE + ".board_select_bNo", bNo);
	}

	// 게시글 수정  
	@Override
	public int updateBoard(BoardVO vo) throws Exception {
		LOGGER.info("updateBoard() 호출 : vo = " + vo);
		return sqlSession.update(NAMESPACE + ".board_update", vo);
	}

	
	
} // end BoardDAOImple

 

4. Junit 테스트  

- Java Resources >> src/test/java >> com.spring.board >> BoardDAOTest.java 생성 

2021.04.05 - [Spring] - Junit test

 

Junit test

Java Resources >> src/test/java >> com.spring.board >> OracleJDBCTest.class 생성  - OracleJDBCTest.class / Junit 테이스 package com.spring.board; import java.sql.Connection; import java.sql.DriverM..

hong1991.tistory.com

 

5. Service 생성  

- Java Resource >> src/main/java >> com.spring.board.service  package 생성  

- com.spring.board.service >> BoardService.java (interface) 생성 

 

BoardService

package com.spring.board.service;

import java.util.List;

import com.spring.board.domain.BoardVO;

// CRUD(CREAD, READ, UPDATE, DELETE)
public interface BoardService {

	public abstract int createBoard(BoardVO vo) throws Exception; // 게시글 작성
	public abstract List<BoardVO> readBoard() throws Exception; // 게시글 전체 리스트
	public abstract BoardVO readBoard(int bNo) throws Exception; // 게시판 번호로 선택 / 게시글 확인
	public abstract int updateBoard(BoardVO vo) throws Exception; // 게시글 수정
} // end BoardService

 

6. ServiceImple 생성

- Java Resource >> src/main/java >> com.spring.board.service >> BoardServiceImple 생성 

 

BoardServiceImple

package com.spring.board.service;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.spring.board.domain.BoardVO;
import com.spring.board.persistence.BoardDAO;

@Service 
// @Component
//스프링 프레임워크에게 서비스 계층(Service/Business layer)의 컴퍼넌트임을 알려주는 어노테이션
public class BoardServiceImple implements BoardService {

	private static final Logger LOGGER = 
			LoggerFactory.getLogger(BoardServiceImple.class);
	
	@Autowired
	private BoardDAO dao;

	// 게시글 작성  
	@Override
	public int createBoard(BoardVO vo) throws Exception {
		LOGGER.info("createBoard() 호출");
		return dao.insertBoard(vo);
	}

	// 게시글 전체 리스트 
	@Override
	public List<BoardVO> readBoard() throws Exception {
		LOGGER.info("readBoard() 전체리스트 호출");
		return dao.selectBoard();
	}

	// 게시판 번호로 선택 / 게시글 정보 확인 
	@Override
	public BoardVO readBoard(int bNo) throws Exception {
		LOGGER.info("readBoard() 호출 : bNo : " + bNo);
		return dao.selectBoard(bNo);
	}
	
	// 게시글 수정 
	@Override
	public int updateBoard(BoardVO vo) throws Exception {
		LOGGER.info("updateBoard() 호출");
		return dao.updateBoard(vo);
	}
	
} // end BoardServiceImple

 

7. Controller 생성 

- Java Resource >> src/main/java >> com.spring.board.controller  package 생성  

- com.spring.board.controller >> BoardController 생성 

 

  BoardController 

package com.spring.board.controller;

import java.util.List;

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 org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.spring.board.domain.BoardVO;
import com.spring.board.service.BoardService;


@Controller
@RequestMapping(value = "/") // url : /board/
public class BoardController {
	
	private static final Logger LOGGER = 
			LoggerFactory.getLogger(BoardController.class);
	
	@Autowired
	private BoardService boardService;

	
	// 게시판 전체 리스트 
	@GetMapping("board/list")
	public void list(Model model) throws Exception {
		LOGGER.info("board list 호출");
		
		List<BoardVO> list = boardService.readBoard();
		model.addAttribute("boardList", list);
		
	} // end list 
	
	// ---------------------------------------------------------
	
	// 게시글 작성 
	@GetMapping("board/register")
	public void getRegister() throws Exception {
		LOGGER.info("board register GET 호출");
		
	} // end getRegister 
	
	@PostMapping("board/register")
	public String postRegister(BoardVO vo, RedirectAttributes reAttr) throws Exception {
		LOGGER.info("board register POST 호출");
		
		int result = boardService.createBoard(vo);
		// "insert_result"의 키이름을 가진 데이터 전송
		if (result == 1) { // DB insert 성공 
			reAttr.addFlashAttribute("insert_result", "success");
			return "redirect:/board/list";
		} else { 
			reAttr.addFlashAttribute("insert_result", "fail");
			return "redirect:/board/register";
		}
		
	} // end postRegister 
	
	// ---------------------------------------------------------
	
	// 게시물 상세 검색  
	@GetMapping("board/info")
	public void GetInfo(Model model, @RequestParam("bNo") int bNo ) throws Exception { 
		LOGGER.info("board info 호출 : bNo = " + bNo);
		
		BoardVO vo = boardService.readBoard(bNo);
		model.addAttribute("boardVO", vo);
	} // end GetInfo
	
	// ---------------------------------------------------------

	// 게시글 수정 
	@GetMapping("board/update")
	public void GetUpdate(Model model, @RequestParam("bNo") int bNo) throws Exception {
		LOGGER.info("Board update GET 호출 : bNo =" + bNo);
		
		BoardVO vo = boardService.readBoard(bNo);
		model.addAttribute("boardVO", vo);
		
	} // end GetUpdate


	@PostMapping("board/update")
	public String postUpdate(BoardVO vo) throws Exception {
		LOGGER.info("Board update POST 호출 : vo =" + vo);
		
		int result = boardService.updateBoard(vo);
		if (result == 1) {
			return "redirect:/board/info?bNo=" + vo.getbNo();
		} else { 
			return "redirect:/board/update?bNo=" + vo.getbNo();
		}
	}


} // end BoardController 

 

8. Junit Test

- Java Resources >> src/test/java >> com.spring.board >> BoardControllerTest.java 생성 

2021.04.05 - [Spring] - Junit test

 

 

9. JSP 생성 

- src >> main >> webapp >> WEB-INF >> views >> board 파일 생성 

 

- board >> list.jsp 생성 ( 전체리스트 )

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" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!--  jstl 라이브러리중 fmt(포맷) 라이브러리를 -->
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 리스트</title>
</head>
<body>

<div id="nav">
	<%@ include file="../include/nav.jsp" %>
</div>

<table>
	<thead>
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성일</th>
			<th>작성자</th>
			<th>댓글수</th>
			<th>조회수</th>
		</tr>
	</thead>
	
	<tbody>
	
		<c:forEach items="${boardList }" var="list">
			<tr>
				<td>${list.bNo }</td>
				<td>
					<a href="info?bNo=${list.bNo }">${list.title }</a>
				</td>
				<td>
					<fmt:formatDate value="${list.bDate }" pattern="yyyy-MM-dd"/>
				</td>
				
				<td>${list.writer }</td>
				<td>${list.replyCnt }</td>
				<td>${list.viewCnt }</td>
			</tr>
		</c:forEach>
	
	</tbody>
</table>


</body>
</html>

 

- board >> register.jsp 생성 ( 게시글 작성 )

register.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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 작성</title>
</head>
<body>

<form method="post">

<label>제목</label>
<input type="text" name="title"><br>

<label>작성자</label>
<input type="text" name="writer"><br> 

<label>내용</label>
<textarea cols="50" rows="5" name="content"></textarea><br>

<button type="submit">제출</button>

</form>

</body>
</html>

- board >> info.jsp 생성 ( 게시글 상세 정보 )

info.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" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 조회</title>
</head>
<body>

<form method="post">

<label>제목</label>
${boardVO.title }<br>

<label>작성자</label>
${boardVO.writer }<br>

<label>내용</label>
${boardVO.content }<br>

</form>

</body>
</html>

- board >> update.jsp 생성 ( 게시글 수정 )

update.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" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시물 수정</title>
</head>
<body>

<form method="post">

<label>제목</label>
<input type="text" name="title" value="${boardVO.title }"><br>

<label>작성자</label>
<input type="text" name="writer" value="${boardVO.writer }"><br>

<label>내용</label>
<textarea cols="50" rows="5" name="content">${boardVO.content }</textarea>

<button type="submit">완료</button>

</form>

</body>
</html>

home.jsp 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>


<p>
<a href="board/list">게시물 목록</a>
<a href="board/register">게시물 작성</a>
</p>

</body>
</html>

 

Comments