Spring으로 방명록 애플리케이션을 구현하는 시리즈입니다.
- [Spring] 방명록 애플리케이션 (1) - 환경 설정
- [Spring] 방명록 애플리케이션 (2) - 준비 단계 ( 스프링 활용하기 )
- [Spring] 방명록 애플리케이션 (3) - 구현
- [Spring] 방명록 애플리케이션 (4) - 정적 파일 처리 ( DefaultServletHandler )
- [Spring] 방명록 애플리케이션 (5) - 뷰 객체 생성 ( ViewResolver )
- [Spring] 방명록 애플리케이션 (6) - 예외 처리 ( ExceptionHandler )
- [Spring] 방명록 애플리케이션 (7) - 3 Layer Architecture와 Service 계층
- [Spring] 방명록 애플리케이션 (8) - 커넥션 풀 ( Connection Pool ) DBCP
- [Spring] 방명록 애플리케이션 (9) - Mybatis 환경 설정
- [Spring] 방명록 애플리케이션 (10) - Mybatis 적용
방명록 애플리케이션
이번 글에서는 방명록 애플리케이션을 구현해보도록 해보겠습니다.
설정 파일과 디렉터리 구조는 방명록 애플리케이션(1)을 참고해주세요. ( 링크 )
단, MySQL JDBC Driver와 JSTL 라이브러리를 추가하기 위한 설정이 필요합니다.
라이브러리 추가이므로 기존 pom.xml 파일의 <dependencies> 태그 내부에 아래의 코드를 추가해주세요.
<!-- MySQL JDBC Driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
환경 설정도 끝났고, GuestBookDAO , GuestBookVO는 이미 구현이 되어 있으므로
GuestBookController 와 JSP 페이지만 작성하면 되겠네요.
( GuestBookDAO , GuestBookVO 코드 링크 )
GuestBookController
@Controller @RequestMapping("/main") public class GuestBookController { @Autowired private GuestBookDAO GuestBookDAO; @RequestMapping("/index") public String index(Model model) { List<GuestBookVO> list = GuestBookDAO.getList(); model.addAttribute("list", list); return "/WEB-INF/views/index.jsp"; } @RequestMapping("/deleteform") public String deleteform() { return "/WEB-INF/views/deleteform.jsp"; } @RequestMapping(value="/add", method=RequestMethod.POST) public String add(@ModelAttribute GuestBookVO vo) { GuestBookDAO.insert(vo); return "redirect:/main/index"; } @RequestMapping(value="/delete", method=RequestMethod.POST) public String delete( @RequestParam Integer no, @RequestParam String pwd ) { String dbPwd = GuestBookDAO.getPwd(no); String parseInputPwd = GuestBookDAO.getInputPwd(pwd); if( dbPwd.equals(parseInputPwd)){ GuestBookDAO.delete(no); } return "redirect:/main/index"; } }
특별한 것 없이 이전 글에서 모두 봤던 코드입니다.
/add로 요청이 왔을 때 GuestBookVO 객체를 통째로 받은 것에 주목해주세요.
스프링에서 자주 사용되는 테크닉이므로 꼭 숙지하셔야 합니다.
이것이 가능한 이유는 GuestBookVO 객체에 getter, setter가 있기 때문이며,
index.jsp의 form에서 <input>태그의 name이 GuestBookVO의 인스턴스 변수와 이름이 같기 때문입니다.
다음으로 방명록 목록/추가 및 삭제에 대한 뷰 페이지를 작성하겠습니다.
index.jsp
<%@ 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"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%
pageContext.setAttribute("newLine", "\n");
%>
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>방명록</title>
</head>
<body>
<form action="/guestbook/main/add" method="post">
<table border="1" width="500">
<tr>
<td>이름</td><td><input type="text" name="name"></td>
<td>비밀번호</td><td><input type="password" name="pwd"></td>
</tr>
<tr>
<td colspan=4><textarea name="content" cols=60 rows=5></textarea></td>
</tr>
<tr>
<td colspan=4 align=right><input type="submit" VALUE=" 확인 "></td>
</tr>
</table>
</form>
<br>
<c:set var="count" value="${fn:length(list)}" />
<c:forEach items="${list }" var="vo" varStatus="status" >
<table width="510" border="1">
<tr>
<td>[${count - status.index}]</td>
<td>${vo.name }</td>
<td>${vo.regDate }</td>
<td><a href="/guestbook/main/deleteform?no=${vo.no }">삭제</a></td>
</tr>
<tr>
<!-- 개행(\n)을 JSTL에서 사용할 수 없어서 page context에 다른 변수로 추가해줘야함 -->
<td>${fn:replace(vo.content, newLine, "<br>") }</td>
</tr>
</table>
<br>
</c:forEach>
</body>
</html>
deleteform.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>방명록</title>
</head>
<body>
<form action="/guestbook/main/delete?no=${ param.no }" method="post">
<table>
<tr>
<td>비밀번호</td>
<td><input type="password" name="pwd"></td>
<td><input type="submit" value="확인"></td>
</tr>
</table>
</form>
<a href="/guestbook/main/index">메인으로 돌아가기</a>
</body>
</html>
이제 http://localhost:8080/guestbook/main/index 을 입력하여, 방명록 글쓰기 및 삭제를 테스트해보세요 !
이상으로 방명록 애플리케이션 구현을 마치도록 하겠습니다.
이제 스프링을 이용해서 간단한 웹 애플리케이션을 만들 정도는 되었습니다.
그런데 DAO의 코드를 보시면 2가지의 문제점이 있습니다.
1) 매 번 DB에 접근하기 위해서 커넥션을 연결해야 합니다.
2) 실제 처리하는 SQL과 파라미터만 다를 뿐 필요하지만 같은 코드가 중복해서 발생합니다.
이러한 문제를 해결하기 위해서 커넥션 풀을 이용한 DBCP , 그리고 Mybatis 라이브러리를 사용합니다.
이후의 글들에서는 방명록 애플리케이션을 보완해가면서 여러 기술들을 적용해보도록 하겠습니다.