본문 바로가기

카테고리 없음

#14 GlobalExceptionHandler와 Http 상태코드

전역 예외 처리기(Global Exception Handler)

애플리케이션의 모든 예외를 한 곳에서 처리할 수 있게 해주는 메커니즘입니다. 이를 통해 애플리케이션의 안정성을 높이고 예외 처리 로직을 중앙 집중화할 수 있습니다

 

Java Spring Boot에서는 전역 예외 처리를 위해 @ControllerAdvice@ExceptionHandler 어노테이션을 사용하여 전역 예외 처리기를 구현할 수 있습니다. 이를 통해 모든 컨트롤러에서 발생하는 예외를 중앙에서 처리할 수 있습니다. 다음은 Spring Boot 애플리케이션에서 전역 예외 처리기를 설정하는 방법의 예시입니다.

 

 

package com.example.demo.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;

@RestControllerAdvice
public class GlobalExceptionHandler {

    // 예외 처리를 위한 메서드 정의
    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> handleGlobalException(Exception ex, WebRequest request) {
        // 예외 메시지 및 상태 코드를 설정하여 응답 반환
        String errorMessage = ex.getMessage();
        return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    // 특정 예외 처리를 위한 메서드 정의 (예: NullPointerException)
    @ExceptionHandler(NullPointerException.class)
    public ResponseEntity<?> handleNullPointerException(NullPointerException ex, WebRequest request) {
        String errorMessage = "Null pointer exception occurred: " + ex.getMessage();
        return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
    }

    // 커스텀 예외 처리를 위한 메서드 정의 (예: CustomException)
    @ExceptionHandler(CustomException.class)
    public ResponseEntity<?> handleCustomException(CustomException ex, WebRequest request) {
        String errorMessage = ex.getCustomMessage();
        return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
    }
}

 

 

 

 

필요하다면 애플리케이션에서 사용할 커스텀 예외를 정의할 수 있습니다.

 

package com.example.demo.exception;

public class CustomException extends RuntimeException {
    private String customMessage;

    public CustomException(String customMessage) {
        super(customMessage);
        this.customMessage = customMessage;
    }

    public String getCustomMessage() {
        return customMessage;
    }
}

 

 

 

 

 

컨트롤러나 서비스 클래스에서 예외를 발생시켜 전역 예외 처리기가 잘 동작하는지 확인할 수 있습니다.

 

package com.example.demo.controller;

import com.example.demo.exception.CustomException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @GetMapping("/exception")
    public String throwException() {
        // 예외 발생
        throw new CustomException("This is a custom exception message");
    }

    @GetMapping("/nullpointer")
    public String throwNullPointerException() {
        // NullPointerException 발생
        throw new NullPointerException("This is a null pointer exception");
    }
}

 

위의 예시에서 /exception 엔드포인트를 호출하면 CustomException이 발생하고, /nullpointer 엔드포인트를 호출하면 NullPointerException이 발생합니다. 이 예외들은 GlobalExceptionHandler 클래스에서 정의된 메서드에 의해 처리됩니다.

이렇게 전역 예외 처리기를 설정하면 Spring Boot 애플리케이션의 예외 처리가 중앙 집중화되어 유지보수가 용이해집니다.

 

 

 

 

 

 

 

HTTP 상태코드

 

HTTP 상태 코드는 클라이언트가 보낸 요청의 처리 결과를 나타내는 세자리 숫자로 구성됩니다. 상태 코드는 5개의 범주로 나뉩니다:

  1. 1xx (정보 응답): 요청을 받았으며 프로세스를 계속합니다.
  2. 2xx (성공): 요청을 성공적으로 받았으며 인식했고 수용했습니다.
  3. 3xx (리다이렉션): 요청 완료를 위해 추가 작업 조치가 필요합니다.
  4. 4xx (클라이언트 오류): 요청에 오류가 있어 서버가 요청을 처리할 수 없습니다.
  5. 5xx (서버 오류): 서버가 유효한 요청을 처리하지 못했습니다.

각 범주에 속하는 주요 상태 코드들을 살펴보겠습니다.

1xx (정보 응답)

  • 100 Continue: 클라이언트가 요청의 첫 번째 부분을 보내서 서버가 이를 받았고 계속 진행해도 됨을 알려줍니다.
  • 101 Switching Protocols: 서버가 클라이언트의 요청에 따라 프로토콜을 변경하고 있습니다.

2xx (성공)

  • 200 OK: 요청이 성공적으로 수행되었습니다.
  • 201 Created: 요청이 성공적이었으며, 서버가 새로운 리소스를 생성했습니다.
  • 202 Accepted: 요청을 접수했지만, 아직 처리하지 않았습니다.
  • 204 No Content: 요청이 성공했지만 반환할 컨텐츠가 없습니다.

3xx (리다이렉션)

  • 300 Multiple Choices: 여러 선택 가능한 리소스가 있습니다.
  • 301 Moved Permanently: 요청된 리소스가 새로운 URI로 영구적으로 이동되었습니다.
  • 302 Found: 요청된 리소스가 임시로 다른 URI에 위치합니다.
  • 304 Not Modified: 요청된 리소스가 수정되지 않았습니다. 캐시된 버전을 사용해도 됩니다.
  • 307 Temporary Redirect: 요청된 리소스가 임시로 다른 URI에 위치합니다. GET 메서드만 허용합니다.
  • 308 Permanent Redirect: 요청된 리소스가 영구적으로 다른 URI에 위치합니다. 이전 메서드가 유지됩니다.

4xx (클라이언트 오류)

  • 400 Bad Request: 서버가 요청의 구문을 인식하지 못했습니다.
  • 401 Unauthorized: 인증이 필요합니다.
  • 403 Forbidden: 서버가 요청을 거부했습니다.
  • 404 Not Found: 요청된 리소스를 찾을 수 없습니다.
  • 405 Method Not Allowed: 요청에 지정된 메서드가 허용되지 않습니다.
  • 409 Conflict: 요청이 리소스의 현재 상태와 충돌했습니다.
  • 429 Too Many Requests: 클라이언트가 너무 많은 요청을 보냈습니다.

5xx (서버 오류)

  • 500 Internal Server Error: 서버가 요청을 처리하는 동안 오류가 발생했습니다.
  • 501 Not Implemented: 서버가 요청을 수행할 수 있는 기능을 지원하지 않습니다.
  • 502 Bad Gateway: 서버가 상위 서버로부터 잘못된 응답을 받았습니다.
  • 503 Service Unavailable: 서버가 일시적으로 요청을 처리할 수 없습니다.
  • 504 Gateway Timeout: 서버가 상위 서버로부터 응답을 기다리다 시간 초과가 발생했습니다.
  • 505 HTTP Version Not Supported: 서버가 요청에 사용된 HTTP 버전을 지원하지 않습니다.

이러한 상태 코드는 HTTP 응답의 상태를 설명하는데 사용되며, 클라이언트와 서버 간의 통신을 효과적으로 관리하는 데 도움이 됩니다. Spring Boot에서도 이 상태 코드를 사용하여 적절한 응답을 클라이언트에 반환할 수 있습니다.