본문 바로가기

좋아하는 것_매직IT/1.spring

27.Spring, 예외처리(Exception)에 대해서 알아보고 간단한 샘플 프로그램을 만들어보자.

반응형

예외처리에 대해서 알아보자.

서비스 제공 시 특정 문제가 발생하면 서비스의 소비자 즉, 클라이언트에게 무엇이 잘못되었는지 대한 설명을 해주는 것을 말함.

다시말하면, 내가 서비스를 요청하는 사용자라고 한다면, 서버에 접속해서 서비스를 제공받는데,

나도 모르게 서비스가 중단되고나 서버가 다운되서 접속이 불가하면, 난처한 경우가 생김. -_-;

그래서, 서비스 공급자는 특정 로직의 실패 시 예외처리를 통해서 대처방안 및 서비스 소비자에게 유연한(?) 대응을 할 수 있도록 지원해줘야함.

이해를 돕기위해서, 저의 경험을 슬며시 좀 풀자면,

저는 주로 OOO뱅크을 이용하는데, 얼마전에 장애가 있었고 서비스를 소비하는 입장에서 아래 3가지 상황을 겪게됨.

하나, 해당 서버에 접속은 가능했는데, 1시간동안이나 계좌이체가 안됨.

무슨일 때문에 이체가 안되고 있는지는 에러문구상으로 전혀, 알수가 없었음.

개발자 입장에서 에러코드를 봤을때는 급하게 적용하다가 장애가 났구나라고 인지는 했지만,

만약, 내가 개발자가 아니라, 평범한 소비자 였다면.. 더욱 난처했을듯..

둘, 서비스센터로 전화를 했지만 서비스센터역시 전화를 안받음.

셋, 장애처리가 되었는지, 1시간이 지난 후 고객센터에 전화가 연결됨 -_-;

대략적으로 이야기를 들어보니, 역시 서비스 적용이 있었고 원복했다고함.

암튼 결론은, 예외처리를 서비스를 소비하는 입장에서 편리하게 대처해주었다면, 좋지 않았을까? 라고 생각하게 되었음.

이상!

암튼, 이 사례를 통해서 제가 깨닫게 된것은

저도 또한 사용자에게 서비스를 제공하는 개발자 입장에서 돌이켜 보았을때,

반성을하게되고, 예외처리에 대해서 좀 더 신경을 쓰고 사용자 입장에서 개발을 해야 겠구나 생각하게된 계기가 됨.

 

그럼, Spring Boot 의 예외처리를 알아보자.

우선 서버를 실행 시키자.

첫째, 스프링부트 디폴트 예외처리에 대해서 알아보자.

Postman 으로 존재하지 않는 URL 요청하여 스프링 부트의 티폴트 예외처리를 발생시켜보자.

설명

응답코드는 404, Not Found 가 발생했다.

즉, Spring Boot 는 디폴트 예외처리로 리소스가 발견되지 않았는다는 메시지와 함께 유효한 JSON 메시지를 응답으로 반환함을 알 수 있음.

둘째, 예외를 발생시키는 리소스를 생성하고, 어플리케이션이 RuntimeException에 어떻게 반응하는지 알아보자.

우선, 예외를 인위적으로 발생시키기위해서, 아래코드를 작성해서 더미 서비스를 만들어보자.

ThubDefController.java

더미서비스는 아래와 같음.

설명

클라이언트가 /error-svc 를 요청하면, 서버는 RuntimeException 을 발생시키는 코드임.

그럼, Postman을 사용해서 아래와 같이 서비스를 요청해보자.

설명

응답코드는 500, Internal Server Error 가 발생했다.

Spring Boot는 아래와 같이 발생된 예외메시지를 반환함.

"message" : "Exception Occured."

그럼, 커스텀 예외를 만들어보고, Spring Boot 에서 어떻게 반응하는지 알아보자.

우선, 커스텀 예외를 만들기 위해서, 아래와 같이 코드를 생성해보자.

ThubUserNotFoundException.java

설명

ThubUserNotFoundException를 정의하는 코드임.

그리고, ThubUserNotFoundException을 발생하기 위해서, ThubUserController 를 구현해 보자.

설명

nickname 이 조회되지 않을때,

ThubUserNotFoundException 을 발생시키는 코드임.

그럼, Postman 을 사용해서, 조회되지 않는 nickname 으로 서비스를 요청해보자.

우선, 정상 케이스는 아래와 같이 예외가 발생하지 않음.

조회되지 않는 nickname 으로 서비스를 요청해보자.

설명

즉, thubUser 가 조회되지 않으면,

500, Internal Server Error 가 발생하고,

메시지로 "message" : "User not found!" 가 응답되어진다.

마지막으로, 커스텀 예외 메시지를 만들어 보자.

위의 내용을 보니, 500 상태코드는 404 NotFound 로 개선해야 되지 않을까 생각이 되어 아래 코드를 작성해 본다.

우선, 커스텀 예외 메시지의 구조를 정의하기 위해서 아래와같이 Bean을 작성해보자.

