티스토리 뷰

SPRING

0731 개발일기 익셉션 페이징

mind-a 2018. 7. 31. 23:23

예외처리


스프링 MVC에서 제공하는 @ControllerAdvice는 호출되는 메소드에서 발생된 익셉션을 모두 처리한다.

만드는 방식은 클래스에 @ControllerAdvice라는 애노테이션 처리, 각 메소드에 @ExceptionHandler를 이용해 적절한 ㅏ입의 익셉션을 처리하게 된다..

그러니까 컨트롤러 패키지 안에다 클래스 새로 생성~!!



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
 
@ControllerAdvice
public class CommonExceptionAdvice {
    
    private static final Logger logger = LoggerFactory.getLogger(CommonExceptionAdvice.class);
    
    @ExceptionHandler(Exception.class)
    public String common(Exception e){
        logger.info(e.toString());
        
        return "error_common";
    }
 
}
cs\



error_common.jsp 페이지를 따로 만들어주어야함

그냥 익셉션을 화면으로 전달하면 더 유용하게 사용가능하다
ModelAndView 타입을 사용하면 동시에 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
 
@ControllerAdvice
public class CommonExceptionAdvice {
    
    private static final Logger logger = LoggerFactory.getLogger(CommonExceptionAdvice.class);
    
    @ExceptionHandler(Exception.class)
    private ModelAndView errorModelAndView(Exception ex){
        
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("/error_common");
        modelAndView.addObject("exception", ex);
        
        return modelAndView;
    }
    
}
cs


error_common.jsp


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ 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 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>Insert Title</title>
</head>
<body>
 
<h4>${exception.getMessage() }</h4>
 
<ul>
<!-- jstl부분임  -->
<c:forEach items="${exception.getStackTrace() }" var="stack">
<li>${stack.toString() }</li>
</c:forEach>
 
</ul>
</body>
</html>

cs




익셉션 화면

bno 90번 글은 없기때문에 나는 에러다!






코딩은 내일하더라도 일단 공부좀..


페이징처리원칙


1. 다른 사람에게 URL방식으로 전달하는 경우가 많기 때문에 반드시 GET방식 사용

2. 페이징 처리가 되면 조회 화면에서 반드시 '목록가기'가 필요

3. 반드시 필요힌 페이지 번호만을 제공해야함. 예를들어 한 페이지에 10개씩 데이터를 출력하는 경우에 전체 데이터가 35건이 있을때 4페이지까지만 화면에 출력되어야한다. 만약 200건이 있을때에는 적당한 수의 페이지 번호를 뒤로 출력하고 화살표 같은걸 이용해서 보여줘야함.


여느 사이트들을 생각해보면 쉽게 이해가 가능하다..



일단 페이징을 위해 글 수를 많이 늘린다.

1
2
insert into tbl_board (title, content,writer)
(select title, content, writer from tbl_board);
cs


위와같은 쿼리를 이용하면 자가복사 형태로 배로 늘어나는걸 볼 수 있음

5번 돌렸는데

bno 921번까지 갔다 ^^..



음 일단 Junit Test를 위해서 mapper, dao 등 코드를 추가했고 로그에 3페이지를 띄우는거다


mapper에 추가

1
2
3
4
5
6
7
8
9
10
11
<select id="listPage" resultType="BoardVO">
    <![CDATA[
        select
            bno, title, content, writer, regdate, viewcnt
        from
            tbl_board
        where bno>0
        order by bno desc, regdate desc
        limit #{page}, 10 
    ]]>
</select>
cs



BoardDaoTest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.List;
 
import javax.inject.Inject;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zero.domain.BoardVO;
import org.zero.persistence.BoardDAO;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class BoardDAOTest {
    
    @Inject
    private BoardDAO dao;
    
    private static Logger logger = LoggerFactory.getLogger(BoardDAOTest.class);
    
    @Test
    public void testListPage()throws Exception{
        int page = 3;
        
        List<BoardVO> list = dao.listPage(page);
        
        for(BoardVO boardVO : list){
            logger.info(boardVO.getBno()+":"+boardVO.getTitle());
        }
    }
}
cs




근데 캡쳐하고 보니 이상하다 3페이진데 bno가 900번대는 말이 안 되지..

다시 코드 고쳐본다..

근데 아무리 뜯어봐도 틀린게 없어보이는데..?



대박 어이없음 mapper의 내림차순 부분을

asc로 정렬했더니 3번째 페이지가 보인다. 뭐가문제지..? 




됐으니 다행인데 흠...






너무 피곤하다.. 페이징은 내일해야지...


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함