[Spring] Spring Boot Exception 처리

WOOK JONG KIM·2022년 10월 23일
0

패캠_java&Spring

목록 보기
44/103
post-thumbnail

Spring Boot Exception

Web Application 입장에서, 에러가 났을 때 내려줄수 있는 방법은 많지 않음

  1. 에러페이지

  2. 400~500대 Error

  3. Client가 200외에 처리를 하지 못할때는 200을 내려주고 별도의 에러 메세지 전달

package com.example.exception.dto;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class User {

    @NotEmpty
    @Size(min = 1, max = 10)
    private String name;
    
    @Min(1)
    @NotNull
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.example.exception.controller;

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

import javax.validation.Valid;

@RestController
@RequestMapping("/api/user")
public class ApiController {

    //required = false는 파라미터 값이 없더라도 null로 생각하고 동작 하게끔 해주는 것
    // ?name = 1234 이런게 없더라도 동작한다는 것!
    @GetMapping("")
    public User get(@RequestParam(required = false) String name, @RequestParam(required = false) Integer age){
        User user = new User();
        user.setName(name);
        user.setAge(age);

        // null인 경우 고의로 에러 발생시키기 위해
        int a = 10 + age;

        return user;
    }

    @PostMapping
    public User post(@Valid @RequestBody User user){
        System.out.println(user);
        return user;
    }

    // 여기다 붙여넣기 하면 이 컨트롤러에서 발생하는 Exception만 잡음
    // 글로벌 핸들러 보다 여기가 우선순위 더 높음
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseEntity MethodArgumentNotValidException(MethodArgumentNotValidException e){
        System.out.println("api controller");
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }
}
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;

@RestControllerAdivce()
public class GlobalControllerAdvice{
	
    // 모든 예외를 다 잡을꺼야, 지정안하면 Spring의 글로벌 Excpetion Handler가 동작 될 것
    @ExceptionHandler(value = Exception.class)
    public ResponseEntity exception(Exception e)
    	
        // getName을 통해 발생한 exception의 클래스 이름을 알수 있다
    	System.out.println(e.getClass().getName());
        System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
        System.out.println(e.getLocalizedMessage());
        System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
        
        //body에 담은 메세지가 사용자 화면에 출력
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
	}
    
    // 특정 메서드에 예외를 잡고 싶은 경우 
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseEntity MethodArgument(MethodArgumentNotValidException e){
    	return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }
}
profile
Journey for Backend Developer

0개의 댓글