본문 바로가기

JAVA

[JAVA] Exception을 떨어트리고 response를 custom 해보자!

반응형

안녕하세요, 도토리입니다.

잘못된 정보가 있거나 오류가 있으면 언제든지 댓글로 이야기 해주세요!! 😅

 

이번에 공통으로 Exception을 떨어트리고 공통 Response를 만드는 작업을 미래의 나와 모두에게 도움이 되고자 공유하려고 합니다.

 

Exception을 생성해보자!

아래와 같이 예를들어 db에서 findById를 하였으나, 값이 없을 경우에 NotExistException을 떨어트린다고 가정해보자.

// jpaRepository에서 상속받은 findById 코드.. 당연히 Null처리를 위해 Optional로 받겠죠?

Optional<T> findById(ID id);
// 호출해서 사용하는 Service 부분 코드

public Customer findCustomer(String custNo) throws NotExistException {
		return custRepo.findById(custNo)
			.orElseThrow(() -> new RuntimeException();
	}

 

위와 같은 경우에는  이제 custRepo에서 findById를 해왔을때, 해당 id로 조회되는 Customer가 없는 경우에는 NPE가 떨어지지 않도록 .orElseThrow를 통해 NotExistException을 떨어트리는 코드이다.

 

이러면 캡쳐는 못했지만.. 막 엄청 길게 Exception이 떨어지면서 내가 원하는 response 응답값을 주지 않는다..

 

( 내가 원하는 깔끔한 response 응답값 예시 )

{
  "status": 400,
  "result": [
    {
      "xxxx": "xxxxx",
      "yyyyy": "yyyyy",
      "resultCode": "zzzzzz",
      "resultMessage": "tttttt"
    }
  ]
}

 

깔끔한 응답값을 어떻게 줄 수 있을까?

 

깔끔한 응답값을 주려면 먼저 Exception을 알맞게 세팅해주어야한다.

아래와 같이 예를들어 어떤것이 없을때는 이렇게 Exception을 던지자! 라고 개발자들 끼리 합의가 되고..

아래의 Exception을 만들어보자.

// Exception class

@Getter
@AllArgsConstructor
public class NotExistException extends Exception {

	private ResponseCdAndMesg responseCdAndMesg;

	private String key;

	private String inputValue;

}

 

Exception을 만들었다면 다시 위의 코드에서 Exception을 추가하며 몇가지를 수정해보자.

// 호출해서 사용하는 Service 부분 코드

public Customer findCustomer(String custNo) throws NotExistException {
		return custRepo.findById(custNo)
			.orElseThrow(() -> new NotExistException(ResponseCdAndMesg.NOT_EXIST_CUSTOMER, "", custNo));
	}

새롭게 만든 Exception을 던지고, 안에 응답코드와 메시지로 구성되어있는 Enum 객체와, key, inputValue를 각각 넣어주었다.

 

이렇게 하더라도 여전히 위에서 원하는 깔끔한 response 응답값을 얻지는 못하고, 넣은 Enum객체와 key, inputValue들을 볼 수는 있지만 우루루루 길게 Exception이 떨어지는것을 볼 수 있을 것이다.

 

이제는, 이 Exception이 떨어지는 부분을 확인해야한다.

추가로 이부분은 구현해서 스크린샷을 첨부하도록 하겠다..

 

깔끔한 응답값을 주기위해 custom 해보자!

아마 log 찍히는것을 보면 NotExistException이 떨어지는것을 볼 수 있을텐데 이를 잡아서 응답값을 custom 해보자

 

아래와 같이 ValidationAdvisor이라는 클래스를 생성하고... ExceptionHandler를 통해서 custom 할 수 있다.

@Slf4j
@ControllerAdvice
public class ValidationAdvisor {

	@ResponseBody
	@ResponseStatus(HttpStatus.BAD_REQUEST)
	@ExceptionHandler({NotExistException.class})
	public CommonResponse processValidationError(NotExistException e) {
	CommonResponse response = new CommonResponse<>();
	String message = this.messageMake(e.getKey(), e.getResponseCdAndMesg().getMessage(), e.getInputValue());

	CommonResultResponse result = CommonResultResponse.builder().resultCode(e.getResponseCdAndMesg().getCd()).resultMessage(message).build();
	
	return response.setResponse(HttpStatus.BAD_REQUEST, result);
	}
}

 

@ExceptionHandler({NotExistException.class})를 통해서 NotExistException이 떨어진다면 해당 로직을 타서 미리 설정해둔 CommonResponse로 return할 수 있는것이다.

 

이렇게 ExceptionHandler를 통해서 response를 세팅하고 원하는 result를 만들어서 return 시켜주면 원하는 response를 만들어서 줄 수 있다!

 

마무리

사실.. 얼마전까지만 해도 어차피 response는 front단에 정보를 넘겨주고 front에서 많은것을 처리하여서 고민하지는 않았는데..

이번에 외부 고객들이 불러다가 쓰는 API 작업을 하다보니, response나 Exception 부분에서도 조금 신경을 쓰면서 새로운 지식을 알게 되었다.

 

나 뿐만 아니라 모두에게 도움이 될 수 있도록 도움이 되셨다면 댓글 한번 부탁드리겠습니다 ㅎㅎ!

반응형