기억의 DataBase

Spring Framework를 활용한 방명록 - 3. Service/Controller/JSP 본문

Spring

Spring Framework를 활용한 방명록 - 3. Service/Controller/JSP

Zester; 2019. 4. 5. 02:01
  • Service
package kr.or.connect.guestbook.service;

public interface GuestbookService {
     public static final Integer LIMIT = 5;
     public List<Guestbook> getGuestbooks(Integer start);
     public int deleteGuestbook(Long id, String ip);
     public Guestbook addGuestbook(Guestbook guestbook, String ip);
     public int getCount();
}

interface로 필요한 상수와 메소드를 선언하고, GuestbookServiceImpl에서 구현


package kr.or.connect.guestbook.service.impl;

@Service
public class GuestbookServiceImpl implements GuestbookService{
     @Autowired
     GuestbookDao guestbookDao;
     
     @Autowired
     LogDao logDao;

     @Override                            
     // @Transactional 메소드 내의 어떤 부분이라도 문제가 있으면, 전에 실행완료한 것도 취소됨
     // 읽기만 하는 메소드의 경우 readOnly 형태로 connection을 사용하게 함
     @Transactional(readOnly = true
     public List<Guestbook> getGuestbooks(Integer start) { //start:index가 시작되는 번호
           List<Guestbook> list = guestbookDao.selectAll(start, GuestbookService.LIMIT);
           return list;
     }

     @Override
     @Transactional(readOnly = false) // default 값은 false, 공동작업자를 위해 명시적으로 표기
     public int deleteGuestbook(Long id, String ip) {
           int deleteCount = guestbookDao.deleteById(id);
           
           Log log = new Log();
           log.setIp(ip);
           log.setMethod("delete");
           log.setRegdate(new Date());
           logDao.insert(log);
           
           return deleteCount;
     }

     @Override
     @Transactional(readOnly = false)
     public void addGuestbook(Guestbook guestbook, String ip) {
           guestbook.setRegdate(new Date());
           guestbookDao.insert(guestbook);
           
           Log log = new Log();
           log.setIp(ip);
           log.setMethod("insert");
           log.setRegdate(new Date());
           logDao.insert(log);
     }

     @Override
     public int getCount() {
           return guestbookDao.selectCount();
     }
}
  • Controller

package kr.or.connect.guestbook.controller;

//@ComponentScan(basePackages ={})에 kr.or.connect.guestbook.controller가 없는데도 
  어떻게 Controller인지 인식하나?
@Controller
public class GuestbookController {
     @Autowired
     GuestbookService guestbookService;
     //GuestbookService를 실제로 구현한 GuestbookServiceImpl을 객체로 활용하면 왜 에러가 발생?
     
     @GetMapping(path="/list")                      
                    // 해당 파라미터의 값은 필수가 아니며, 만약 값이 없다면 기본값을 0으로 함
     public String list(@RequestParam(name="start",required=false,defaultValue="0")          

  int start, ModelMap model) { // ModelMap은 구현체, Model은 인터페이스(취향)          

List<Guestbook> list = guestbookService.getGuestbooks(start); // 0, 5, 10...

           int count = guestbookService.getCount(); // 전체 페이지 수
           int pageCount = count/GuestbookService.LIMIT; // 하단의 페이지 링크 수
           
           if(count%GuestbookService.LIMIT > 0) {
                pageCount++; // 나눈 나머지가 있으면 pageCount를  하나 더해줌
           }
           
           // 페이지 링크에 따른 listStart 번호를 List로 저장
           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"; // list.jsp
     }
     
     @PostMapping(path="/write"
     // @ModelAttribute : 클라이언트가 전송한 정보와 자바빈의 프로퍼티를 1:1로 바인딩
     public String write(@ModelAttribute Guestbook guestbook, HttpServletRequest request) {
           String clientIp = request.getRemoteAddr(); // HttpServletRequest에서 ip 정보를 꺼냄
           guestbookService.addGuestbook(guestbook, clientIp);
           return "redirect:list"; // list.jsp로 리다이렉트
     }
}
  • 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>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <h1>방명록</h1>
     <br> 방명록 전체 수 : ${count}
     
     <br>
     <br>
     
     <c:forEach var="guestbook" items="${list}">
           ${guestbook.id}<br>
           ${guestbook.name}<br>
           ${guestbook.content}<br>
           ${guestbook.regdate}<br>
           <br>
     </c:forEach>
     
     <br>
                                      
     <c:forEach var="pageIndex" varStatus="status"  items="${pageStartList}">
           <a href="list?start=${pageIndex}">${status.index+1}</a> &nbsp; &nbsp;
     </c:forEach>
     
      <br>
      <br>
     
      <form method="post" action="write">
          name:<input type="text" name ="name"><br>
          <textarea name="content" rows="6" cols="60"></textarea>
          <br> <input type="submit" value="등록">
      </form>
     
</body>
</html>

※ 전체 구조

'Spring' 카테고리의 다른 글

Spring Framework를 활용한 방명록 - 2. DB/DTO/DAO(Repository)  (0) 2019.04.04
Spring Framework를 활용한 방명록 - 1.설정  (0) 2019.03.31
Spring MVC  (0) 2019.03.25
Spring JDBC  (0) 2019.03.22
Java Config를 통한 IoC/DI  (0) 2019.03.21
Comments