오답노트

[Spring] Exception 본문

Java/Spring

[Spring] Exception

권멋져 2023. 7. 14. 09:44

Exception

웹에서 예외처리를 낼 수 있는 경우가 적다. 결국에는 상태 코드로 내려줘야하기 때문이다.

Spring에서는 ControllerAdvice 와 ExceptionHandler를 통해 예외처리를 진행한다.

 

Global Exception

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 GlobalControllAdvice {
    @ExceptionHandler(value = Exception.class)
    public ResponseEntity exception(Exception e){

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

    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }
}

클래스에 RestControllAdvice Annotation을 추가하면 발생하는 모든 exception을 가져와 핸들링 할 수 있다.

 

 

Local Exception

import com.example.exception.dto.User;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;

@RequestMapping("/api/user")
@RestController
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;
    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
        System.out.println("api controller");
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }
}

 

API 클래스 내에 ExceptionHandler Annotation을 선언하고 value에 받고 싶은 Exception 클래스를 넣으면 해당 API 클래스에서 해당 예외 발생시 핸들링할 수 있다.

'Java > Spring' 카테고리의 다른 글

[Spring] Filter  (0) 2023.07.14
[Spring] Exception과 Validation  (0) 2023.07.14
[Spring] Validation  (0) 2023.07.13
[Spring] AOP  (0) 2023.07.13
[Spirng] IoC, DI  (0) 2023.07.13