티스토리 뷰

Skill/spring

[spring boot] error 처리 예제

진열사랑 2021. 2. 25. 17:55

이전글에서의 이론을 바탕으로 실전 적용 편이다.

 

내 사이트에서 자주 발생하는 에러는 중복된 값으로 등록할 때 발생한다.

unique index로 DB에 저장되는 것을 방지하였다.

그러나 FRONT 단에서도 점검해야 하는데.. 중복되지 말아야 할 COLUMN이 여러개이어서 각 테이블의 COLUMN을 점검하는 것은 2번 이상 DB를 접근하게 되는 불필요한 에너지가 낭비되는 문제가 있었다. ajax를 호출하여 이미 등록되어 있는 레코드가 있는지 점검해야 한다. 그래서 하루를 소비하여 spring에러 처리에 돌입..

 

이전글의 ExceptionHandler를 이용하여 처리하였다.

에러의 종류가 많아지면 더 method를 추가하면 될 듯 하다.

 

unique index가 중복될 때 발생하는 에러는 ConstraintViolationException 

Jquery의 ajax에서는 해당 에러가 발생할 때 alert처리하도록 하였다.

@ControllerAdvice
@RestController
public class GlobalExceptionHandler {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@ExceptionHandler(value=Exception.class)
	public ResponseEntity<String> handlerArgumentException(Exception e) {
		logger.debug(HttpStatus.INTERNAL_SERVER_ERROR.value() + " : " + e.getMessage());
		String result =  e.getMessage();
		ResponseEntity<String> responseEntity = new ResponseEntity<String>(result, HttpStatus.INTERNAL_SERVER_ERROR); // 500 반환
		e.printStackTrace();
    	return responseEntity;

	}
}
$.ajax({
	url: options.url
	, type: options.method
	, data: pars
	, dataType: "JSON"
	, contentType: 'application/json;charset=UTF-8'
	, async : options.async
	, success: function(data) {
		options.successCallback(data);
	}
	, error: function( jqXHR, textStatus ) {
		if (jqXHR.status == 401) {
			window.location.href = "/login/page"; 
		} else if (jqXHR.status == 500 && jqXHR.responseText.indexOf("ConstraintViolationException")) {
			alert("중복된 값(영문약어,단어명or용어명..)이 있습니다. 검색 후 등록하세요.");
		} else {
			alert("시스템 오류입니다. 잠시 후 다시 접속하시기 바랍니다. [ message: " + jqXHR.responseText + "\error:" + textStatus+ "]");
		}
	}
});

----

추가 알아볼 사항

1. @Valid 어노테이션으로 JSR 303: Bean Validation에 대한 검증을 진행 합니다.

출처 : cheese10yun.github.io/spring-guide-exception/

@RestController
@RequestMapping("/members")
public class MemberApi {

    private final MemberSignUpService memberSignUpService;

    @PostMapping
    public MemberResponse create(@RequestBody @Valid final SignUpRequest dto) {
        final Member member = memberSignUpService.doSignUp(dto);
        return new MemberResponse(member);
    }
}

2. 에러의 원인이 되는 더 내부의 Caused by Exception을 보여주는 방법

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함