개발 ON
  • [Spring] CustomExceptionController
    2024년 11월 29일 21시 54분 51초에 업로드 된 글입니다.
    작성자: 이주여이
        @GetMapping("/read-md")
        public String readMarkdown(@RequestParam Map<String, Object> requestMap, Model model) throws NotFoundException, AccessDeniedException {
            Map<String, Object> boardSelect = service.boardSelect(requestMap);
    
            if(boardSelect == null) {
                throw new NotFoundException();
            }
    
            // 중략
    
            if((secYn.equals("Y") || code.equals(CategoryCode.DATA.code)) && role.equals(Const.ROLE_ANONYMOUS)) {
                throw new AccessDeniedException("접근이 거부되었습니다.");
            }
    
            // 중략
    
            return "board/read";
        }

     

    url에 게시판 pk에 해당하는 값을 임의로 작성할 경우 mapper문으로 쿼리 날릴 때 null이 발생할테고 해당 null을 체크한 후 예외를 던진다.

     

    비공개 글이거나 관리자만 접근할 수 있는 게시글에 접근했을 때는 Spring Security에서 제공하는 AccessDeniedException을 날린다.

     

    그리고 ERROR CODE를 관리하는 ENUM을 생성했다.

     

    이 부분은 Rest API 배울 때 더 딥하게 설정하는 부분이 있었던 걸로 기억하는데 거기까진 잘 모르겠고 일단 아는대로만..

     

    @Getter
    public enum ErrorCode {
        NOT_FOUND ("404 NOT FOUND ERROR"       , "존재하지 않는 URL입니다. URL을 다시 확인해주세요."),
        FORBIDDEN ("403 FORBIDDEN ERROR"       , "접근이 거부되었습니다. 해당 페이지 권한이 없습니다."),
        RUNTIME   ("500 INTERNAL SERVER ERROR" , "시스템 에러가 발생하여 페이지를 표시할 수 없습니다. 관리자에게 문의해주세요.");
    
        public final String title;
        public final String msg;
    
        ErrorCode(String title, String msg) {
            this.title = title;
            this.msg   = msg;
        }
    }

     

    @ControllerAdvice
    public class CustomExceptionHanlder {
    	private static ErrorCode errorCode;
    	
    	@ExceptionHandler({NotFoundException.class, NoResourceFoundException.class, AccessDeniedException.class, RuntimeException.class})
    	private String handleException(Exception e, Model model) {
    		Map<String, Object> error = new HashMap<String, Object>();
    		
    		if     (e instanceof NotFoundException) 	   {errorCode = ErrorCode.NOT_FOUND;}
    		if     (e instanceof NoResourceFoundException) {errorCode = ErrorCode.NOT_FOUND;}
    		else if(e instanceof AccessDeniedException)    {errorCode = ErrorCode.FORBIDDEN;}
    		else if(e instanceof RuntimeException) 		   {errorCode = ErrorCode.RUNTIME;}
    		
    		error.put(Const.ARTICLE_TITLE  , errorCode.title);
    		error.put(Const.MSG	           , errorCode.msg);
    		
    		model.addAttribute(Const.ERROR , error);
    		
    		return "error/error";
    	}
    }

     

    예외는 기본적으로 해당 페이지가 없을 때 발생하는 NotFoundException, 정적 리소스 파일이 없을 때 발생하는 NoResourceFoundException, 권한이 없을 때 발생하는 AccessDeniedException, 그리고 서버 내부 문제로 발생하는 RuntimeException로 적었다.

     

    NFE나 NRFE나 Controller 매핑 문제로 예외가 터지거나 Controller에도 없고 정적 리소스에도 없어서 터지는거나 맥락이 비슷해서 같은 걸 썼다.

     

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{fragments/default-layout}" layout:fragment="article">
    <section class="notice">
        <div class="page-title">
            <div class="container">
                <h3 style="color: #d1180b; font-weight: bold" th:text="${ERROR.ARTICLE_TITLE}"></h3>
            </div>
        </div>
    
        <div class="err-msg-group center">
            <p><strong th:text="${ERROR.MSG}"></strong></p>
        </div>
    
        <div class="btn-group center">
            <button type="button" class="btn btn-dark" id="search-btn" onclick="history.back()">돌아가기</button>
        </div>
    </section>
    </html>

     

     

    리팩토링 할 거 보이긴 한데..

    일단 기능 만들어놓고 나중에 여유 있을 때 고쳐야겠다.

    'Study > Spring' 카테고리의 다른 글

    [Spring] 검색 결과 미리보기  (0) 2024.11.17
    [Spring] 공개/비공개글  (2) 2024.11.03
    [Spring] RSS(XML) Parsing  (0) 2024.09.21
    댓글