Exception 에러페이지
1) 4XX Error or 5XX Error
2) Client 가 200 외에 처리를 하지 못할때는 200을 내려주고 별도 메시지를 전달
Annotation | 설명 |
@ControllerAdvice | Global 예외 처리 및 특정 package/Controller 예외처리 |
@ExcptionHandler | 특정 Controller의 예외처리 |
1. 글로벌한 예외를 잡는 방법 @RestControllerAdvice
package com.example.exception.advice;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalControllerAdvice {
//Exception 전체적인 오류를 다 잡는다.
@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.getMessage());//받은 에러의 메시지 출력
System.out.println("-------------");
//서버에서 나는 에러는 인터널서버에러이다.
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
}
//MethodArgumentNotValidException 오류만 잡는다.
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
// 에러 메시지를 바로 받아서 리턴
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
1) 예외를 잡는 클래스를 생성하고 @RestControllerAdvice 어노테이션 선언
- 프로젝트 내 전체 예외를 잡는다.
@RestControllerAdvice
- 특정 패키지의 예외를 잡는다.
@RestControllerAdvice(basePackages = "com.example.exception.controller" )
2) 클래스 내부에 특정 오류를 받아서 처리할 메서드를 생성한다. @ExceptionHandler 어노테이션 선언
※ RequestEntity, ResponseEntity 는 HttpEntity 를 상속받아 구현한 클래스이다.※ HttpEntity : HTTP의 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다.
2. 특정 클래스 내부만 예외를 잡는 방법 @ExceptionHandler
특정 클래스(컨트롤러) 내부에서만 예외를 사용하고 싶다면 해당 클래스 내에 오류를 잡는 인셉션핸들러(@ExceptionHandler )를 추가 한다.
만약 글로벌 컨트롤러( @RestControllerAdvice )에서 같은 익셉션핸들러가 있더라도 우선순위는 특정 클래스 내부에 있는 익셉션핸들러가 실행이 된다.
package com.example.exception.controller;
...
@RestController
@RequestMapping("/api/user")
public class ApiController {
@GetMapping("")
//RequestParam > required 속성 false는 받아오는 값이 없어도 동작이 가능하게됨 . true = 값이 없으면 에러
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;
}
// 예외처리
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
}
}
'BackEnd > Spring Boot' 카테고리의 다른 글
[ Spring Boot ] Server 연결 (2) - 실제로 많이 사용되는 구조와 네이버 Api 연결해보기 (1) | 2023.03.13 |
---|---|
[ Spring Boot ] Server 연결 (1) Get/Post- UriComponentsBuilder · RestTemplate (0) | 2023.03.12 |
[ Spring ] Test Code - Controller 전체를 테스트하는 방법 (0) | 2023.03.09 |
[ Spring Boot ] Validation (2) - @AssertTrue/False , Custom Annotation (0) | 2023.03.09 |
[ Spring Boot ] Validation (1) (0) | 2023.03.08 |