Spring/Maven Project

Spring에 게시물 등록 처리 - Create, Client-Side Validation

carrotweb 2023. 1. 8. 23:22
728x90
반응형

지금부터는 게시판에 게시물을 등록, 조회, 수정, 삭제할 수 있게 개발하도록 하겠습니다.

 

일반적으로 개발에서는 게시물을 등록, 조회, 수정, 삭제하는 것을 CRUD라고 합니다.

 

CRUD는 Create(생성/등록/추가), Read(읽기/조회), Update(변경/수정), Delete(삭제/제거)의 첫 문자를 따서 만든 용어입니다. 또는 Add(추가), Browse(보기), Change(변경), Delete(삭제)의 첫 문자를 따서 ABCD라고도 합니다.

 

이번에는 CRUD의 C(Create)로 게시물을 등록하는 UI와 INSERT Query, DAO, Service, Controller를 생성하도록 하겠습니다.

 

 

Maven Spring Project의 main.jsp에 등록 버튼 추가하기

 

1. /src/main/webapp/WEB-INF/views/main/main.jsp 파일을 오픈하여 <form:form> 태그 위에 등록 버튼 영역을 추가합니다.

<div class="buttons">
	<div class="right">
		<button id="addBtn" class="button blue">등록</button>
	</div>
</div>

 

2. <style> 태그에 등록 버튼 영역에 대한 CSS를 추가합니다.

