RestClientException ์ฒ๋ฆฌ
Spring ํ๊ฒฝ์์ (Spring5๋ ๋ฌ๋ผ์ก์ง๋ง…) ์ธ๋ถ API๋ก์ ํธ์ถ์ ํ ๋ ์์ฃผ ์ฐ์ด๋ RestTemplate. ์ด๋ request์ ๋ํด ์ ์์ ์ธ ์๋ต์ด ์๋ ๊ฒฝ์ฐ์ ๋ํ ์ฒ๋ฆฌ๋ ์ด๋ป๊ฒ ํ ๊น? ๋ง์ฐํ๊ฒ ์๊ฐ์ ํด๋ณด๋ฉด Http Status Code๋ฅผ ๋ฐ์์ ํ๋ณ์ ํ๋ฉด ๋์ง๋ง Http Status Code๋ง ๋ด๋ ์์ฒญ~๋ง๋ค. ( ์ํคํผ๋์ ์ฐธ๊ณ : https://en.wikipedia.org/wiki/List_of_HTTP_status_codes ) if~else ๋ก ๋ค ๋๋์๋ ์๊ณ … ์ฐ์ ์ฑ๊ณต/์คํจ์ ๋ํ ํ๋ณ์ ์ด๋ป๊ฒ ํ ๊น ํ๊ณ ์ฝ๋๋ฅผ ํ๊ณ ํ๊ณ ๋ค์ด๊ฐ๋ค๊ฐ ์๊ฒ๋ ๋ถ๋ถ์ ๋ํด ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ฒ ๋ค.
Http Status Code ๊ทธ๋ฃน์ ์
Spring-project github์ ๊ฐ๋ณด๋ฉด HttpStatus ํ์์ ๋ด๋ถ Enum์ผ๋ก ์๋์ฒ๋ผ ์ ์๋์ด ์๋ค. ( ๋งํฌ )
public enum HttpStatus {
...
public Series series() {
return Series.valueOf(this);
}
...
public enum Series {
INFORMATIONAL(1),
SUCCESSFUL(2),
REDIRECTION(3),
CLIENT_ERROR(4),
SERVER_ERROR(5);
...
public static Series valueOf(int status) {
int seriesCode = status / 100;
for (Series series : values()) {
if (series.value == seriesCode) {
return series;
}
}
throw new IllegalArgumentException("No matching constant for [" + status + "]");
}
}
}
์ฝ 80์ฌ๊ฐ ์๋ต์ฝ๋๋ค์ ํฌ๊ฒ 5๊ฐ ๋ฌถ์์ผ๋ก ์ ์ํด ๋์๊ฒ์ ๋ณผ์์๋ค. ์ฆ, 201 / 201 / 202 ๊ฐ์ ๋
์๋ค์ ์ ๋ถ SUCCESSFUL
์ฑ๊ณต ์ผ๋ก ๊ทธ๋ฃนํ์ด ๋๋๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ผ RestTemplate ์์๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๊ณ ์๋?
์ฝ๋๋ฅผ ์ญ์ญ ๋ฐ๋ผ๊ฐ๋ค ๋ณด๋ฉด ์๋์ฒ๋ผ 4xx, 5xx ๋ ์๋ฌ๋ผ๊ณ ํ๋จํ๊ณ ๊ทธ์ ๋ฐ๋ผ RestClientException ์ ๋ฐํํ๋๊ฒ์ ํ์ธํ ์ ์๋ค.
- RestTemplate ํธ์ถ ๋งํฌ
try {
ClientHttpRequest request = createRequest(url, method);
if (requestCallback != null) {
requestCallback.doWithRequest(request);
}
response = request.execute();
handleResponse(url, method, response);
if (responseExtractor != null) {
return responseExtractor.extractData(response);
}
else {
return null;
}
}
catch (IOException ex) {
- ์๋ฌ ํ๋ณ ๋งํฌ
protected boolean hasError(HttpStatus statusCode) {
return (statusCode.series() == HttpStatus.Series.CLIENT_ERROR || statusCode.series() == HttpStatus.Series.SERVER_ERROR);
}
์ฑ๊ณต/์คํจ ์ฒ๋ฆฌ๋ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ
๊ฐ์ ์ ์ํ๊ธฐ ๋๋ฆ์ผ๊ฒ ๊ฐ๋ค. ์ฐ์ ์์ฃผ ๊ฐ๋จํ๊ฒ RestTemplate ๋ฅผ ์ฌ์ฉํ ๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ์ ์๋ ๋๋ก 4xx, 5xx๊ฐ ์๋ฌ๋ผ๊ณ ํ๋จํ ์ ์์๊ฒ ๊ฐ๊ณ
try {
responseBody = restTemplate.postForObject(url, httpEntity, byte[].class);
} catch (RestClientException e) { // ์๋ฌ์ธ ๊ฒฝ์ฐ RestClientException ์ ๋ด๋ฑ๋๋ค.
log.error("##### restTemplate error, url = {}", url, e);
}
์ ์๋ ์๋ฌ(?)์๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด DefaultResponseErrorHandler
์ ์์๋ฐ๊ณ hasError
๋ฉ์๋๋ฅผ ๋ฌด์กฐ๊ฑด ํจ์คํ๋๋ก Override ํ๊ณ ๋ ๋ค์ ์๋ต ์ฝ๋๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์์์ ์๊ฒ ๋ค.
(๋ฌผ๋ก ์ด๋ฌํ ๋ฐฉ๋ฒ ๋ง๊ณ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์๊ฒ ๊ฐ๋ค.)
Buy me a coffee