백엔드 서버도 외부의 정보가 필요하다면, API를 요청해서 외부정보를 가져올 수 있다. 가장 대표적인 예로 소셜로그인이 있을테고, 콘텐츠 적인 측면으로 공공포털데이터나 라이엇과 같은 데이터(대부분 통계자료)등을 가져올때도 사용할 수 있다.
정보를 가져와서 가공 및 관리는 Backend 서버
에서 알아서 처리해가지구 Frontend 서버
로 보내주기만 하면 되는 줄 알았다. 굳이 Front단에서 Backend과정까지 노출시킬 필요는 없다고 생각했기때문에, 잘못되면 잘되면 200 OK
잘못되면 Bad Requset
만 보내줬다.
Bad Requset
만 보고 Front단에서 해결할라고 끙끙걸렸다는 것이다..(너무 죄송했다..)Bad Requset
로 처리했으니...뭔가가 잘못 된줄 알았다는 것이다.. RestTemplate이 무엇이냐에 대한 내용은 아래 링크를 참고!
HttpClientErrorException
HttpServerErrorException
UnknownHttpStatusCodeException
e.getStatusCode().is4xxClientError()
으로 4xx 상태코드를 핸들링 할 수 있다.하지만, 모든 RestTemplate에 대해 이런식으로 핸들링하면, riot Error인지, Discord에러인지, Kakao에러인지 알 수 없다. 그래서 필요한 것이 커스텀 예외처리이다.
try {
ResponseEntity<RiotApiResponseDto.RiotPuuid> response = restTemplate.exchange(ACCOUNT_API_URL, HttpMethod.GET, entity, RiotApiResponseDto.RiotPuuid.class, gameName, gameTag);
if (response.getStatusCode().is2xxSuccessful()) {
return response.getBody();
} else {
throw new RuntimeException("소환사 정보를 가져오는데 실패했습니다.");
}
}
} catch (HttpClientErrorException e) {
if (e.getStatusCode().isSameCodeAs(HttpStatus.NOT_FOUND)) {
throw new NotFoundRiotClientErrorException(e.getResponseBodyAsString(), e.getStatusCode(), e.getResponseHeaders());
}
if (e.getStatusCode().isSameCodeAs(HttpStatus.BAD_REQUEST)) {
throw new BadRequestRiotClientErrorException(e.getResponseBodyAsString(), e.getStatusCode(), e.getResponseHeaders());
}
throw new HttpClientErrorException(e.getStatusCode());
}
하지만, 이 방법은 내 스스로 생각해본 로직이였고, 이후 알아본 방법으로는 ResponseErrorHandler를 상속받아서 에러를 구현한다고 하니 다음에는 이걸 알아보구 사용해보자!