
서버에서의 처리 결과는 응답 메시지의 상태 라인에 있는 상태 코드(status code)를 보고 파악할 수 있습니다. 상태 코드는 세 자리 숫자로 되어 있는데 첫 번째 숫자는 HTTP 응답의 종류를 구분하는 데 사용하며 나머지 2개의 숫자는 세부적인 응답 내용 구분을 위한 번호입니다.
현재 100~500번 대까지 상태 코드가 정의되어 있는데 첫 번째 자리 숫자에 따라 다음과 같이 5가지로 분류해서 사용하고 있습니다.
- 1XX: Informational(정보 제공)
- 임시 응답으로 현재 클라이언트의 요청까지는 처리되었으니 계속 진행하라는 의미입니다. HTTP 1.1 버전부터 추가되었습니다.
- 2XX: Success(성공)
- 클라이언트의 요청이 서버에서 성공적으로 처리되었다는 의미입니다.
- 3XX: Redirection(리다이렉션)
- 완전한 처리를 위해서 추가 동작이 필요한 경우입니다. 주로 서버의 주소 또는 요청한 URI의 웹 문서가 이동되었으니 그 주소로 다시 시도하라는 의미입니다.
- 4XX: Client Error(클라이언트 에러)
- 없는 페이지를 요청하는 등 클라이언트의 요청 메시지 내용이 잘못된 경우를 의미합니다.
- 5XX: Server Error(서버 에러)
- 서버 사정으로 메시지 처리에 문제가 발생한 경우입니다. 서버의 부하, DB 처리 과정 오류, 서버에서 익셉션이 발생하는 경우를 의미합니다.
우리코드 컨벤션

package shop.mtcoding.blog.core.error; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import shop.mtcoding.blog.core.error.ex.*; import shop.mtcoding.blog.core.util.Script; @RestControllerAdvice public class GlobalExceptionHandler { //유효성 검사 실패 (잘못된 클라이언트의 요청) @ExceptionHandler(Exception400.class) public String ex400(Exception e) { return Script.back(e.getMessage()); } // 인증 실패(클라이언트가 인증없이 요청했거나, 인증을 하거나 실패했거나) @ExceptionHandler(Exception401.class) public String ex401(Exception e) { return Script.back(e.getMessage()); } // 권한 실패 (인증은 되어 있는데 삭제하려는 게시글이 내가 적은게 아니다.) @ExceptionHandler(Exception403.class) public String ex402(Exception e) { return Script.back(e.getMessage()); } // 서버에서 리스스(자원) 찾을 수 없을 때 @ExceptionHandler(Exception404.class) public String ex404(Exception e) { return Script.back(e.getMessage()); } // 서버에서 심각한 오류가 발생 했을 때(알고 있을 때) @ExceptionHandler(Exception500.class) public String ex500(Exception e) { return Script.back(e.getMessage()); } // 서버에서 심각한 오류가 발생 했을 때(모를 때) @ExceptionHandler(Exception.class) public String ex(Exception e) { return Script.back(e.getMessage()); } }
400, 401, 403 404와 500을 정리했고 나머지 Exception을 하나 두었다.

서비스 계층에서 예외 처리
컨트롤러에서 게시글의 id와 User 세션을 받아왔다.
BoardService
public void 게시글삭제(int post_id, User sessionUser) { //1. 컨트롤러에서 게시글 id를 받기 //2. 게시글 존재 여부 확인(404) Board board = boardRepository.findById(post_id); if (board == null) { throw new Exception404("존재하지 않는 게시글 입니다."); } //3. 내가 쓴글인지 확인하기(403) if (board.getId() != sessionUser.getId()) { throw new Exception403("제가쓴 글이 아닙니다."); } //4. 게시글 삭제 boardRepository.deleteById(post_id); }
필터를 통해서 문제가 생기는 부분을 예외 처리를 해보았다.
Board board = boardRepository.findById(post_id); if (board == null) { throw new Exception404("존재하지 않는 게시글 입니다."); }
여기 이부분은 Repository에서 예외처리를 해도된다.
BoardRepository
public Board findById(int id) { Query query = em.createQuery("select b from Board b join fetch b.user where b.id = :id", Board.class); query.setParameter("id", id); try { Board board = (Board) query.getSingleResult(); System.out.println("----------"); System.out.println(board); return board; } catch (Exception e) { e.printStackTrace(); //익세션을 내가 잡은것 까지 배움 - 처리 방법은 v2에서 배우기 //throw new Exception404("게시글 id를 찾을 수 없습니다."); return null; } }
findById를 테스트해본결과
없는 게시글 번호 7을 넣고 테스트하면 의도한 NoResultException이 터지고

이걸 Repository에서 throw new Exception404("게시글 id를 찾을 수 없습니다."); 이렇게 해도되고
return null;을 통해서 호출한 메서드한테 미뤄도 된다.
이렇게 발생한 예외가
게시글삭제
메서드에서 처리되지 않으면, 이 예외는 메서드를 호출한 곳으로 전파됩니다.2. 컨트롤러 계층에서 예외 처리
이렇게 발생한 예외가
게시글삭제
메서드에서 처리되지 않으면, 이 예외는 메서드를 호출한 곳으로 전파됩니다.서비스 계층에서 예외를 처리하지 않으면, 예외는 컨트롤러로 전파됩니다. 만약 컨트롤러에서 별도로 예외 처리를 하지 않았다면, 예외는
GlobalExceptionHandler
로 전달됩니다.
3. GlobalExceptionHandler
에서 예외 처리
package shop.mtcoding.blog.core.error; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import shop.mtcoding.blog.core.error.ex.*; import shop.mtcoding.blog.core.util.Script; @RestControllerAdvice public class GlobalExceptionHandler { //유효성 검사 실패 (잘못된 클라이언트의 요청) @ExceptionHandler(Exception400.class) public String ex400(Exception e) { System.out.println("44444444444444"); System.out.println(e.toString()); return Script.back(e.getMessage()); } // 인증 실패(클라이언트가 인증없이 요청했거나, 인증을 하거나 실패했거나) @ExceptionHandler(Exception401.class) public String ex401(Exception e) { return Script.back(e.getMessage()); } // 권한 실패 (인증은 되어 있는데 삭제하려는 게시글이 내가 적은게 아니다.) @ExceptionHandler(Exception403.class) public String ex402(Exception e) { return Script.back(e.getMessage()); } // 서버에서 리스스(자원) 찾을 수 없을 때 @ExceptionHandler(Exception404.class) public String ex404(Exception e) { return Script.back(e.getMessage()); } // 서버에서 심각한 오류가 발생 했을 때(알고 있을 때) @ExceptionHandler(Exception500.class) public String ex500(Exception e) { return Script.back(e.getMessage()); } // 서버에서 심각한 오류가 발생 했을 때(모를 때) @ExceptionHandler(Exception.class) public String ex(Exception e) { return Script.back(e.getMessage()); } }
Share article