Spring의 새로운 WebClient에서 커스톰 에러 핸들링 방법을 알아보았습니다.
도움이 될만한 배경 지식은 아마 Angular 와(또는) RxJs 이지 않을까 싶네요.
RestTemplate은 사용하지 않을 것을 추천드립니다.
오랫동안 스프링을 사용해오신분들은 서버에서 외부로 API 요청을 할때 RestTempate 을 많이 사용하셧을 거라고 생각합니다.
경력은 많지않지만 자바 7로 개발을 처음 시작한 저 또한 마찬가지구요.
거의 1년 전쯤 토이프로젝트에서 잠깐 사용했던 RestTemplate 최근 프로젝트에서 생겼습니다.
RestTemplate보다는 더 Low하게 접근해서 "스프링이 제공하는 외부 API 요청 툴"을 검색해보았고, 스프링에서 이제는 RestTemplate대신 WebClient 사용을 권장한다는 것을 알게되었습니다.
구글링을 조금 더 해보니 스프링 프레임워크팀에서 리액티브 웹 아키텍처에 많은 노력을 쏟고있다하고,
스프링에서 공식적으로 RestTemplate은 Deprecation 예정이라고 하네요.
저는 스프링 팀의 말을 따라 WebClient로 개발을 시작하였습니다.
우리가 HTTP Exception을 다룰때는 보통 아래 두가지 부분에 신경을씁니다.
첫번째는
a. 성공 : Response 2XX
b. 클라이언트에러 : Response 4XX
c. 서버에러 : Response 5XX
두번째는
커넥션에러, 방화벽등으로 요청이 아예 수행이 안될경우입니다.
네... 위와 같이 나누어지는데요,
아래 제가 작성한 코드를 잠깐 보시면 위 두가지가 더 분명히 드러날 것 같네요.
첫번째 케이스만 반영한 경우입니다.
위에서 chaining 되는 순서대로 설명드리겠습다.
1. 요청
2. 4xx 과 5xx 에러 핸들링하고
3. 이외는 Mono<T> 를 리턴 받습니다.
그런데 여기서 문제가 있는데요.
위 코드는 4xx 에러 5xx 에러이외는 핸들링을 안하고 있습니다.
그렇다면 우리가 캐치해야할 4xx or 5xx 중 특정에러, 또는 Mono 에러, 또는 커넥션에러등 예상 불가 에러는 어떻게 핸들링을 해야 할까요?
해결방법은 아래 코드와 설명에서 확인하시죠.
순서대로 설명드리겠습니다.
1. 요청
2. 4xx에러와 5xx에러는
3. onStatus() 메소드에서 잡아서
4. 사용자가만드는 "General숫자xxException"를 발생시킵니다
(여기서는 Lambda 를 사용하엿지만 res -> { } 더 디테일하게 작업가능
5. bodyToMono에서는 response가 성공적으로 리턴시에 PersonRespone클래스를 리턴하고
6. Predicate.not()에서는
위 4xx에러와 5xx 발생시 의도적으로 발생시키는
GeneralException 클래스 외의 인스턴스(에러,익셉션 등)가
***아닌경우에(중요)는
CustomException 을 발생시킵니다.
오늘은 시간이 늦어져서 여기까지하고 ㅜㅜ
원본 코드는 아래 제 깃허브에 올려놓겠습니다.
회사코드에서 작업한것을 수정하느라 환경설정과 테스트코드는 다음시간에 해야겟네요.
https://github.com/JooHyukKim/spring-reactive
다음 포스팅까지만 기다려주시길... 주륵...
읽어주셔서 감사합니다.
'Spring' 카테고리의 다른 글
Spring Validation에 대하여 알아보자 (0) | 2021.09.13 |
---|---|
Spring & SpringBoot 짧고 굵게 짚고가기 (0) | 2021.09.12 |
@RunWith(SpringRunner.class) 와 @ExtendWith(SpringExtension.class) 의 주의할 점 & 설명 (0) | 2021.09.02 |