방명록
- [Spring] CustomExceptionController2024년 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 다음글이 없습니다.이전글이 없습니다.댓글