웹 애플리케이션
- 에러 페이지
- 4XX or 5XX 에러
- Clinet 가 200외의 처리를 하지 못할 때는
200을 내려주고 별도의 에러 message 전달
Spring
@ControllerAdvice
전역(Global) 예외 처리, 특정 패키지, 특정 컨트롤러@ExceptionHandler
특정 컨트롤러
@RequestParam(required = false)
꼭 필수가 아니여도 됨
주소?name=1234
이런 값이 없어도 일단 실행시키겠다는 뜻
@RestController
@RequestMapping("/api")
public class APIController {
@GetMapping("")
public User get(@RequestParam(required = false) String name, @RequestParam(required = false) Integer age) {
User user = new User();
user.setName(name);
user.setAge(age);
// 예외 발생
int a = 10+age;
return user;
}
@PostMapping("")
public User post(@Valid @RequestBody User user) {
System.out.println(user);
return user;
}
}
@NotNull
nullpointexception
이 발생할 것 @NotEmpty
@Size(min = 1, max = 10)
private String name;
@Min(1)
@NotNull
private Integer age;
브라우저 출력 결과
Get 방식으로 http://localhost:9090/api/user?name&age
NullPointerException
이 뜸POST 방식으로 http://localhost:9090/api/user
{
"name" : "",
"age" : 0
}
default message [크기가 1에서 10 사이여야 합니다]
예외 처리 클래스
@RestControllerAdvice
public class GlobalControllerAdvice {
// 예외 잡는 메서드
@ExceptionHandler(value = Exception.class) // 모든 예외
public ResponseEntity exception(Exception e) {
System.out.println("!예외 발생!");
System.out.println(e.getLocalizedMessage()); // 예외 메시지 출력
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
}
}
아까와 동일하게 POST 방식으로 http://localhost:9090/api/user
{
"name" : "",
"age" : 0
}
@RestControllerAdvice
public class GlobalControllerAdvice {
// 예외 잡는 메서드
@ExceptionHandler(value = Exception.class) // 모든 예외
public ResponseEntity exception(Exception e) {
System.out.println("!특정 예외 발생!");
System.out.println(e.getClass().getName()); // 예외가 어디서 발생했는 지 찾음
System.out.println("!예외 발생!");
System.out.println(e.getLocalizedMessage()); // 예외 메시지 출력
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
}
// 특정 예외를 처리하는 메서드
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
methodArgumentNotValidException
메서드로 해당 특정 예외 처리methodArgumentNotValidException
메서드가 실행되면 기존에 특정 예외를 찾았던 ResponseEntity
메서드는 실행되지 않음methodArgumentNotValidException
메서드로 처리하기 전 실행 결과 methodArgumentNotValidException
메서드로 처리하고 난 후 실행 결과
아까와 동일하게 POST 방식으로 http://localhost:9090/api/user
{
"name" : "",
"age" : 0
}
clinet 에러는 400 → 발생한 에러 메시지를 보여줌
깔끔한 에러 메시지 출력은 아래실습에서
@RestControllerAdvice
public class GlobalControllerAdvice {
.
.
// 특정 예외를 처리하는 메서드
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
@RestController
@RequestMapping("/api/user")
public class APIController {
.
.
// 특정 예외를 처리하는 메서드
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e) {
System.out.println("api controller");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
api controller
출력@ExceptionHandler
@RestControllerAdvice