관리 메뉴

거니의 velog

231129_SPRING 2 (6-1) 본문

대덕인재개발원_웹기반 애플리케이션

231129_SPRING 2 (6-1)

Unlimited00 2023. 11. 29. 08:23
package kr.or.ddit.controller.database;

public class MybatisController {

	/*
	 * [ 12장. 마이바티스 ]
	 * 
	 * 		1. 마이바티스란?
	 * 
	 * 			마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을 사용하여 저장프로시저나 SQL문으로 객체들을 연결시킨다.
	 * 			마이바티스는 Apache 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
	 * 
	 * 			# 마이바티스를 사용함으로써 얻을 수 있는 이점
	 * 			- SQL의 체계적인 관리
	 * 			- 자바 객체와 SQL 입출력 값의 투명한 바인딩
	 * 			- 동적 SQL 조합
	 * 
	 * 			# 마이바티스 설정
	 * 
	 * 				1) 의존관계 정의
	 * 				- 총 6가지 라이브러리를 등록하여 관계를 정의한다. (DatabaseConnectContoller 참고)
	 * 
	 * 				2) 스프링과 마이바티스 연결 설정
	 * 				- root-context.xml 설정(DatabaseConnectController 참고)
	 * 				- 총 3가지를 등록하여 설정한다. (추가로 Mapper를 등록하기 위한 basePackage 정보도 함께 추가할 예정
	 * 
	 * 				3) 마이바티스 설정
	 * 				- WEB-INF/mybatisAlias/mybatisAlias.xml 설정
	 * 				- 마이바티스의 위치 설정은 root-context.xml의 'sqlSessionFactory' 설정 시, property 요소로 적용
	 * 
	 * 			# 관련 테이블 생성
	 *
	 *				- board 테이블 생성
	 *				- member 테이블 생성
	 *				- member_auth 테이블 생성
	 *
	 *		2. Mapper 인터페이스
	 *
	 *			- 인터페이스의 구현을 mybatis-spring에서 자동으로 생성할 수 있다.
	 *
	 *			1) 마이바티스 구현
	 *
	 *				1-1) Mapper 인터페이스
	 *				- BoardMapper.java 생성(인터페이스)
	 *
	 *				1-2) Mapper 인터페이스와 매핑할 Mapper
	 *				- sqlmap/boardMapper_SQL.xml 생성
	 *
	 *				1-3) 게시판 구현 설명
	 *
	 *				- 게시판 컨트롤러 만들기 (crud/CrudBoardController)
	 *				- 게시판 등록 화면 컨트롤러 메소드 만들기(crudRegister:get)
	 *				- 게시판 등록 화면 만들기 (crud/register.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 등록 기능 컨트롤러 메소드 만들기 (crudRegister:post)
	 *				- 게시판 등록 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper xml 쿼리 만들기
	 *				- 게시판 등록 완료 페이지 만들기
	 *				- 여기까지 확인
	 *
	 *				- 게시판 목록 화면 컨트롤러 메소드 만들기 (crudList:get)
	 *				- 게시판 목록 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 목록 화면 만들기 (crud/list.jsp)
	 *				- 여기까지 확인
	 */
	
}

package kr.or.ddit.controller.crud;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/crud/board")
public class CrudBoardController {

