들어가기 전에
이번 시간엔 방명록을 Spring 프레임워크를 이용해 만들어 보도록 하겠습니다.
이를 통해 각 레이어별로 어떤 내용들을 작성해야 하는지 알아보고, 완전히 동작하는 웹 어플리케이션을 개발해 봄으로써 Spring 웹 어플리케이션에 대한 이해를 높이는 시간이 될 수 있길 바랍니다.
학습 목표
- Spring 프레임워크를 이용한 웹 어플리케이션 프로젝트를 구성할 수 있습니다.
- Spring 프레임워크를 이용한 웹 어플리케이션 개발 시 어떤 요소들을 개발해야하는지 이해합니다.
핵심 개념
- @Controller
- @Service
- @Repository
- @Transactional
학습하기
실습코드
GuestbookController.java
package kr.or.connect.guestbook.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import kr.or.connect.guestbook.dto.Guestbook;
import kr.or.connect.guestbook.service.GuestbookService;
@Controller
public class GuestbookController {
@Autowired
GuestbookService guestbookService;
@GetMapping(path="/list")
public String list(@RequestParam(name="start", required=false, defaultValue="0") int start,
ModelMap model) {
List<Guestbook> list = guestbookService.getGuestbooks(start);
int count = guestbookService.getCount();
int pageCount = count / GuestbookService.LIMIT;
if(count % GuestbookService.LIMIT > 0)
pageCount++;
List<Integer> pageStartList = new ArrayList<>();
for(int i = 0; i < pageCount; i++) {
pageStartList.add(i * GuestbookService.LIMIT);
}
model.addAttribute("list", list);
model.addAttribute("count", count);
model.addAttribute("pageStartList", pageStartList);
return "list";
}
@PostMapping(path="/write")
public String write(@ModelAttribute Guestbook guestbook,
HttpServletRequest request) {
String clientIp = request.getRemoteAddr();
System.out.println("clientIp : " + clientIp);
guestbookService.addGuestbook(guestbook, clientIp);
return "redirect:list";
}
}
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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>방명록 목록</title>
</head>
<body>
<h1>방명록</h1>
<br> 방명록 전체 수 : ${count }
<br>
<br>
<c:forEach items="${list}" var="guestbook">
${guestbook.id }<br>
${guestbook.name }<br>
${guestbook.content }<br>
${guestbook.regdate }<br>
</c:forEach>
<br>
<c:forEach items="${pageStartList}" var="pageIndex" varStatus="status">
<a href="list?start=${pageIndex}">${status.index +1 }</a>
</c:forEach>
<br>
<br>
<form method="post" action="write">
name : <input type="text" name="name"><br>
<textarea name="content" cols="60" rows="6"></textarea>
<br> <input type="submit" value="등록">
</form>
</body>
</html>
생각해보기
- 레이어 별로 개발을 진행할 때, 각 레이어별로 잘 동작하는지 확인하는 것은 매우 중요합니다. 어떤 특정 레이어가 올바르게 동작하지 않는다면 웹 어플리케이션은 제대로 동작하지 않을 것입니다. 어느 특정 레이어가 문제가 있는지 알려면, 각 레이어별로 테스트가 필요합니다. 자바에서 테스트 코드를 좀 더 효과적으로 작성할 수 있는 방법에 대해 알아보세요.
comment
contorller에서
@Autowired
GuestBooksService guestBooksService;
이 부분이 서버 돌렷을때 bean을 구할 수 없다고 에러 메세지가 뜹니다 ㅠㅠ geustbooksserviceimpl부분에서 @Service 에노테이션 잘 붙어 있는데 왜 안될까요 ㅠㅠ
특정 레이어에 속해있는 Bean들만 ApplicationContext에 직접 로드해 해당 레이어를 테스트 하는 방법과 애노테이션을 기반으로 이러한 과정들을 대신 해주는 방법이 존재합니다.