본문 바로가기
❤️‍🔥TIL (Today I Learned)

[TIL] 2022-12-29(44day)

by elicho91 2022. 12. 29.

Spring Exception


👉 웹 어플리케이션의 에러 

참고: HTTP 메시지 설명 (MDN Web Docs)

 

# HTTP 상태 코드 종류

 - 2xx Success → 200번대의 상태코드는 성공을 의미.
 - 4xx Client Error → 400번대의 상태코드는 클라이언트 에러, 즉 잘못된 요청을 의미.
 - 5xx Server Error → 500번대의 상태코드는 서버 에러, 즉 정확한 요청에 서버쪽 사유로 에러가 난 상황을 의미.

 

# org.springframework.http > HttpStatus

더보기
public enum HttpStatus {
	// 1xx Informational
	CONTINUE(100, Series.INFORMATIONAL, "Continue"),
	// ...

	// 2xx Success
	OK(200, Series.SUCCESSFUL, "OK"),
	CREATED(201, Series.SUCCESSFUL, "Created"),
	// ...

	// 3xx Redirection
	MULTIPLE_CHOICES(300, Series.REDIRECTION, "Multiple Choices"),
	MOVED_PERMANENTLY(301, Series.REDIRECTION, "Moved Permanently"),
	FOUND(302, Series.REDIRECTION, "Found"),
	// ...

	// --- 4xx Client Error ---
	BAD_REQUEST(400, Series.CLIENT_ERROR, "Bad Request"),
	UNAUTHORIZED(401, Series.CLIENT_ERROR, "Unauthorized"),
	PAYMENT_REQUIRED(402, Series.CLIENT_ERROR, "Payment Required"),
	FORBIDDEN(403, Series.CLIENT_ERROR, "Forbidden"),
	// ...
	

	// --- 5xx Server Error ---
	INTERNAL_SERVER_ERROR(500, Series.SERVER_ERROR, "Internal Server Error"),
	NOT_IMPLEMENTED(501, Series.SERVER_ERROR, "Not Implemented"),
	BAD_GATEWAY(502, Series.SERVER_ERROR, "Bad Gateway"),
	// ...

 

👉 스프링의 예외처리 (ResponseEntity 클래스를 사용)

 - ResponseEntity는 HTTP response object 를 위한 Wrapper

 - HTTP status code / HTTP headers / HTTP body 등을 담아서 response로 내려주면 아주 간편하게 처리가 가능.

 

# Global 예외 처리

 - 예외처리는 공통적으로 필요한 곳에서 에러를 만들어서 던지고, 그 에러를 받는곳이 어디든(어떤 컨트롤러였든) 그 에러내용을 담아서 클라이언트에 보내주면 된다.

@ControllerAdvice가 중간에서 요청을 기다리고 있다가 Exception으로 잡아 채서 클라이언트로 보내준다.

 

# RestApiException.java 추가

package com.sparta.myselectshop.exception;

import lombok.Getter;
import lombok.Setter;
import org.springframework.http.HttpStatus;

@Getter
@Setter
// 에러메시지나 status 주는 부분 (DTO랑 비슷한 부분)
public class RestApiException {
    private String errorMessage;
    private HttpStatus httpStatus;
}

 

# RestApiExceptionHandler.java 추가

@RestControllerAdvice
public class RestApiExceptionHandler {

    @ExceptionHandler(value = { IllegalArgumentException.class })
    public ResponseEntity<Object> handleApiRequestException(IllegalArgumentException ex) {
        RestApiException restApiException = new RestApiException();
        restApiException.setHttpStatus(HttpStatus.BAD_REQUEST);
        restApiException.setErrorMessage(ex.getMessage());

        return new ResponseEntity(
                restApiException,
                HttpStatus.BAD_REQUEST
        );
    }
}

 

# 에러코드 enum으로 관리하기 예시

더보기
package com.sparta.myselectshop.exception;

import org.springframework.http.HttpStatus;

import static com.sparta.myselectshop.service.ProductService.MIN_MY_PRICE;


public enum ErrorCode {
    // 400 Bad Request
    DUPLICATED_FOLDER_NAME(HttpStatus.BAD_REQUEST, "400_1", "중복폴더명이 이미 존재합니다."),
    BELOW_MIN_MY_PRICE(HttpStatus.BAD_REQUEST, "400_2", "최저 희망가는 최소 " + MIN_MY_PRICE + " 원 이상으로 설정해 주세요."),

    // 404 Not Found
    NOT_FOUND_PRODUCT(HttpStatus.NOT_FOUND, "404_1", "해당 관심상품 아이디가 존재하지 않습니다."),
    NOT_FOUND_FOLDER(HttpStatus.NOT_FOUND, "404_2", "해당 폴더 아이디가 존재하지 않습니다."),
    ;

    private final HttpStatus httpStatus;
    private final String errorCode;
    private final String errorMessage;

    ErrorCode(HttpStatus httpStatus, String errorCode, String errorMessage) {
        this.httpStatus = httpStatus;
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }
}

 

 


🙋‍♂️ 소감 : 

예외처리는 꼭 발생할 수 밖에 없는 부분이어서 항상 염두해두고 작업해야겠다.

😈 아는 내용이라고 그냥 넘어가지 않기! 😈

'❤️‍🔥TIL (Today I Learned)' 카테고리의 다른 글

[TIL] 2023-01-02(46day)  (0) 2023.01.02
[TIL] 2022-12-30(45day)  (0) 2023.01.01
[TIL] 2022-12-28(43day)  (0) 2022.12.28
[TIL] 2022-12-27(42day)  (0) 2022.12.28
[TIL] 2022-12-26(41day)  (0) 2022.12.27

댓글