이전 내용↓↓↓
2023.11.13 - [Web Application/Backend] - [REST API] Spring Boot로 REST API CRUD 간단 구현 (3)
이전 포스팅에서 cloudVendor의 기본적인 CRUD가 동작하는 것을 확인하였다.
그런데 get mapping에서 cloud vendor가 존재하지 않을 때는 출력 시 오류가 발생하는 것을 확인하였다.
오늘은 이러한 오류가 발생했을 때, 즉 예외에 대해서는 어떻게 처리해야 하는지에 대해 알아볼 것이다.
✔ 웹 개발에 있어서 중요한 점
✅ 오류나 예외 상황 발생 시 사용자가 이해하기 쉽도록 상황에 대한 정보를 충분히 전달할 수 있어야 한다.
따라서 개발자는 로직 구현에 있어서 예외가 발생하는 부분을 찾아서, 예외처리를 해주어야 한다.
이제 프로젝트에서 발생한 오류를 가지고 예외처리를 해보자.
예외 처리를 하기 전에는 위와 같이 데이터베이스에 C3가 없을 때, C3를 get하는 mapping과정에서 반환 값이 없어서 에러가 발생하였다.
우리는 이를 CloudVendorNotFoundException이라고 할 것이다.
이 예외를 처리하기 위해서 다음 단계를 따른다.
1. 예외 처리를 위한 클래스들을 담은 exception 패키지를 하나 생성한다.
2. exception 패키지에 CloudVendorNotFoundException 클래스를 생성한다.
- 이 클래스를 예외 클래스로 인식하기 위해서 RuntimeException 클래스를 extends한다.
- 이 클래스에 대한 두 타입의 생성자를 자동생성해준다.
- 인자로 message만 담은 생성자
- 인자로 message와 Throwable 객체인 cause를 담은 생성자
*Throwable이 뭐야? (접은글을 확인하세요)
- Throwable은 java에서 오류나 예외를 처리하는 최상위 클래스로, exception과 error 클래스를 하위에 둔다.
- Throwable에는 두개의 메서드가 있는데,
- getMessage(): 예외 또는 오류에 대한 상세한 메시지를 반환합니다.
- printStackTrace(): 예외 또는 오류의 추적 정보를 출력합니다.
3. 클라이언트에게 예외 정보를 전달하기 위해서, 정보를 담는 CloudVendorException 클래스를 생성한다.
- 위 3개의 속성을 추가해준다.
- 사용자에게 보여질 오류 메시지 = message
- 예외 정보 = throwable
- http 상태 정보 = httpStatus
- 기본 생성자와, getter들을 자동 생성해준다.
4. 이제 예외 처리를 할 CloudVendorExceptionHandler 클래스를 생성해준다. 프론트와 직접 연결되는 컨트롤러라고 생각하면 된다.
- 우리는 지금 CloudVendor를 찾을 수 없다는 예외에 대한 처리를 다루어야 하기 때문에, handleCloudVendorNotFoundException 메서드를 선언해주자.
- rest api이기 때문에 반환타입은 ResponseEntity로 하고, Object유형으로 반환하도록 한다.
- 그리고 예외 발생 시의 CloudVendorNotFoundException 객체를 인자로 받아서 이 메서드의 인수로 매핑되도록 한다.
- 로직 내에서는 예외 정보를 받아서 적절히 처리 후 반환해주어야 하기 때문에, 예외 정보를 담아 보낼 CloudVendorException 객체를 하나 생성한다.
- 인자로 받은 cloudVendorNotFoundException의 message와, cause, 그리고 HttpStatus를 not_found로 하여 생성되도록 한다.
- return 시에는 ResponseEntity에 로직내에서 생성한 cloudVendorException 클래스와 HttpStatus를 인자로 넣어 반환한다.
- 그리고 이 메서드가 어떤 예외를 처리할 지 알려줘야 하기 때문에, 메서드 위에 @ExceptionHandler라는 어노테이션을 추가해주고, 이는 메서드에 의해 처리될 예외의 목록을 value로 갖는다.
- 즉 CloudVendorNotFoundException이 발생하면 value에 명시되어 있기 때문에, 해당 메서드의 인자로 매핑될 수 있는 것이다. 만약 여러개의 Exception을 한 메서드에서 처리하는 경우, value가 {} 리스트 형태이기 때문에, 쉼표를 하고 여러 개를 추가로 작성해주면 된다.
- 마지막으로 CloudVedorExceptionHandler 클래스에 대해서 @ControllerAdvice 어노테이션을 달아준다
- 이 컨트롤러는 이 프로젝트 전반에 걸쳐서 전역적으로 여러 예외처리를 해야 하기 때문이다.
5. 이제 이러한 예외가 발생할 수 있는 위치로 돌아가서 어떻게 했을 때 예외가 발생하는 지 확인해야 한다.
- 서비스 레이어의 get 메서드에서 오류가 발행하였는데, 로직을 보면 return에서 findId를 호출하도록 되어 있다.
- findId를 통해 반환할 내용이 있다면, cloudVendor에 대한 정보가 출력되겠지만, 찾을 수 없다면 예외를 발생시키고 일반 내부 서버 오류 메시지가 표시된다.
- 따라서 예외 처리 기능을 추가함으로써 출력되는 메시지를 사용자가 오류에 대해 이해하기 쉽게 더 나은 메시지로 표시하고자 한다.
- 예외 처리 기능을 추가해준다.
- if문을 추가하여, findId 호출의 return이 비어있다면 예외를 표시하도록 한다.
CloudVendorNotFoundException클래스를 throw 문법을 통해 발생시키고, 이때의 message는 오류에 대한 상황 설명을 친숙한 메시지로 제공해준다.
=> "requested cloud vendor does not exist"
6. 실행 결과
- 클라이언트가 제대로 수신한 적절한 오류 응답 404 not found와 함께 적절한 오류 메시지인 cloud vendor를 찾을 수 없다는 메시지가 출력된 것을 확인할 수 있다.
위 과정이 바로 Spring boot rest api 애플리케이션으로 예외 처리를 하는 방식이다.
= 사용자 정의 예외 처리
다음 내용↓↓↓
'Web Application > Backend' 카테고리의 다른 글
[REST API] Spring Boot로 REST API 프로젝트 (6) - JUnit TEST 기본 설정 및 repository 계층 test 예제 (1) | 2023.12.30 |
---|---|
[REST API] Spring Boot로 REST API 프로젝트 (5)-사용자 정의 ResponseEntity (0) | 2023.12.15 |
[REST API] Spring Boot로 REST API CRUD 간단 구현 (3) (0) | 2023.11.13 |
[REST API] Spring Boot로 REST API CRUD 간단 구현 (2) (0) | 2023.11.11 |
[REST API] Spring Boot로 REST API CRUD 간단 구현 (1) (0) | 2023.11.08 |