Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

devNyong

Rest Api Exception 처리 ExceptionAdvice 본문

springboot

Rest Api Exception 처리 ExceptionAdvice

devNyong 2022. 5. 31. 14:42
  • @RestControllerAdvice : Exception 발생 시 JSON으로 반환받기 위하여 생성합니다.
  • @ExceptionHandler: Bean에서 발생하는 에러를 잡아 처리합니다
전역의 예외를 잡긴하되 패키지 단위로 제한 할 수 도 있다.
@RestControllerAdvice("com.example.demo.login.controller")
@RestControllerAdvice(basePackages = "com.spring2.nyong.api")
@RequiredArgsConstructor
@RestControllerAdvice(basePackages = "com.spring2.nyong.api")
public class ExceptionAdvice {

	private final ResponseService responseService; 
	
	/**
	 * default Exception 
	 * @author nyong
	 * @return CommonResult
	 * @throws Exception
	 */
	@ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    protected CommonResult defaultException(HttpServletRequest request, Exception e) {
        return responseService.getFailResult(
        		HttpStatus.INTERNAL_SERVER_ERROR.value()
        		, e.getMessage()
        );
    }
	
	/**
	 * AccessDeniedException 
	 * @author nyong
	 * @return CommonResult
	 * @throws Exception
	 */
	@ExceptionHandler({ AccessDeniedException.class })
	@ResponseStatus(HttpStatus.UNAUTHORIZED)
	public CommonResult unauthorizedException(Exception e) {
		return responseService.getFailResult(
				HttpStatus.UNAUTHORIZED.value()
				, e.getMessage()
		);
	}
	
	/**
	 * badRequestException
	 * @author nyong
	 * @return CommonResult
	 * @throws Exception
	 */
	@ExceptionHandler({HttpMessageNotReadableException.class, MethodArgumentNotValidException.class, MissingServletRequestParameterException.class, UnsatisfiedServletRequestParameterException.class})
	@ResponseStatus(HttpStatus.BAD_REQUEST)
	public CommonResult badRequestException(Exception e)throws Exception {
		 return responseService.getFailResult(
				 HttpStatus.BAD_REQUEST.value()
				 , e.getMessage()
		 );
	}

	/**
	 * forbiddenException
	 * @author nyong
	 * @return CommonResult
	 * @throws Exception
	 */
	@ExceptionHandler(ForbiddenException.class)
	@ResponseStatus(HttpStatus.FORBIDDEN)
	public CommonResult forbiddenException(ForbiddenException e) throws Exception {
		return responseService.getFailResult(
				HttpStatus.FORBIDDEN.value()
				, e.getMessage()
		);
	}

	
}

resultModel은 따로 코드를 안올렸는데 정말 구글에 검색하면 나온다.

심지어 서비스나 controllerAdvice는 조금씩 달라도 모델은 진짜 모두가 한마음 한뜻인지 다 똑같음 commonResult 검색 하면 다 똑같은 코드가 많이 나온다. 

@Service
public class ResponseService {

	@Getter
	@RequiredArgsConstructor
	@AllArgsConstructor
	// enum으로 API 요청 결과에 대한 status, message를 정의한다.
	public enum CommonResponse {
		SUCCESS(200, "SUCCESS",new HashMap<String,Object>()), 
		FAIL(500, "FAIL",new HashMap<String,Object>());

		private int status; // http 코드값
		private String msg; // message
		private Map<String,Object> data;
	}

	// 단일건 결과를 처리하는 메소드
	public <T> SingleResult<T> getSingleResult(T data, int status, String msg) {
		SingleResult<T> result = new SingleResult<>();
		result.setData(data);
		setSuccessResult(result, status, msg);
		return result;
	}

	// 다중건 결과를 처리하는 메소드
	public <T> ListResult<T> getListResult(List<T> list, int status, String msg) {
		ListResult<T> result = new ListResult<>();
		result.setList(list);
		setSuccessResult(result, status, msg);
		return result;
	}

	// 성공 결과만 처리하는 메소드
	public JsonResult getSuccessResult() { // CommonResult 응답 결과를 알려주는 클래스
		JsonResult result = new JsonResult();
		result.setData(CommonResponse.SUCCESS.getData());
		setSuccessResult(result);
		return result;
	}

	// 실패 결과만 처리하는 메소드
	public JsonResult getFailResult(int status, String msg) {
		JsonResult result = new JsonResult();
		result.setSuccess(false); 
		result.setStatus(status);
		result.setMsg(msg); 
		result.setData(CommonResponse.FAIL.getData());
		return result;
	}
	
	
	
	
	// 결과 모델에 API 요청 성공 데이터를 세팅해주는 메소드
	private void setSuccessResult(CommonResult result) {
		result.setSuccess(true);
		result.setStatus(CommonResponse.SUCCESS.getStatus());
		result.setMsg(CommonResponse.SUCCESS.getMsg());
	}

	// 결과 모델에 API 요청 성공 데이터를 세팅해주는 메소드
	private void setSuccessResult(CommonResult result, int status, String msg) {
		result.setSuccess(true);
		result.setStatus(status);
		result.setMsg(msg);
	}

요즘들어 return 결과값이 일정하면 좋겠어서 성공이든 실패든 요형태로 리턴하려고 만들었다.

근데 뭔가 코드가 맘에안든다 

{

       status : 

       message :  

       data : 

 

 

 

 

 

 

 

'springboot' 카테고리의 다른 글

[Oracle] mybatis 날짜 조회  (0) 2022.10.07
스프링 서버 경로 구하기  (0) 2022.06.15
[ SpringBoot ] api test , jpa test 코드  (0) 2022.05.18
Comments