코드를 작성하다보면 에러를 발견하는 것은 너무나 당연한 수순이다.
이러한 에러를 발견했을 때 이를 해결하기 위해 로그를 확인하고, 문제가 되는 부분을 추적해 해결해야만 한다.
하지만, 로그를 한 번이라도 확인해봤으면 알겠지만 이러한 로그는 길이가 짧지 않아 이를 읽고 파악하는데 생각보다 많은 시간이 소요되게 된다.
또한, 이러한 로그는 보안상 local 환경에서만 확인할 수 있도록 하여 별도의 처리가 없는 한 API를 가져다 쓰는 프론트 쪽에서는 오류가 발생해도 어떤 것이 문제인지 파악할 수 없는 경우가 빈번히 발생하게 된다.
예시를 들어보겠다.
아래 코드는 Integer a 를 전달 받고, 해당 값에 +3 을 더한 값을 반환하는 코드이다.
@PostMapping("/post")
public int post(@RequestBody Integer a) {
int response = a + 3;
return response;
}
다만, 모종의 이유로 a에는 0이라는 숫자를 입력할 수 없도록 해야만 한다면 어떻게 해야할까?
아마, 자바를 공부해본 적이 있는 사람은 if문이나 try catch 문을 떠올릴 것이다.
오답은 아니다. 다만, 아래와 같이 반환 타입이 String일 경우에는 아래와 같이 원하는 문자열을 직접 지정해 반환할 수 있겠지만,
@PostMapping("/post")
public String post(@RequestBody Integer a) {
if (a == 0) return "a는 0이 될 수 없습니다.";
int response = a + 3;
return "response = " + response;
}
예시와 같이 반환 타입이 Int 인 경우에는 어떻게 해야할까?
null 혹은 “-999” 와 같이 사용하지 않을 법한 문자를 반환하여 처리할 수도 있겠지만, 좋은 해결책은 아닐 것이다.
이럴 경우 사용하는 것이 Exception이다.
@PostMapping("/post")
public int post(@RequestBody Integer a) throws Exception {
if (a == 0) throw new Exception("a는 0이 될 수 없습니다.");
int response = a + 3;
return response;
}
위와 같이 throw new로 , Exception 을 사용하여 처리하게 되면 반환 값을 지정하지 않아도 처리할 수 있게 된다.
하지만 위와 같은 방식으로 a의 값을 0으로 지정해 요청을 보내보면,
로그에는 설정한 Exception에 대한 정보가 표시가 되지만, 실제 반환 되는 값에는 이러한 정보가 포함되지 않은 것을 확인할 수 있을 것이다.
이는 스프링을 사용하면 기본적으로 설정되어있는 값들로
( 자세히 알아보고 싶다면 BasicErrorController, AbstractErrorController, ErrorAttributes,ErrorController 등을 찾아보자 )
원하는 임의의 값을 반환하기 위해서는 별도의 조치를 취해야 한다.
아래와 같이 스프링 내부의 코드를 구현하는 방법 등 여러가지 방법들이 있지만
@Controller
public class CustomErrorController implements ErrorController {
@RequestMapping("/error")
public ResponseEntity<Object> handleError() {
Map<String, String> errorResponse = new HashMap<>();
errorResponse.put("message", "!!");
errorResponse.put("status", "1100");
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
보통은 간단하고 활용성이 높은 Exception handler 를 많이 사용한다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handler(Exception e) {
return e.getMessage();
}
}
@ExceptionHandler() 을 이용해 특정 Exception을 지정하게 되면, 해당 Exception이 던져졌을 때 설정된 메소드가 작동하게 된다. 덕분에 Exception이 던져졌을 때 아래 코드가 실행이 되게 되며,
return e.getMessage();
실제 반환 값에도 설정했던 값이 반환되는 것을 확인할 수 있다.
'Springboot' 카테고리의 다른 글
Content-Type 'application/octet-stream' is not supported 원인 및 해결 방법 (0) | 2025.02.05 |
---|---|
스프링부트 통합 테스트 코드 작성법 및 예시( TestRestTemplate , MockMVC , WebTestClient 차이점 및 선택 방법) given-when-then (0) | 2025.01.28 |
fixtureMonkey, JakartaValidationPlugin 제약 조건 설정 (0) | 2024.10.06 |
fixtureMonkey 객체 값 자동 생성 / springboot 테스트 코드 (0) | 2024.10.04 |
스프링부트 Repository TestCode ( 테스트 코드 / mybatis ) (0) | 2024.09.25 |