minlog
article thumbnail

 

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());
    }
}

 

 

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!