.buttons { position:relative; height:32px; margin-top:20px; }
.buttons > div.right { position:absolute; height:32px; right:0; }
.buttons > div > .button { overflow:visible; cursor:pointer; min-width:125px; height:32px; margin:0 2px; padding:0 15px; line-height:32px; font-size:14px; border:1px solid #dfdfdf; background:#fff; border-radius:10px; }
.buttons > div > .button.blue { color:#fff; border-color:#0099d2 !important; background:#0099d2 !important; }

 

3. <script> 태그에 등록 버튼에 대한 클릭 이벤트를 추가합니다.

$('#addBtn').click(function() {
	$(location).attr("href", "/board/addform.do");
});

 

 

Maven Spring Project를 실행하여 웹 브라우저로 확인하기

 

1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.

 

2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력하면 페이지 오른쪽 상단에 등록 버튼이 나타나는 것을 확인할 수 있습니다. (페이지 크기를 10에서 5로 변경하였습니다.)

 

 

Maven Spring Project에 Board Controller 추가하기

 

1. Java Resource > src/main/java에 com.home.study.test1.board.controller 패키지를 생성합니다.

  1. test1 패키지에 board 패키지 생성 → board 패키지에 controller 패키지 생성

 

2. com.home.study.test1.board.controller 패키지에 BoardController 클래스를 생성합니다. (BoardController.java 파일)

  1. 생성된 BoardController 클래스가 Spring Framework Web MVC의 Controller로 처리되게 하기 위해서 클래스 위에 @Controller Annotation(어노테이션)을 추가합니다.
  2. "/board"로 시작하는 모든 요청을 처리할 수 있게 BoardController 클래스 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.
  3. 요청 URL이 왔을 때 실행될 addBoardForm 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다.
  4. GET 방식으로 요청 URL이 "/addform.do"가 왔을 때 addBoardForm 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다. (@RequestMapping Annotation(어노테이션)에는 요청 URL에서 ".do"를 제외한 경로를 입력합니다.)
  5. addBoardForm 메서드의 리턴 값으로 "board/boardform"를 입력합니다.
package com.home.study.test1.board.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.home.study.test1.board.model.Board;

@Controller
@RequestMapping("/board")
public class BoardController {

	@RequestMapping(value="/addform", method=RequestMethod.GET)
	public String addBoardForm(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute("board") Board board, ModelMap model) {
		return "board/boardform";
	}
}

 

 

 

Maven Spring Project의 SiteMesh에 게시판 데코레이터 추가하기

 

1. WEB-INF/config 폴더에서 sitemesh.xml 파일을 오픈하고 게시판 페이지 만을 위해 "/board/*.do"로 데코레이터를 추가합니다. 우선 기존 mainDecorator를 설정하고 향후에 게시판 전용 데코레이터로 변경하겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<sitemesh>
	<!-- 기본 페이지 -->
	<mapping decorator="/WEB-INF/views/decorators/default/defaultDecorator.jsp"/>
	
	<!-- 메인 페이지 -->
	<mapping path="/index.do" decorator="/WEB-INF/views/decorators/default/mainDecorator.jsp"/>

	<!-- 게시판 페이지 -->
	<mapping path="/board/*.do" decorator="/WEB-INF/views/decorators/default/mainDecorator.jsp"/>
	
	<!-- sitemesh 예외 -->
	<mapping path="/api/*" exclude="true"/>
	<mapping path="/*.html" exclude="true"/>
	<mapping path="/*.htm" exclude="true"/>
	<mapping path="/*.js" exclude="true"/>
	<mapping path="/*.css" exclude="true"/>
</sitemesh>

 

 

Maven Spring Project에 Board Form JSP 추가하기

 

1. WEB-INF 폴더에 views 폴더를 생성하고 생성된 views 폴더에 board 폴더를 생성합니다.

 

2. board 폴더에 boardform.jsp 파일을 생성합니다.

  1. Form Tag Library를 사용하여 게시물을 등록할 수 있는 입력 폼을 생성합니다.
  2. BoardController 클래스의 addBoardForm 메서드에서 @ModelAttribute Annotation(어노테이션)으로 Board 객체를 받기 때문에 <form:form> 태그의 modelAttribute 속성에 board 객체를 지정합니다.
  3. 게시물의 작성자 아이디, 제목, 내용을 받기 위해 <form:input> 태그의 path 속성에 board 객체의 registrationId(작성자 아이디), subject(제목) 변수를 지정하고 <form:textarea> 태그의 path 속성에 board 객체의 content(내용) 변수를 지정합니다. (아직 로그인 처리가 없기 때문에 registrationId(작성자 아이디)를 직접 입력하게 하였습니다. 로그인 처리는 향후에 처리하겠습니다.)
<%@ 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://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>게시판</title>
		<style type="text/css">
			.board { width:800px; margin: 20px auto; }
			.board table { width:100%; border-top:2px solid #1d4281; border-spacing:0; }
			.board table th { padding:8px 10px 10px 10px; vertical-align:middle; color:#1d4281; font-size:14px; border-bottom:1px solid #ccc; background:#f8f8f8; }
			.board table td { padding:7px 20px 9px 20px; text-align:left; vertical-align:middle; border-bottom:1px solid #ccc; font-size:14px; line-heighT:150%; }
			.board table td input[type="text"], .board table td textarea { width:100%; color:#000 !important; } 
			.buttons { position:relative; height:32px; margin-top:20px; }
			.buttons > div.right { position:absolute; height:32px; right:0; }
			.buttons > div > .button { overflow:visible; cursor:pointer; min-width:125px; height:32px; margin:0 2px; padding:0 15px; line-height:32px; font-size:14px; border:1px solid #dfdfdf; background:#fff; border-radius:10px; }
			.buttons > div > .button.blue { color:#fff; border-color:#0099d2 !important; background:#0099d2 !important; }
		</style>
	</head>
	<body>
		<div class="board">
			<form:form modelAttribute="board" autocomplete="off">
			<table>
				<colgroup>
					<col style="width:18.5%">
					<col style="width:auto">
				</colgroup>
				<tbody>
					<tr>
						<th scope="row">작성자</th>
						<td><form:input path="registrationId" placeholder="아이디를 입력하세요." /></td>
					</tr>
					<tr>
						<th scope="row">제목</th>
						<td><form:input path="subject" placeholder="제목을 입력하세요." /></td>
					</tr>
					<tr>
						<th scope="row">내용</th>
						<td><form:textarea path="content" placeholder="내용을 입력하세요." rows="10"/></td>
					</tr>
				</tbody>
			</table>
			</form:form>
			<div class="buttons">
				<div class="right">
					<button id="saveBtn" class="button blue">등록</button>
					<button id="cancelBtn" class="button">취소</button>
				</div>
			</div>
		</div>
	</body>
</html>

 

 

Maven Spring Project를 실행하여 웹 브라우저로 확인하기

 

1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.

 

2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력하고 등록 버튼을 클릭하면 게시물 입력 폼(/board/addform.do)으로 이동됩니다.

 

게시물 입력 폼(/board/addform.do)에서 등록 버튼을 클릭하여 폼(form)을 전송(Submit) 하기 전에 <script>에서 입력 요소들에 대해 값이 유효한지 검사하거나 전송된 후에 controller에서 입력 요소들에 대해 값이 유효한지 검사하여 사용자에게 필수 입력이나 잘 못된 입력에 대해 알려주서 재입력하게 해야 합니다. 이런 유효성검사를 Validation(밸리데이션)이라고 합니다.

 

Validation을 어느 시점에서 처리하느냐에 따라 Client-Side Validation과 Server-Side Validation로 구분됩니다.

  • Client-Side Validation은 폼(form)을 전송(Submit) 하기 전에 <script>에서 폼(form) 안에 있는 입력 요소들에 대해 값이 유효한지 검사하고 유효하지 않으면 사용자에게 알려줍니다.
  • Server-Side Validation은 controller에서 전송된 데이터에 대해 값이 유효한지 검사하고 유효하지 않으면 내부 process(프로세스)를 중지하고 Client(웹 페이지)로 에러메시지를 전송하여 사용자에게 알려줍니다.

 

 

Maven Spring Project의 Board Form JSP에 Client-Side Validation 추가하기

 

1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈하여 등록 버튼과 취소 버튼에 대한 클릭 이벤트를 추가합니다.

  1. 게시물은 작성자 아이디와 제목은 필수 입력값이 때문에 입력 값이 공백이 아니어야 합니다. 그래서 등록 버튼이 클릭되면 작성자 아이디와 제목의 입력 값을 확인하고 공백이면 alert으로 메시지를 알려주고 사용자가 입력할 수 있게 포커스를 이동시킵니다.
  2. 입력 값이 모두 유효하다면 "/board/addboard.do"로 폼(form)을 전송(Submit) 합니다.
  3. 취소 버튼이 클릭되면 history.back()이나 history.go(-1)를 이전 페이지로 이동시킵니다.
$(function() {
	$('#saveBtn').click(function() {
		var registrationId = $('#registrationId').val();
		if (registrationId == null || registrationId == "") {
			alert("아이디를 입력하세요.");
			$("#registrationId").focus();
			return;
		}
		var subject = $('#subject').val();
		if (subject == null || subject == "") {
			alert("제목을 입력하세요.");
			$("#subject").focus();
			return;
		}
		$('#board').attr("action", "/board/addboard.do");
		$('#board').submit();
	});
	$('#cancelBtn').click(function() {
		window.history.go(-1);
	});
});

 

반응형

 

 

Maven Spring Project의 Board Mapper XML에 Insert Query 추가하기

 

1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파일을 오픈합니다.

 

2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 등록(insert) 하기 위해서 <insert>으로 쿼리문을 생성합니다.

  1. <insert>의 id 속성은 insert를 구분하는 식별자로 중복되지 않는 이름으로 입력합니다. id 속성은 DAO에서 구문을 찾을 때 사용됩니다.
  2. <insert>안에는 INSERT구문을 사용하여 데이터베이스에서 데이터를 등록하게 합니다.
  3. <insert>의 parameterType 속성은 전송된 데이터를 받을 Model(모델) 명을 입력합니다.
  4. useGeneratedKeys 속성을 true로 하여 keyProperty 속성 값에 지정된 sequence(게시판 시퀀스)가 자동으로 생성되게 합니다.
<!--
	게시물을 등록합니다.
-->
<insert id="insertBoardItem" useGeneratedKeys="true" keyProperty="sequence" parameterType="Board">
	INSERT INTO INT_BOARD_TB
	       (
	        BRD_SUBJECT,
	        BRD_CONTENT,
	        REG_ID
	       )
	       VALUES
	       (
	        #{subject},
	        #{content},
	        #{registrationId}
	       )
</insert>

 

 

Maven Spring Project의 DAO - Board Interface에 insert 메서드 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.dao 패키지에 있는 IBoardDao Interface(인터페이스)를 오픈합니다. (IBoardDao.java)

 

2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 등록(insert) 하기 위해 insertBoardItem 메서드를 선언합니다.

package com.home.study.test1.board.dao;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardDao {

	int selectBoardListCount(BoardSearch boardSearch);
	
	List<Board> selectBoardList(BoardSearch boardSearch);
	
	int insertBoardItem(Board board);
}

 

 

Maven Spring Project의 Dao - Board Implement에 insert 메서드 구현 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.dao.impl 패키지에 있는 BoardDaoImpl 클래스를 오픈합니다. (BoardDaoImpl.java)

 

2. BoardDaoImpl 클래스에서 IBoardDao Interface(인터페이스)의 insertBoardItem 메서드를 구현합니다.

int org.apache.ibatis.session.SqlSession.insert(String statement, Object parameter)

SqlSession의 insert 메서드의 첫 번째 파라미터인 statement는 실행 구문의 고유 식별자로 문자열 변수(SQL_FILE_PATH)와 의 id 속성 값을 결합한 값입니다. 두 번째 파라미터인 parameter는 실행 구문에 전달할 객체로 board 변수를 입력합니다.
SqlSession의 insert 메서드는 리턴 값으로 등록된 ROW의 수가 int로 리턴됩니다.

package com.home.study.test1.board.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

@Repository("BoardDaoImpl")
public class BoardDaoImpl implements IBoardDao {

	protected static final String SQL_FILE_PATH = "com.home.study.test1.board.mapper.mariadb.BoardMapper.";

	@Autowired
	@Qualifier("sqlSessionMariaDB")
	private SqlSession sqlSession;

	@Override
	public int selectBoardListCount(BoardSearch boardSearch) {
		return ((Integer)sqlSession.selectOne(SQL_FILE_PATH + "selectBoardListCount", boardSearch)).intValue();
	}

	@Override
	public List<Board> selectBoardList(BoardSearch boardSearch) {
		return sqlSession.selectList(SQL_FILE_PATH + "selectBoardList", boardSearch);
	}

	@Override
	public int insertBoardItem(Board board) {
		return sqlSession.insert(SQL_FILE_PATH + "insertBoardItem", board);
	}
}

 

 

Maven Spring Project의 Service - Board Interface에 insert 메서드 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.service 패키지에 있는 IBoardService Interface(인터페이스)를 오픈합니다. (IBoardService.java)

 

2. DAO (Board Interface, Implement)을 사용하여 INT_BOARD_TB(게시판) Table에 데이터(게시물)를 등록(insert) 하기 위해 insertBoardItem 메서드를 선언합니다.

package com.home.study.test1.board.service;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardService {

	List<Board> selectBoardList(BoardSearch boardSearch);
	
	boolean insertBoardItem(Board board);
}

 

 

 

Maven Spring Project의 Service - Board Implement에 insert 메서드 구현 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.service.impl 패키지에 있는 BoardServiceImpl 클래스를 오픈합니다. (BoardServiceImpl.java)

 

2. BoardServiceImpl 클래스에서 IBoardService Interface(인터페이스)의 insertBoardItem 메서드를 구현합니다.

  1. 이클립스에서는 마우스를 BoardServiceImpl 클래스 위로 이동합니다. 콘텍스트 메뉴에서 "Add unimplemented methods"(구현되지 않은 메서드 추가)를 클릭하면 자동으로 메서드를 생성해 줍니다.
  2. insertBoardItem 메서드에서 boardDao의 insertBoardItem 메서드를 사용하여 데이터(게시물)를 등록시키고 등록된 결과가 1이면 true로 리턴하게 합니다.
package com.home.study.test1.board.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.home.study.common.search.Pagination;
import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;

@Service
public class BoardServiceImpl implements IBoardService {

	@Autowired
	IBoardDao boardDao;

	@Override
	public List<Board> selectBoardList(BoardSearch boardSearch) {
		if (boardSearch.getPagination() == null) {
			boardSearch.setPagination(new Pagination());
		}
		
		int count = boardDao.selectBoardListCount(boardSearch);
		boardSearch.getPagination().setRecordTotalCount(count);
		
		List<Board> boardList = null;
		if (count > 0) {
			boardSearch.getPagination().processZero();
			boardList = boardDao.selectBoardList(boardSearch);
		}
		return boardList;
	}

	@Override
	public boolean insertBoardItem(Board board) {
		return (boardDao.insertBoardItem(board) == 1) ? true : false;
	}
}

 

 

Maven Spring Project의 Board Controller에 addBoard 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.controller 패키지에 있는 BoardController 클래스를 오픈합니다. (BoardController.java)

 

2. IBoardService Interface(인터페이스)를 선언하고 의존성 주입(Dependency Injection)을 위해서 @Autowired Annotation(어노테이션)를 변수 위에 붙여줍니다.

 

3. boardService의 insertBoardItem 메서드를 사용하여 데이터(게시물)를 등록하기 위해 addBoard 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다. 등록되면 redirect로 index.do로 이동시키고 등록되지 않으면 다시 입력 폼(/board/boardform.do)으로 이동시킵니다.

 

4. POST 방식으로 요청 URL이 "/board/addboard.do"가 왔을 때 addBoard 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.

package com.home.study.test1.board.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.service.IBoardService;


@Controller
@RequestMapping("/board")
public class BoardController {

	@Autowired
	IBoardService boardService;

	@RequestMapping(value="/addform", method=RequestMethod.GET)
	public String addBoardForm(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute("board") Board board, ModelMap model) {
		return "board/boardform";
	}

	@RequestMapping(value="/addboard", method=RequestMethod.POST)
	public String addBoard(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute("board") Board board, ModelMap model) {
		if (!boardService.insertBoardItem(board)) {
			return "board/boardform";
		}
		
		return "redirect:/index.do";
	}
}

 

 

Maven Spring Project를 실행하여 웹 브라우저로 확인하기

 

1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.

 

2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력하고 등록 버튼을 클릭하면 게시물 입력 폼(/board/addform.do)으로 이동됩니다.

 

3. 입력 폼에 작성자는 "testid3", 제목은 "테스트 제목 11", 내용은 "테스트 내용 11"로 입력하고 등록 버튼을 클릭합니다.

 

그럼 정상적으로 등록되고 리스트 페이지인 "index.do"로 이동됩니다.

 

지금까지 일반적인 Client-Side Validation으로 입력 요소들의 값을 유효성 검사하고 등록 처리하였습니다.

 

이어서, Client-Side Validation인 JavaScript Validation API에 대해 알아보겠습니다.

728x90
반응형