Exception(익셉션)
@ControllerAdvice는 전역으로 exception handling을 할 수 있습니다.
@ControllerAdvice 시작하기
GlobalExceptionHandler
package com.jjamong.hormone.common.util.handler;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.jjamong.hormone.common.response.ResponseError;
import com.jjamong.hormone.common.util.CustomException;
import lombok.extern.slf4j.Slf4j;
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
protected ResponseEntity<ResponseError> handleCustomException(final CustomException e) {
return ResponseEntity
.status(e.getErrorCode().getStatus().value())
.body(new ResponseError(e.getErrorCode()));
}
}
ResponseError
package com.jjamong.hormone.common.response;
import org.springframework.http.ResponseEntity;
import com.jjamong.hormone.common.util.CustomException;
import com.jjamong.hormone.common.vo.ErrorCode;
import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@Builder
@RequiredArgsConstructor
public class ResponseError {
private final String error;
private final int code;
private final String msg;
public ResponseError(ErrorCode errorCode) {
this.error = errorCode.getError();
this.code = errorCode.getCode();
this.msg = errorCode.getMsg();
}
public static ResponseEntity<ResponseError> error(CustomException e) {
return ResponseEntity
.status(e.getErrorCode().getStatus())
.body(ResponseError.builder()
.code(e.getErrorCode().getCode())
.msg(e.getErrorCode().getMsg())
.build());
}
}
ErrorCode
package com.jjamong.hormone.common.vo;
import org.springframework.http.HttpStatus;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ErrorCode {
BAD_REQUEST(HttpStatus.OK, "API오류", 101, "잘못된 요청입니다."),
API_NOT_FOUND(HttpStatus.OK, "API오류", 102, "API 정보를 찾을 수 없습니다."),
METHOD_NOT_ALLOWED(HttpStatus.OK, "API오류", 103, "허용되지 않은 메서드입니다."),
INTERNAL_SERVER_ERROR(HttpStatus.OK, "API오류", 104, "내부 서버 오류입니다."),
INPUT_ERROR(HttpStatus.OK, "API오류", 105, "입력 필드를 다시 확인해주세요."),
DUPLICATION_ERROR(HttpStatus.OK, "API오류", 106, "중복 필드 존재"),
DATABASE_ERROR(HttpStatus.OK, "API오류", 107, "데이터베이스 오류"),
AUTH_ERROR(HttpStatus.OK, "API오류", 108, "권한이 없는 사용자입니다."),
API_NOT_ALLOWED(HttpStatus.OK, "API오류", 109, "접근할 수 없습니다."),
// TOKEN ERROR
INVALID_TOKEN(HttpStatus.OK, "토큰오류", 201, "유효하지 않은 토큰입니다."),
EXPRIATION_TOKEN(HttpStatus.OK, "토큰오류", 202, "인증 정보가 만료되었습니다."),
INVALID_REFRESH_TOKEN(HttpStatus.OK, "토큰오류", 203, "REFRESH TOKEN이 유효하지 않습니다."),
INVALID_USER_TOKEN(HttpStatus.OK, "토큰오류", 204, "토큰의 유저 정보가 일치하지 않습니다."),
FORBIDDEN_ERROR(HttpStatus.FORBIDDEN, "토큰오류", 403, "권한접근 에러"),
// AUTH ERROR
IDANDPW_NOT_FOUND(HttpStatus.OK, "회원오류", 301, "아이디나 또는 비밀번호를 다시 확인해주세요."),
USER_NOT_FOUND(HttpStatus.OK, "회원오류", 302, "일치하는 회원이 없습니다."),
NO_INPUT_PWIDERROR(HttpStatus.OK, "회원오류", 304, "아이디 또는 비밀번호를 입력해주세요."),
UNAPPROVED_LOGIN(HttpStatus.OK, "회원오류", 311, "관리자 승인을 기다리고 있는 아이디입니다."),
// IMAGE ERROR
IMAGE_SERVER_ERROR(HttpStatus.OK, "이미지오류", 401, "서버 오류 : 이미지가 생성되지 않았습니다."),
IMAGE_DELETE_ERROR(HttpStatus.OK, "이미지오류", 402, "서버 오류 : 이미지가 삭제되지 않았습니다."),
IMAGE_ERROR(HttpStatus.OK, "이미지오류", 403, "이미지 형식이 맞지 않습니다."),
IMAGE_INPUT_ERROR(HttpStatus.OK, "이미지오류", 405, "이미지 입력을 다시 확인해주세요."),
// Order Error
OVER_ORDER(HttpStatus.OK, "주문오류", 501, "소모품 신청이 불가능합니다."),
// CMS ERROR
INPUT_NURSE_ERROR(HttpStatus.OK, "CMS오류", 601, "간호사 정보를 등록해주세요."),
// FASSTO ERROR
FASSTO_SYSTEM_ERROR(HttpStatus.OK, "FASSTO오류", 801, "FASSTO TOKEN 오류"),
FASSTO_BAD_ERROR(HttpStatus.OK, "FASSTO오류", 802, "Bad Request"),
FASSTO_AUTH_ERROR(HttpStatus.OK, "FASSTO오류", 803, "Unauthorized"),
FASSTO_UNKNOW_ERROR(HttpStatus.OK, "FASSTO오류", 804, "잘못된 경로"),
FASSTO_DENY_ERROR(HttpStatus.OK, "FASSTO오류", 805, "접근 거부"),
FASSTO_SERVER_ERROR(HttpStatus.OK, "FASSTO오류", 806, "서버 에러"),
FASSTO_INPUT_ERROR(HttpStatus.OK, "FASSTO오류", 807, "단위 수량을 0개 이상 입력하세요."),
FASSTO_PRODUCT_ERROR(HttpStatus.OK, "FASSTO오류", 808, "해당 상품의 재고가 부족합니다. 관리자에게 문의해주세요.");
private final HttpStatus status;
private final String error;
private final int code;
private final String msg;
}
controller
package com.jjamong.hormone.user.controller;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.jjamong.hormone.common.response.ResponseCommon;
import com.jjamong.hormone.common.util.CustomException;
import com.jjamong.hormone.common.vo.ErrorCode;
import com.jjamong.hormone.user.request.RequestLogin;
import lombok.RequiredArgsConstructor;
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/user")
public class UserController {
@RequestMapping(value = "/login", method = { RequestMethod.POST })
public ResponseEntity<ResponseCommon<Object>> login(@RequestBody RequestLogin requestLogin,
HttpServletResponse rep) {
if (true) {
throw new CustomException(ErrorCode.USER_NOT_FOUND);
}
return null;
}
}