인생을 코딩하다.

[Spring] ExceptionHandler 본문

Spring

[Spring] ExceptionHandler

Hyung1 2020. 10. 25. 22:51
728x90
반응형

예외처리 할 떄, Controller에서 이런식으로 try { } ~ catch { } 문으로 처리를 해주면

Status가 200으로 떠서 클라이언트에서는 이 정보가 처리가 된 것인지, 안 된 것인지 알기가 어렵기 떄문에 곤란하다.

위를 보면 Headers, Content type, Body에 아무 것도 들어오지 않아서 어떻게 처리가 되었는지 알 수가 없다.

 

그래서 조금더 나은 방법으로,

 

@ExceptionHandler를 지정해준다.

 

@ExceptionHandler같은 경우는 @Controller, @RestController가 적용된 Bean내에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능을 한다. 인자로 캐치하고 싶은 예외 클래스를 등록해준다.

 

@ExceptionHandler를 이용해서 예외 처리를 해주었더니 Status = 400, Body = "이름을 변경하지 않습니다" 라고 출력되는 것을 볼 수 있다.

 

만약 Headers에 charset = UTF-8이 출력되지 않고 Body에 외계어들이 출력된다면, 아래 코드처럼 mockMvc에서 

UTF-8로 설정해주면 된다.

@BeforeEach// 해당 메소드는 매 test마다 먼저 실행이됨
    void beforeEach() {
        mockMvc = MockMvcBuilders.standaloneSetup(personController).setMessageConverters(messageConverter).
                  addFilters(new CharacterEncodingFilter("UTF-8",true)).build();
    }

하지만 위에서 Body에 String 형식으로 값이 들어온 것을 볼 수있다. 일반적으로 클라이언트에서는 json형식으로 파싱을 하게 될테니 String형식보다는 json에 맞게 내려주는 것이 좋다.

 

ErrorResponse.java 클래스를 만들고 error 인스턴스를 만들어 준다.

java - exception - dto - ErrorResponse.java

 

ErrorResponse.java

그리고 Controller에서 다시 수정해준다.

 

Body에 Json 형식으로 잘 들어왔다.

 

마지막으로

ControllerTest.java

 

ControllerTest에서 jsonPath를 추가해주므로 테스트는 성공하게 된다.

 

추가로

Spring에서는 HttpEntity란 클래스를 제공하는데 이 클래스의 역할은 Http 프로토콜을 이용하는 통신의 header와 body 관련 정보를 저장할수 있게끔 한다. 그리고 이를 상속받은 클래스로 RequestEntity와 ResponseEntity가 존재한다.

두가지는 똑같은 결과를 가지고 오지만. ResponseEntity를 사용하는 용도는 HTTP response header의 융통성있는 추가가 가능하기 때문 따라서 굳이 HTTP 설정이 필요하지 않다면, ResponseBody이 더 간결하다.

728x90
반응형
Comments