Spring Exception
👉 웹 어플리케이션의 에러
# 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 예외 처리
- 예외처리는 공통적으로 필요한 곳에서 에러를 만들어서 던지고, 그 에러를 받는곳이 어디든(어떤 컨트롤러였든) 그 에러내용을 담아서 클라이언트에 보내주면 된다.
# 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 |
댓글