ExceptionResponse.java

설명

주요 메시지 구조는 아래와 같음.

타임스탬프

메시지

상세설명

​​​​​​​​​​​​​​​​​​​​​​​​​​​​그리고, 전역 예외처리를 위해서 아래 코드를 작성해 보자.

RestResponseEntityExceptionHandler.java

package com.example.rest.demo.controller; import com.example.rest.demo.bean.ExceptionResponse; import com.example.rest.demo.exception.ThubUserNotFoundException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; @ControllerAdvice @RestController public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(ThubUserNotFoundException.class) public final ResponseEntity<ExceptionResponse> thubUserNotFound(ThubUserNotFoundException ex) { ExceptionResponse exceptionResponse = new ExceptionResponse(ex.getMessage(), "thubuser is not found."); return new ResponseEntity<ExceptionResponse>(exceptionResponse, new HttpHeaders(), HttpStatus.NOT_FOUND); } }

​​​​​​​설명

ResponseEntityExceptionHandler 를 상속함.

해당 클래스는 중앙 집중식 예외처리 클래스인 ControllerAdvice를 위해서 Spring MVC가 제공하는 기본클래스 임.

@ExceptionHandler(ThubUserNotFoundException.class)

메소드가 특정 예외인, ThubUserNotFoundException.class 를 처리하도록 정의함.

참고로, 커스텀 예외처리가 정의돼 있지 않은 다른 예외는 Spring Boot가 제공하는 디폴트 예외처리를 따르게 됨.

ExceptionResponse exceptionResponse = new ExceptionResponse(ex.getMessage(), "thubuser is not found.");

커스템 예외 응답을 작성하는 코드임.

return new ResponseEntity<ExceptionResponse>(exceptionResponse, new HttpHeaders(), HttpStatus.NOT_FOUND);

앞에서 정의한 커스텀 예외처를 가진 404 Not Found 응답을 반환하는 정의임.

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​그럼 정상적으로 해당코드가 동작하는지 Postman 으로 확인해 보자.

아래와같이, 조회되지 않는 nickname 으로 요청을 해보자.

설명

기존의 500 에러 코드가 404 로 변경됨을 확인할 수 있고,

또한 ExceptionResponse의 정의한 메시지 구조대로 응답이 전송됨을 확인할 수 있음

ExceptionResponse의 주요 메시지 구조는 아래와 같음.

타임스탬프

메시지

상세설명

결론

예외처리란, 서비스 제공 시 특정 문제가 발생하면 서비스의 소비자 즉, 클라이언트에게 무엇이 잘못되었는지 대한 설명을 해주는 것을 말함.

Spring 에서 제공하는 디폴트 예외처리가 있지만, 커스텀 예외처리를 위해서 추가코드를 작성하면, 커스텀 예외처리를 할 수 있음.

오늘도 Spring 관련 예외처리에 대한 지식 마술(?) 한가지 획득완료! 감사합니다. ^^


오늘의 명언 한마디

만약 당신이 일을 잘못 처리하고 있는 것이 명백한데 아무도 당신에게 한마디 해 줄 생각조차 안 한다면, 그거야말로 무언가 잘못된 것이다.

듣고 싶지 않은 소리일지라도, 당신을 비판하는 사람들이야말로 대부분 당신을 진정 사랑하고 아끼는 사람들이며 당신을 좀 더 발전시키고 싶은 마음을 가지고 있다.

랜디 포시, 제프리 재슬로지음, "마지막 강의" 중에서..


오늘의 영어 한마디

I wish I could look younger.

나는 원해 / 내가 보이길 / 더 젊게

설명

"wish" 는 ~을 원한다/바란다. 라는 의미

"look younger" 는 더 젊게 보이는 것을 말함.


오늘의 민법 한마디(for real estate)

제1편 총칙 / 제5장 법률행위 / 제4절 무효와 취소

제137조(법률행위의 일부무효)

법률행위의 일부분이 무효인 때에는 그 전부를 무효로 한다.

그러나 그 무효 부분이 없더라도 법률행위를 하였을 것이라고 인정될 때에는 나머지 부분은 무효가 되지 아니한다.


나의 목표 및 다짐을 항상 내곁에 두기.

목표

나의 강점을 바탕으로 나의 일을 잘해냄으로써 타인과 사회를 아릅답게 만든다.

현재 내가 가진 능력으로 누군가에 도움이 될 수 있을까? 에 대해서 항상 생각하기

 

목표를 이루기 위한 실천방안

꾸준한 블로깅/기록법/독서법으로 넘버원이 아닌 온리원이 되보자.

천사불여일행(千思不如一行)을 항상생각하며 체화 및 각인시키자.

"천번 생각하는것보다 한번 행동하는 것이 더 중요하다."

기기일약 불능십보(騏驥一躍 不能十步) / 노마십가 공재불사(駑馬十駕 功在不舍)

천리마도 한번에 열걸음을 뛸 수 없고, 느리고 둔한말이라도 열흘이면 하룻길을 간다.

300x250