본문 바로가기

SPRING

[Spring Boot] 예외발생시/ REST API 서버에서의 예외처리

데이터만 보내는 REST API 에서는 타임리프의 error.html이 먹히지않음

 

REST API 서버에서의  예외처리 

1. try catch  

 

try{

여기서 에러 나면

}catch(Exception e){

여깄는거 실행시켜주세요 

}

 

즉 에러날수있는것들을 try안에 때려박아주면 됨 


Exception e

e 로 에러이유를 출력해줄수도 있음

but!

Exception e는 개발때만 유용하지 서버배포할때는 logging라이브러리를 사용함 

 

String detail() {
    try {
        throw new Exception("에러입니다"); //임의로 에러발생시키는 문법
    } catch(Exception e){
        System.out.println(e.getMessage());
        //e를 통해서 에러이유 출력가능 
        return "저런..";
        //REST API로는 리다이렉트 사용불가. 그래서 보통 에러메세지만 보냄
        //
    }
}

 

참고로 REST API를 만들면  redirect 작동불가....

그래서 보통 에러처리할때는 에러메세지정도만 보냄.

 

근데!!! 에러메세지만 띨롱 보내주는것보다 에러코드같은 에러원인을 보내주면 착한 백엔드개발자되기 완!

어떻게 하냐면 

 

2. ResponseEntity

이걸 쓰면 에러코드는 뭔지, 에러이유는 뭔지 보내줄수있음 

참고로 ResponseEntity 이거 쓸려면 그 클래스의 반환타입을 ResponseEntity<> 이거로 바꿔줘야함 

 ResponseEntity를 쓰는 경우 굳이 @ResponseBody를 붙일 필요 없음/ 한글이 안깨져서 오히려 좋음

        @GetMapping("/detail/{id}")
        ResponseEntity<String> detail() {
            try {
                throw new Exception("삐빅 에러입니다");
            } catch(Exception e){
                return ResponseEntity.status(400).body("유저잘못");
            }
        }

.body()

에러이유 입력

.status()

숫자에러코드(HTTP status code)를 입력

- 유저잘못 400

- 서버잘못 500

- 적상작동 200

관습임

근데 에러났을때만 보내주는것보단 REST API 만들때 200기재후 보내주면 좋다함

 

 

 

 

실은 저것보다 더 많은 코드가 있음 ㅋㅋㅋ

아무튼 저렇게 하나하나 코드 찾아서 적기싫으면 에러코드를 모아놓은 클래스가 있는데 거기서 뽑아와도 됨

HttpStatus

 

라는 클래스인데 

ResponseEntity.status(HttpStatus.NOT_FOUND).body("에러남");

HttpStatus. 이런식으로해서 알맞는 에러를 뽑아와주면 서버가 알아서 번호로 바꿔줌

 

근데!

사실 초보가 어떻게 하나하나 이 에러구나! 하면 알겠나요...그냥 숫자로 적는게 더 편하다고 합니다~ 

 

 

 

그러나~저거말고는 다른 에러가 절대 나지않는다는 법이 없으니 저것보다 더 편리한....(않이; 진작 알려주지)

 

모든 API에러를 캐치해주는 간편한 예외처리 스프링 문법

모든 controller파일의 에러를 캐치하려면 

 

자바파일로 따로 파서 거기다 써주면 됨 

3. @RestControllerAdvice 

클래스네임 위에 이걸 써주면 처리컨트롤러라고 인식해줌

4. @ExceptionHandler

이렇게하면 모든 API에서 에러가 나면 @ExceptionHandler 요 안에 있는 코드들을 실행해줌 

 

@RestControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handler(){
        return ResponseEntity.status(400).body("에러");
    }
}

 

근데 특정에러에만 실행해주는 예외처리를 해주고싶으면 

  Exception 이부분을 원하는 에러이름으로 바꿔주면 그 에러가 발생했을때만 실행하는 코드로 만들수있음 

 

 

 

개별적으로도 쓸수 있는데 원하는 클래스에 써주면 그 클래스안에서 나는 API 에러는 요 안에 있는거로 처리해줌 

@ExceptionHandler(Exception.class)
public ResponseEntity<String> exceptionHandler() {
    return ResponseEntity.status().body("");
}

 

4. throws Exception

 try catch와 비슷한데 만약 try catch를 쓰지않았다면 꼭  함수뒤에 throws Exception를 붙여줘서

이곳이 에러를 발생시킬수있는곳이라는걸 알려줘야함 

근데 이렇게만 쓰면 사실 안되는거고 어딘가에는 이 에러를 받아주는 함수가 있어야한다고 배웠음 

@GetMapping("/detail/{id}")
@ResponseBody
String detail() throws Exception {
    throw new Exception("이런저런에러");
}