• 티스토리 홈
  • 프로필사진
    ZaMan
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
ZaMan
  • 프로필사진
    ZaMan
    • 분류 전체보기 (11)
      • BackEnd (3)
        • DataBase (2)
        • Spring (1)
        • Kotlin (1)
      • Web (2)
      • 회고 (1)
      • 코테 (1)
      • 기타 (0)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [BackEnd] 예외 처리
        2025년 07월 15일
        • ZaMan
        • 작성자
        • 2025.07.15.:07

        예외처리를 하는 이유

        예외를 발생시켜서 로그를 남기면 로그를 확인하고 문제가 발생한 원인을 빠르게 찾을 수 있습니다.


        예를 들어 게시글마다 고유 id가 있고

        어떤 id의 게시글을 찾을려고 할 때, 게시글이 존재한다면 아래 사진과 같이 게시글 정보가 응답이 됩니다.

        그러나 만약 id에 해당하는 게시글이 존재하지 않거나, 다른 예외에서는

        아래 사진과 같이 상태 코드 500(서버 에러)이 응답으로 옵니다.

        여기서 오류의 원인도 안적혀있으니, 어느 부분에서 문제가 발생한건지 파악하기가 어렵습니다.

        그래서 id에 해당하는 게시글이 없는 경우는 404 Not found와 함께 오류 원인을 함께 보내는 예외 처리를 했더니,

        왜 문제가 발생했는지 한 눈에 보기도 쉬워졌습니다.

        장점

        • 각 문제마다 예외 처리로 맞는 로그를 남겨서 문제 추적이 쉬움
        • 사용자에게 의미 있는 문제 메시지와 상태 코드를 전달해서 어떤 문제인지 이해하기 쉽게 해줌
        • 예외를 그대로 노출하면 서버 내부 구조, 클래스 이름, DB 정보 등이 외부에 드러나지만, 예외 처리를 통해 안전하게 정보 필터링 가능
        • 예외가 발생해도 앱 전체가 중지되지 않고 안전하게 가능

        사용 방법

        주로 Exception(예외) 패키지에 예외들을 저장합니다.

        그리고 도메인 기반 구조 + 글로벌 공통 계층 구조를 사용할때는

        domain에는 해당 기능에서만 쓰이는 예외를,

        global에서는 전체적으로 쓰이는 예외를 저장합니다.

        코드 작성

        1. 원하는 예외에 맞는 클래스 생성

        public class NotFoundException extends RuntimeException {
            public NotFoundException(String message) {super(message);}
        }

         

         

        2. Service에서 해당 클래스로 예외를 던져줍니다.

        ArticleEntity articleEntity = articleRepository.findById(id)
        	.orElseThrow(() -> new NotFoundException("해당 아이디의 게시글이 존재하지 않습니다."));

        이때 서비스에서 예외가 발생한다면 다음에 작동할 서비스의 코드와 컨트롤러의 코드는 작동하지 않고 하던 작업을 중단합니다.

         

        3. GlobalExceptionHandler(관례처럼 사용)로 전역으로 예외 처리

        @RestControllerAdvice
        public class GlobalExceptionHandler extends RuntimeException {
          @ExceptionHandler(NotFoundException.class)
          public ResponseEntity<Map<String, String>> handleNotFoundException(NotFoundException e) {
            Map<String, String> map = new HashMap<>();
            map.put("error", e.getMessage());
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(map);
          }
        }

        @ExceptionHandler(NotFoundException.class)를 사용해서 해당 예외 처리 클래스가 작동할 때 아래 메서드가 작동합니다.

        'BackEnd' 카테고리의 다른 글

        [BackEnd] FetchType & N+1 문제  (1) 2025.08.06
        [BackEnd] QueryDSL  (1) 2025.07.21
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바