	@Inject
	private IBoardService service;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String crudRegisterForm() {
		log.info("crudRegisterForm() 실행...!");
		
		return "crud/register";
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String crudRegister(Board board, Model model) {
		log.info("crudRegister() 실행...!");
		
		service.register(board);
		// 게시글을 입력 후 최근 게시글 번호가 담겨있다(boardNo)
		log.info("게시글 등록 후 만들어진 최신 게시글 번호 : " + board.getBoardNo());
		
		model.addAttribute("msg", "등록이 완료되었습니다!");
		return "crud/success";
	}
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String crudList(Model model) {
		log.info("crudList() 실행...!");
		List<Board> boardList = service.list();
		model.addAttribute("boardList", boardList);
		return "crud/list";
	}
	
}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardService {

	public void register(Board board);
	public List<Board> list();

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IBoardMapper;
import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;

@Service
public class BoardServiceImpl implements IBoardService {

	@Inject
	private IBoardMapper mapper;
	
	@Override
	public void register(Board board) {
		mapper.create(board);
	}

	@Override
	public List<Board> list() {
		return mapper.list();
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardMapper {

	public void create(Board board);
	public List<Board> list();

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.or.ddit.mapper.IBoardMapper">
	
	<insert id="create" parameterType="board" useGeneratedKeys="true">
		<selectKey keyProperty="boardNo" resultType="int" order="BEFORE">
			select seq_board.nextval from dual
		</selectKey>
		insert into board(
			board_no, title, content, writer, reg_date
		) values (
			#{boardNo}, #{title}, #{content}, #{writer}, sysdate
		)
	</insert>
	
	<select id="list" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board
		order by board_no desc
	</select>
	
</mapper>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>CRUD BOARD LIST</title>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
	</head>
	<body>
		
		<h2>LIST</h2>
		<a href="/crud/board/register">등록</a>
		
		<form action="" method="post">
			<input type="text" name="title" id="title" value="" />
			<button type="submit">검색</button>
		</form>
		
		<table border="1">
			<tr>
				<td align="center" width="80">번호</td>
				<td align="center" width="320">제목</td>
				<td align="center" width="100">작성자</td>
				<td align="center" width="180">작성일</td>
			</tr>
			<c:choose>
				<c:when test="${empty boardList }">
					<tr>
						<td colspan="4">조회하실 게시물이 존재하지 않습니다.</td>
					</tr>
				</c:when>
				<c:otherwise>
					<c:forEach items="${boardList }" var="board">
						<tr>
							<td>${board.boardNo }</td>
							<td>
								<a href="/crud/board/read?boardNo=${board.boardNo }">${board.title }</a>
							</td>
							<td>${board.writer }</td>
							<td>
								<fmt:formatDate value="${board.regDate }" pattern="yyyy-MM-dd hh:mm"/>
							</td>
						</tr>
					</c:forEach>
				</c:otherwise>
			</c:choose>
		</table>
		
	</body>
</html>

- http://localhost/crud/board/list


package kr.or.ddit.controller.database;

public class MybatisController {

	/*
	 * [ 12장. 마이바티스 ]
	 * 
	 * 		1. 마이바티스란?
	 * 
	 * 			마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을 사용하여 저장프로시저나 SQL문으로 객체들을 연결시킨다.
	 * 			마이바티스는 Apache 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
	 * 
	 * 			# 마이바티스를 사용함으로써 얻을 수 있는 이점
	 * 			- SQL의 체계적인 관리
	 * 			- 자바 객체와 SQL 입출력 값의 투명한 바인딩
	 * 			- 동적 SQL 조합
	 * 
	 * 			# 마이바티스 설정
	 * 
	 * 				1) 의존관계 정의
	 * 				- 총 6가지 라이브러리를 등록하여 관계를 정의한다. (DatabaseConnectContoller 참고)
	 * 
	 * 				2) 스프링과 마이바티스 연결 설정
	 * 				- root-context.xml 설정(DatabaseConnectController 참고)
	 * 				- 총 3가지를 등록하여 설정한다. (추가로 Mapper를 등록하기 위한 basePackage 정보도 함께 추가할 예정
	 * 
	 * 				3) 마이바티스 설정
	 * 				- WEB-INF/mybatisAlias/mybatisAlias.xml 설정
	 * 				- 마이바티스의 위치 설정은 root-context.xml의 'sqlSessionFactory' 설정 시, property 요소로 적용
	 * 
	 * 			# 관련 테이블 생성
	 *
	 *				- board 테이블 생성
	 *				- member 테이블 생성
	 *				- member_auth 테이블 생성
	 *
	 *		2. Mapper 인터페이스
	 *
	 *			- 인터페이스의 구현을 mybatis-spring에서 자동으로 생성할 수 있다.
	 *
	 *			1) 마이바티스 구현
	 *
	 *				1-1) Mapper 인터페이스
	 *				- BoardMapper.java 생성(인터페이스)
	 *
	 *				1-2) Mapper 인터페이스와 매핑할 Mapper
	 *				- sqlmap/boardMapper_SQL.xml 생성
	 *
	 *				1-3) 게시판 구현 설명
	 *
	 *				- 게시판 컨트롤러 만들기 (crud/CrudBoardController)
	 *				- 게시판 등록 화면 컨트롤러 메소드 만들기(crudRegister:get)
	 *				- 게시판 등록 화면 만들기 (crud/register.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 등록 기능 컨트롤러 메소드 만들기 (crudRegister:post)
	 *				- 게시판 등록 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper xml 쿼리 만들기
	 *				- 게시판 등록 완료 페이지 만들기
	 *				- 여기까지 확인
	 *
	 *				- 게시판 목록 화면 컨트롤러 메소드 만들기 (crudList:get)
	 *				- 게시판 목록 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 목록 화면 만들기 (crud/list.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 상세 화면 컨트롤러 메소드 만들기 (crudRead:get)
	 *				- 게시판 상세 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 상세 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 상세 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 상세 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 상세 화면 만들기 (crud/read.jsp)
	 *				- 여기까지 확인!
	 */
	
}
package kr.or.ddit.controller.crud;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/crud/board")
public class CrudBoardController {

	@Inject
	private IBoardService service;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String crudRegisterForm() {
		log.info("crudRegisterForm() 실행...!");
		
		return "crud/register";
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String crudRegister(Board board, Model model) {
		log.info("crudRegister() 실행...!");
		
		service.register(board);
		// 게시글을 입력 후 최근 게시글 번호가 담겨있다(boardNo)
		log.info("게시글 등록 후 만들어진 최신 게시글 번호 : " + board.getBoardNo());
		
		model.addAttribute("msg", "등록이 완료되었습니다!");
		return "crud/success";
	}
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String crudList(Model model) {
		log.info("crudList() 실행...!");
		List<Board> boardList = service.list();
		model.addAttribute("boardList", boardList);
		return "crud/list";
	}
	
	@RequestMapping(value = "/read", method = RequestMethod.GET)
	public String crudRead(int boardNo, Model model) {
		log.info("crudRead() 실행...!");
		Board board = service.read(boardNo);
		model.addAttribute("board", board);
		return "crud/read";
	}
	
}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardService {

	public void register(Board board);
	public List<Board> list();
	public Board read(int boardNo);

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IBoardMapper;
import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;

@Service
public class BoardServiceImpl implements IBoardService {

	@Inject
	private IBoardMapper mapper;
	
	@Override
	public void register(Board board) {
		mapper.create(board);
	}

	@Override
	public List<Board> list() {
		return mapper.list();
	}

	@Override
	public Board read(int boardNo) {
		return mapper.read(boardNo);
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardMapper {

	public void create(Board board);
	public List<Board> list();
	public Board read(int boardNo);

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.or.ddit.mapper.IBoardMapper">
	
	<insert id="create" parameterType="board" useGeneratedKeys="true">
		<selectKey keyProperty="boardNo" resultType="int" order="BEFORE">
			select seq_board.nextval from dual
		</selectKey>
		insert into board(
			board_no, title, content, writer, reg_date
		) values (
			#{boardNo}, #{title}, #{content}, #{writer}, sysdate
		)
	</insert>
	
	<select id="list" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board
		order by board_no desc
	</select>
	
	<select id="read" parameterType="int" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board
		where 1=1
		and board_no = #{boardNo}
	</select>
	
</mapper>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>CRUD BOARD READ</title>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
	</head>
	<body>
		
		<h2>READ</h2>
		<table border="1">
			<tr>
				<td>제목</td>
				<td>${board.title }</td>
			</tr>
			<tr>
				<td>작성자</td>
				<td>${board.writer }</td>
			</tr>
			<tr>
				<td>내용</td>
				<td>
					<p style="white-space: pre-wrap;">${board.content }</p>
				</td>
			</tr>
			<tr>
				<td>작성일</td>
				<td>
					<fmt:formatDate value="${board.regDate }" pattern="yyyy-MM-dd hh:mm"/>
				</td>
			</tr>
		</table>
		<form action="/crud/board/remove" method="post" id="delForm" name="delForm">
			<input type="hidden" name="boardNo" value="${board.boardNo }" />
		</form>
		<div>
			<button type="button" id="modifyBtn">수정</button>
			<button type="button" id="deleteBtn">삭제</button>
			<button type="button" id="listBtn">목록</button>
		</div>
		
	</body>
	<script type="text/javascript">
		$(function(){
			var modifyBtn = $("#modifyBtn"); // 수정 버튼 Element
			var deleteBtn = $("#deleteBtn"); // 삭제 버튼 Element
			var listBtn = $("#listBtn"); // 목록 버튼 Element
			var delForm = $("#delForm"); // delForm Element
			
			modifyBtn.on("click", function(){
				delForm.attr("action", "/crud/board/modify");
				delForm.attr("method", "get");
				delForm.submit();
			});
			
			deleteBtn.on("click", function(){
				if(confirm("정말로 삭제하시겠습니까?")) {
					delForm.submit();
				}
			});
			
			listBtn.on("click", function(){
				location.href = "/crud/board/list";
			});
		});
	</script>
</html>

- http://localhost/crud/board/read?boardNo=2


package kr.or.ddit.controller.database;

public class MybatisController {

	/*
	 * [ 12장. 마이바티스 ]
	 * 
	 * 		1. 마이바티스란?
	 * 
	 * 			마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을 사용하여 저장프로시저나 SQL문으로 객체들을 연결시킨다.
	 * 			마이바티스는 Apache 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
	 * 
	 * 			# 마이바티스를 사용함으로써 얻을 수 있는 이점
	 * 			- SQL의 체계적인 관리
	 * 			- 자바 객체와 SQL 입출력 값의 투명한 바인딩
	 * 			- 동적 SQL 조합
	 * 
	 * 			# 마이바티스 설정
	 * 
	 * 				1) 의존관계 정의
	 * 				- 총 6가지 라이브러리를 등록하여 관계를 정의한다. (DatabaseConnectContoller 참고)
	 * 
	 * 				2) 스프링과 마이바티스 연결 설정
	 * 				- root-context.xml 설정(DatabaseConnectController 참고)
	 * 				- 총 3가지를 등록하여 설정한다. (추가로 Mapper를 등록하기 위한 basePackage 정보도 함께 추가할 예정
	 * 
	 * 				3) 마이바티스 설정
	 * 				- WEB-INF/mybatisAlias/mybatisAlias.xml 설정
	 * 				- 마이바티스의 위치 설정은 root-context.xml의 'sqlSessionFactory' 설정 시, property 요소로 적용
	 * 
	 * 			# 관련 테이블 생성
	 *
	 *				- board 테이블 생성
	 *				- member 테이블 생성
	 *				- member_auth 테이블 생성
	 *
	 *		2. Mapper 인터페이스
	 *
	 *			- 인터페이스의 구현을 mybatis-spring에서 자동으로 생성할 수 있다.
	 *
	 *			1) 마이바티스 구현
	 *
	 *				1-1) Mapper 인터페이스
	 *				- BoardMapper.java 생성(인터페이스)
	 *
	 *				1-2) Mapper 인터페이스와 매핑할 Mapper
	 *				- sqlmap/boardMapper_SQL.xml 생성
	 *
	 *				1-3) 게시판 구현 설명
	 *
	 *				- 게시판 컨트롤러 만들기 (crud/CrudBoardController)
	 *				- 게시판 등록 화면 컨트롤러 메소드 만들기(crudRegister:get)
	 *				- 게시판 등록 화면 만들기 (crud/register.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 등록 기능 컨트롤러 메소드 만들기 (crudRegister:post)
	 *				- 게시판 등록 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper xml 쿼리 만들기
	 *				- 게시판 등록 완료 페이지 만들기
	 *				- 여기까지 확인
	 *
	 *				- 게시판 목록 화면 컨트롤러 메소드 만들기 (crudList:get)
	 *				- 게시판 목록 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 목록 화면 만들기 (crud/list.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 상세 화면 컨트롤러 메소드 만들기 (crudRead:get)
	 *				- 게시판 상세 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 상세 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 상세 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 상세 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 상세 화면 만들기 (crud/read.jsp)
	 *				- 여기까지 확인!
	 *
	 *				- 게시판 수정 화면 컨트롤러 메소드 만들기 (crudModify:get)
	 *				- 게시판 수정 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 수정 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 수정 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 수정 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 수정 화면 만들기 (crud/register.jsp)
	 *				- 게시판 수정 기능 컨트롤러 메소드 만들기 (crudModify:post)
	 *				- 게시판 수정 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 수정 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 수정 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 수정 기능 Mapper xml 쿼리 만들기
	 *				- 여기까지 확인!
	 */
	
}
package kr.or.ddit.controller.crud;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/crud/board")
public class CrudBoardController {

	@Inject
	private IBoardService service;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String crudRegisterForm() {
		log.info("crudRegisterForm() 실행...!");
		
		return "crud/register";
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String crudRegister(Board board, Model model) {
		log.info("crudRegister() 실행...!");
		
		service.register(board);
		// 게시글을 입력 후 최근 게시글 번호가 담겨있다(boardNo)
		log.info("게시글 등록 후 만들어진 최신 게시글 번호 : " + board.getBoardNo());
		
		model.addAttribute("msg", "등록이 완료되었습니다!");
		return "crud/success";
	}
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String crudList(Model model) {
		log.info("crudList() 실행...!");
		List<Board> boardList = service.list();
		model.addAttribute("boardList", boardList);
		return "crud/list";
	}
	
	@RequestMapping(value = "/read", method = RequestMethod.GET)
	public String crudRead(int boardNo, Model model) {
		log.info("crudRead() 실행...!");
		Board board = service.read(boardNo);
		model.addAttribute("board", board);
		return "crud/read";
	}
	
	@RequestMapping(value = "/modify", method = RequestMethod.GET)
	public String crudModifyForm(int boardNo, Model model) {
		log.info("crudModifyForm() 실행...!");
		Board board = service.read(boardNo);
		model.addAttribute("board", board);
		model.addAttribute("status", "u"); // '수정을 진행합니다' 라는 flag
		return "crud/register";
	}
	
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>CRUD REGISTER</title>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
	</head>
	<body>
		<h2>REGISTER</h2>
		<form action="/crud/board/register" method="post" id="registerForm" name="registerForm">
		
			<c:if test="${status eq 'u' }">
				<input type="hidden" name="boardNo" value="${board.boardNo }" />
			</c:if>
			
			<table border="1">
				<tr>
					<td>제목</td>
					<td><input type="text" id="title" name="title" value="${board.title }" /></td>
				</tr>
				<tr>
					<td>작성자</td>
					<td><input type="text" id="writer" name="writer" value="${board.writer }" /></td>
				</tr>
				<tr>
					<td>내용</td>
					<td>
						<textarea rows="10" cols="40" name="content" id="content" wrap="soft">${board.content }</textarea>
					</td>
				</tr>
			</table>
			<div>
				<c:set value="등록" var="btnText" />
				<c:if test="${status eq 'u' }">
					<c:set value="수정" var="btnText" />
				</c:if>
				<button type="button" id="registerBtn">${btnText }</button>
				<c:if test="${status eq 'u' }">
					<button type="button" id="cancelBtn">취소</button>
				</c:if>
				<c:if test="${status ne 'u' }">
					<button type="button" id="listBtn">목록</button>
				</c:if>
			</div>
		</form>
	</body>
	<script type="text/javascript">
		$(function(){
			
			var registerForm = $("#registerForm"); // form element
			var registerBtn = $("#registerBtn"); // 등록 버튼 element
			var listBtn = $("#listBtn"); // 목록 버튼 element
			var cancelBtn = $("#cancelBtn"); // 취소 버튼 element
			
			registerBtn.on("click", function(){
				var title = $("#title").val();
				var writer = $("#writer").val();
				var content = $("#content").val();
				
				if(!title) {
					alert("제목을 입력해 주세요!");
					return false;
				}
				
				if(!writer) {
					alert("작성자를 입력해 주세요!");
					return false;
				}
				
				if(!content) {
					alert("내용을 입력해 주세요!");
					return false;
				}
				
				// 수정일 때 수정 경로로 변경한다.
				if($(this).text() == "수정") {
					registerForm.attr("action", "/crud/board/modify");
				}
				
				registerForm.submit();
			});
			
			listBtn.on("click", function(){
				location.href = "/crud/board/list";
			});
			
			cancelBtn.on("click", function(){
				location.href = "/crud/board/read?boardNo=${board.boardNo}";
			});
			
		});
	</script>
</html>
package kr.or.ddit.controller.crud;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/crud/board")
public class CrudBoardController {

	@Inject
	private IBoardService service;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String crudRegisterForm() {
		log.info("crudRegisterForm() 실행...!");
		
		return "crud/register";
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String crudRegister(Board board, Model model) {
		log.info("crudRegister() 실행...!");
		
		service.register(board);
		// 게시글을 입력 후 최근 게시글 번호가 담겨있다(boardNo)
		log.info("게시글 등록 후 만들어진 최신 게시글 번호 : " + board.getBoardNo());
		
		model.addAttribute("msg", "등록이 완료되었습니다!");
		return "crud/success";
	}
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String crudList(Model model) {
		log.info("crudList() 실행...!");
		List<Board> boardList = service.list();
		model.addAttribute("boardList", boardList);
		return "crud/list";
	}
	
	@RequestMapping(value = "/read", method = RequestMethod.GET)
	public String crudRead(int boardNo, Model model) {
		log.info("crudRead() 실행...!");
		Board board = service.read(boardNo);
		model.addAttribute("board", board);
		return "crud/read";
	}
	
	@RequestMapping(value = "/modify", method = RequestMethod.GET)
	public String crudModifyForm(int boardNo, Model model) {
		log.info("crudModifyForm() 실행...!");
		Board board = service.read(boardNo);
		model.addAttribute("board", board);
		model.addAttribute("status", "u"); // '수정을 진행합니다' 라는 flag
		return "crud/register";
	}
	
	@RequestMapping(value = "/modify", method = RequestMethod.POST)
	public String crudModify(Board board, Model model) {
		log.info("crudModify() 실행...!");
		service.modify(board);
		model.addAttribute("msg", "수정이 완료되었습니다.");
		return "crud/success";
	}
	
}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardService {

	public void register(Board board);
	public List<Board> list();
	public Board read(int boardNo);
	public void modify(Board board);

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IBoardMapper;
import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;

@Service
public class BoardServiceImpl implements IBoardService {

	@Inject
	private IBoardMapper mapper;
	
	@Override
	public void register(Board board) {
		mapper.create(board);
	}

	@Override
	public List<Board> list() {
		return mapper.list();
	}

	@Override
	public Board read(int boardNo) {
		return mapper.read(boardNo);
	}

	@Override
	public void modify(Board board) {
		mapper.update(board);
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardMapper {

	public void create(Board board);
	public List<Board> list();
	public Board read(int boardNo);
	public void update(Board board);

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.or.ddit.mapper.IBoardMapper">
	
	<insert id="create" parameterType="board" useGeneratedKeys="true">
		<selectKey keyProperty="boardNo" resultType="int" order="BEFORE">
			select seq_board.nextval from dual
		</selectKey>
		insert into board(
			board_no, title, content, writer, reg_date
		) values (
			#{boardNo}, #{title}, #{content}, #{writer}, sysdate
		)
	</insert>
	
	<select id="list" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board
		order by board_no desc
	</select>
	
	<select id="read" parameterType="int" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board
		where 1=1
		and board_no = #{boardNo}
	</select>
	
	<update id="update" parameterType="board">
		update board 
		set 
			title = #{title},
			content = #{content}
		where board_no = #{boardNo}
	</update>
	
</mapper>

- http://localhost/crud/board/modify?boardNo=2


package kr.or.ddit.controller.database;

public class MybatisController {

	/*
	 * [ 12장. 마이바티스 ]
	 * 
	 * 		1. 마이바티스란?
	 * 
	 * 			마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을 사용하여 저장프로시저나 SQL문으로 객체들을 연결시킨다.
	 * 			마이바티스는 Apache 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
	 * 
	 * 			# 마이바티스를 사용함으로써 얻을 수 있는 이점
	 * 			- SQL의 체계적인 관리
	 * 			- 자바 객체와 SQL 입출력 값의 투명한 바인딩
	 * 			- 동적 SQL 조합
	 * 
	 * 			# 마이바티스 설정
	 * 
	 * 				1) 의존관계 정의
	 * 				- 총 6가지 라이브러리를 등록하여 관계를 정의한다. (DatabaseConnectContoller 참고)
	 * 
	 * 				2) 스프링과 마이바티스 연결 설정
	 * 				- root-context.xml 설정(DatabaseConnectController 참고)
	 * 				- 총 3가지를 등록하여 설정한다. (추가로 Mapper를 등록하기 위한 basePackage 정보도 함께 추가할 예정
	 * 
	 * 				3) 마이바티스 설정
	 * 				- WEB-INF/mybatisAlias/mybatisAlias.xml 설정
	 * 				- 마이바티스의 위치 설정은 root-context.xml의 'sqlSessionFactory' 설정 시, property 요소로 적용
	 * 
	 * 			# 관련 테이블 생성
	 *
	 *				- board 테이블 생성
	 *				- member 테이블 생성
	 *				- member_auth 테이블 생성
	 *
	 *		2. Mapper 인터페이스
	 *
	 *			- 인터페이스의 구현을 mybatis-spring에서 자동으로 생성할 수 있다.
	 *
	 *			1) 마이바티스 구현
	 *
	 *				1-1) Mapper 인터페이스
	 *				- BoardMapper.java 생성(인터페이스)
	 *
	 *				1-2) Mapper 인터페이스와 매핑할 Mapper
	 *				- sqlmap/boardMapper_SQL.xml 생성
	 *
	 *				1-3) 게시판 구현 설명
	 *
	 *				- 게시판 컨트롤러 만들기 (crud/CrudBoardController)
	 *				- 게시판 등록 화면 컨트롤러 메소드 만들기(crudRegister:get)
	 *				- 게시판 등록 화면 만들기 (crud/register.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 등록 기능 컨트롤러 메소드 만들기 (crudRegister:post)
	 *				- 게시판 등록 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper xml 쿼리 만들기
	 *				- 게시판 등록 완료 페이지 만들기
	 *				- 여기까지 확인
	 *
	 *				- 게시판 목록 화면 컨트롤러 메소드 만들기 (crudList:get)
	 *				- 게시판 목록 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 목록 화면 만들기 (crud/list.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 상세 화면 컨트롤러 메소드 만들기 (crudRead:get)
	 *				- 게시판 상세 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 상세 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 상세 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 상세 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 상세 화면 만들기 (crud/read.jsp)
	 *				- 여기까지 확인!
	 *
	 *				- 게시판 수정 화면 컨트롤러 메소드 만들기 (crudModify:get)
	 *				- 게시판 수정 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 수정 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 수정 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 수정 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 수정 화면 만들기 (crud/register.jsp)
	 *				- 게시판 수정 기능 컨트롤러 메소드 만들기 (crudModify:post)
	 *				- 게시판 수정 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 수정 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 수정 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 수정 기능 Mapper xml 쿼리 만들기
	 *				- 여기까지 확인!
	 *
	 *				- 게시판 삭제 기능 컨트롤러 메소드 만들기 (crudRemove:post)
	 *				- 게시판 삭제 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 삭제 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 삭제 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 삭제 기능 Mapper xml 쿼리 만들기
	 *				- 여기까지 확인!
	 */
	
}
package kr.or.ddit.controller.crud;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/crud/board")
public class CrudBoardController {

	@Inject
	private IBoardService service;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String crudRegisterForm() {
		log.info("crudRegisterForm() 실행...!");
		
		return "crud/register";
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String crudRegister(Board board, Model model) {
		log.info("crudRegister() 실행...!");
		
		service.register(board);
		// 게시글을 입력 후 최근 게시글 번호가 담겨있다(boardNo)
		log.info("게시글 등록 후 만들어진 최신 게시글 번호 : " + board.getBoardNo());
		
		model.addAttribute("msg", "등록이 완료되었습니다!");
		return "crud/success";
	}
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String crudList(Model model) {
		log.info("crudList() 실행...!");
		List<Board> boardList = service.list();
		model.addAttribute("boardList", boardList);
		return "crud/list";
	}
	
	@RequestMapping(value = "/read", method = RequestMethod.GET)
	public String crudRead(int boardNo, Model model) {
		log.info("crudRead() 실행...!");
		Board board = service.read(boardNo);
		model.addAttribute("board", board);
		return "crud/read";
	}
	
	@RequestMapping(value = "/modify", method = RequestMethod.GET)
	public String crudModifyForm(int boardNo, Model model) {
		log.info("crudModifyForm() 실행...!");
		Board board = service.read(boardNo);
		model.addAttribute("board", board);
		model.addAttribute("status", "u"); // '수정을 진행합니다' 라는 flag
		return "crud/register";
	}
	
	@RequestMapping(value = "/modify", method = RequestMethod.POST)
	public String crudModify(Board board, Model model) {
		log.info("crudModify() 실행...!");
		service.modify(board);
		model.addAttribute("msg", "수정이 완료되었습니다.");
		return "crud/success";
	}
	
	@RequestMapping(value = "/remove", method = RequestMethod.POST)
	public String crudDelete(int boardNo, Model model) {
		log.info("crudDelete() 실행...!");
		service.remove(boardNo);
		model.addAttribute("msg", "삭제가 완료되었습니다.");
		return "crud/success";
	}
	
}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardService {

	public void register(Board board);
	public List<Board> list();
	public Board read(int boardNo);
	public void modify(Board board);
	public void remove(int boardNo);

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IBoardMapper;
import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;

@Service
public class BoardServiceImpl implements IBoardService {

	@Inject
	private IBoardMapper mapper;
	
	@Override
	public void register(Board board) {
		mapper.create(board);
	}

	@Override
	public List<Board> list() {
		return mapper.list();
	}

	@Override
	public Board read(int boardNo) {
		return mapper.read(boardNo);
	}

	@Override
	public void modify(Board board) {
		mapper.update(board);
	}

	@Override
	public void remove(int boardNo) {
		mapper.delete(boardNo);
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardMapper {

	public void create(Board board);
	public List<Board> list();
	public Board read(int boardNo);
	public void update(Board board);
	public void delete(int boardNo);

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.or.ddit.mapper.IBoardMapper">
	
	<insert id="create" parameterType="board" useGeneratedKeys="true">
		<selectKey keyProperty="boardNo" resultType="int" order="BEFORE">
			select seq_board.nextval from dual
		</selectKey>
		insert into board(
			board_no, title, content, writer, reg_date
		) values (
			#{boardNo}, #{title}, #{content}, #{writer}, sysdate
		)
	</insert>
	
	<select id="list" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board
		order by board_no desc
	</select>
	
	<select id="read" parameterType="int" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board
		where 1=1
		and board_no = #{boardNo}
	</select>
	
	<update id="update" parameterType="board">
		update board 
		set 
			title = #{title},
			content = #{content}
		where board_no = #{boardNo}
	</update>
	
	<delete id="delete" parameterType="int">
		delete from board where board_no = #{boardNo}
	</delete>
	
</mapper>


package kr.or.ddit.controller.database;

public class MybatisController {

	/*
	 * [ 12장. 마이바티스 ]
	 * 
	 * 		1. 마이바티스란?
	 * 
	 * 			마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을 사용하여 저장프로시저나 SQL문으로 객체들을 연결시킨다.
	 * 			마이바티스는 Apache 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
	 * 
	 * 			# 마이바티스를 사용함으로써 얻을 수 있는 이점
	 * 			- SQL의 체계적인 관리
	 * 			- 자바 객체와 SQL 입출력 값의 투명한 바인딩
	 * 			- 동적 SQL 조합
	 * 
	 * 			# 마이바티스 설정
	 * 
	 * 				1) 의존관계 정의
	 * 				- 총 6가지 라이브러리를 등록하여 관계를 정의한다. (DatabaseConnectContoller 참고)
	 * 
	 * 				2) 스프링과 마이바티스 연결 설정
	 * 				- root-context.xml 설정(DatabaseConnectController 참고)
	 * 				- 총 3가지를 등록하여 설정한다. (추가로 Mapper를 등록하기 위한 basePackage 정보도 함께 추가할 예정
	 * 
	 * 				3) 마이바티스 설정
	 * 				- WEB-INF/mybatisAlias/mybatisAlias.xml 설정
	 * 				- 마이바티스의 위치 설정은 root-context.xml의 'sqlSessionFactory' 설정 시, property 요소로 적용
	 * 
	 * 			# 관련 테이블 생성
	 *
	 *				- board 테이블 생성
	 *				- member 테이블 생성
	 *				- member_auth 테이블 생성
	 *
	 *		2. Mapper 인터페이스
	 *
	 *			- 인터페이스의 구현을 mybatis-spring에서 자동으로 생성할 수 있다.
	 *
	 *			1) 마이바티스 구현
	 *
	 *				1-1) Mapper 인터페이스
	 *				- BoardMapper.java 생성(인터페이스)
	 *
	 *				1-2) Mapper 인터페이스와 매핑할 Mapper
	 *				- sqlmap/boardMapper_SQL.xml 생성
	 *
	 *				1-3) 게시판 구현 설명
	 *
	 *				- 게시판 컨트롤러 만들기 (crud/CrudBoardController)
	 *				- 게시판 등록 화면 컨트롤러 메소드 만들기(crudRegister:get)
	 *				- 게시판 등록 화면 만들기 (crud/register.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 등록 기능 컨트롤러 메소드 만들기 (crudRegister:post)
	 *				- 게시판 등록 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper xml 쿼리 만들기
	 *				- 게시판 등록 완료 페이지 만들기
	 *				- 여기까지 확인
	 *
	 *				- 게시판 목록 화면 컨트롤러 메소드 만들기 (crudList:get)
	 *				- 게시판 목록 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 목록 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 목록 화면 만들기 (crud/list.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 상세 화면 컨트롤러 메소드 만들기 (crudRead:get)
	 *				- 게시판 상세 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 상세 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 상세 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 상세 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 상세 화면 만들기 (crud/read.jsp)
	 *				- 여기까지 확인!
	 *
	 *				- 게시판 수정 화면 컨트롤러 메소드 만들기 (crudModify:get)
	 *				- 게시판 수정 화면 서비스 인터페이스 메소드 만들기
	 *				- 게시판 수정 화면 서비스 클래스 메소드 만들기
	 *				- 게시판 수정 화면 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 수정 화면 Mapper xml 쿼리 만들기
	 *				- 게시판 수정 화면 만들기 (crud/register.jsp)
	 *				- 게시판 수정 기능 컨트롤러 메소드 만들기 (crudModify:post)
	 *				- 게시판 수정 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 수정 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 수정 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 수정 기능 Mapper xml 쿼리 만들기
	 *				- 여기까지 확인!
	 *
	 *				- 게시판 삭제 기능 컨트롤러 메소드 만들기 (crudRemove:post)
	 *				- 게시판 삭제 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 삭제 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 삭제 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 삭제 기능 Mapper xml 쿼리 만들기
	 *				- 여기까지 확인!
	 *
	 *				- 게시판 목록 화면 검색 페이지 추가(crud/board/list.jsp)
	 *				- 게시판 검색 기능 컨트롤러 메소드 추가(crudSearch:post)
	 *				- 게시판 검색 기능 서비스 인터페이스 메소드 추가
	 *				- 게시판 검색 기능 서비스 클래스 메소드 추가
	 *				- 게시판 검색 기능 Mapper 메소드 추가
	 *				- 게시판 검색 기능 Mapper xml 쿼리 추가
	 *				- 여기까지 확인
	 *
	 *				- 기본 CRUD 끝
	 */
	
}
package kr.or.ddit.controller.crud;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/crud/board")
public class CrudBoardController {

	@Inject
	private IBoardService service;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String crudRegisterForm() {
		log.info("crudRegisterForm() 실행...!");
		
		return "crud/register";
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String crudRegister(Board board, Model model) {
		log.info("crudRegister() 실행...!");
		
		service.register(board);
		// 게시글을 입력 후 최근 게시글 번호가 담겨있다(boardNo)
		log.info("게시글 등록 후 만들어진 최신 게시글 번호 : " + board.getBoardNo());
		
		model.addAttribute("msg", "등록이 완료되었습니다!");
		return "crud/success";
	}
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String crudList(Model model) {
		log.info("crudList() 실행...!");
		List<Board> boardList = service.list();
		model.addAttribute("boardList", boardList);
		return "crud/list";
	}
	
	@RequestMapping(value = "/read", method = RequestMethod.GET)
	public String crudRead(int boardNo, Model model) {
		log.info("crudRead() 실행...!");
		Board board = service.read(boardNo);
		model.addAttribute("board", board);
		return "crud/read";
	}
	
	@RequestMapping(value = "/modify", method = RequestMethod.GET)
	public String crudModifyForm(int boardNo, Model model) {
		log.info("crudModifyForm() 실행...!");
		Board board = service.read(boardNo);
		model.addAttribute("board", board);
		model.addAttribute("status", "u"); // '수정을 진행합니다' 라는 flag
		return "crud/register";
	}
	
	@RequestMapping(value = "/modify", method = RequestMethod.POST)
	public String crudModify(Board board, Model model) {
		log.info("crudModify() 실행...!");
		service.modify(board);
		model.addAttribute("msg", "수정이 완료되었습니다.");
		return "crud/success";
	}
	
	@RequestMapping(value = "/remove", method = RequestMethod.POST)
	public String crudDelete(int boardNo, Model model) {
		log.info("crudDelete() 실행...!");
		service.remove(boardNo);
		model.addAttribute("msg", "삭제가 완료되었습니다.");
		return "crud/success";
	}
	
	@RequestMapping(value = "/search", method = RequestMethod.POST)
	public String crudSearch(String title, Model model) {
		log.info("crudSearch() 실행...!");
		Board board = new Board();
		board.setTitle(title);
		
		List<Board> boardList = service.search(board);
		model.addAttribute("boardList", boardList);
		model.addAttribute("board", board);
		return "crud/list";
	}
	
}
package kr.or.ddit.service;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardService {

	public void register(Board board);
	public List<Board> list();
	public Board read(int boardNo);
	public void modify(Board board);
	public void remove(int boardNo);
	public List<Board> search(Board board);

}
package kr.or.ddit.service.impl;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IBoardMapper;
import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;

@Service
public class BoardServiceImpl implements IBoardService {

	@Inject
	private IBoardMapper mapper;
	
	@Override
	public void register(Board board) {
		mapper.create(board);
	}

	@Override
	public List<Board> list() {
		return mapper.list();
	}

	@Override
	public Board read(int boardNo) {
		return mapper.read(boardNo);
	}

	@Override
	public void modify(Board board) {
		mapper.update(board);
	}

	@Override
	public void remove(int boardNo) {
		mapper.delete(boardNo);
	}

	@Override
	public List<Board> search(Board board) {
		return mapper.search(board);
	}

}
package kr.or.ddit.mapper;

import java.util.List;

import kr.or.ddit.vo.Board;

public interface IBoardMapper {

	public void create(Board board);
	public List<Board> list();
	public Board read(int boardNo);
	public void update(Board board);
	public void delete(int boardNo);
	public List<Board> search(Board board);

}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.or.ddit.mapper.IBoardMapper">
	
	<insert id="create" parameterType="board" useGeneratedKeys="true">
		<selectKey keyProperty="boardNo" resultType="int" order="BEFORE">
			select seq_board.nextval from dual
		</selectKey>
		insert into board(
			board_no, title, content, writer, reg_date
		) values (
			#{boardNo}, #{title}, #{content}, #{writer}, sysdate
		)
	</insert>
	
	<select id="list" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board
		order by board_no desc
	</select>
	
	<select id="read" parameterType="int" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board
		where 1=1
		and board_no = #{boardNo}
	</select>
	
	<update id="update" parameterType="board">
		update board 
		set 
			title = #{title},
			content = #{content}
		where board_no = #{boardNo}
	</update>
	
	<delete id="delete" parameterType="int">
		delete from board where board_no = #{boardNo}
	</delete>
	
	<select id="search" parameterType="board" resultType="board">
		select 
			board_no, title, content, writer, reg_date 
		from board 
		where 1=1 
		<if test="title != null and title != ''">
			and title like '%' || #{title} || '%'
		</if>
		order by board_no desc
	</select>
	
</mapper>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>CRUD BOARD LIST</title>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
	</head>
	<body>
		
		<h2>LIST</h2>
		<a href="/crud/board/register">등록</a>
		
		<form action="/crud/board/search" method="post">
			<input type="text" name="title" id="title" value="${board.title }" />
			<button type="submit">검색</button>
		</form>

- http://localhost/crud/board/search


 

'대덕인재개발원_웹기반 애플리케이션' 카테고리의 다른 글

231129_SPRING 2 (6-3)  (0) 2023.11.29
231129_SPRING 2 (6-2)  (0) 2023.11.29
231128_SPRING 2 (5-2)  (0) 2023.11.28
231128_SPRING 2 (5-1)  (0) 2023.11.28
231127_SPRING 2 (4-2)  (0) 2023.11.27