Skip to content

Commit

Permalink
[MS-207] close 되지 않던 자원 처리
Browse files Browse the repository at this point in the history
애플 로그인과 메세지 서비스에서 해당 서버와 통신에 사용하던 CloseableHttpClient, CloseableHttpResponse를 try with resources 문을 이용하여 닫음 처리 해줬습니다.
  • Loading branch information
jaewonLeeKOR committed Nov 24, 2024
1 parent 09f5290 commit e3b774d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
@Slf4j
public class AppleOauthClient {
public AppleSocialTokenResponse generateAndValidateToken(IdTokenRequest idTokenRequest) {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("https://appleid.apple.com/auth/token");
List<NameValuePair> nvps = new ArrayList<>();
nvps.add(new BasicNameValuePair("client_id", idTokenRequest.getClient_id()));
Expand All @@ -43,28 +42,23 @@ public AppleSocialTokenResponse generateAndValidateToken(IdTokenRequest idTokenR
log.error("Apple Token Request Body 인코딩 실패 : {}", idTokenRequest);
throw new BaseException(AuthErrorCode.APPLE_LOGIN_ERROR);
}
CloseableHttpResponse response;
try {
response = httpClient.execute(httpPost);
} catch (IOException e) {
log.error("Apple Token 요청 실패 : {}", idTokenRequest);
throw new BaseException(AuthErrorCode.APPLE_LOGIN_ERROR);
}
ObjectMapper objectMapper = new ObjectMapper()
.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
AppleSocialTokenResponse responseBody;
try {
responseBody = objectMapper.readValue(EntityUtils.toString(response.getEntity(), "UTF-8"), AppleSocialTokenResponse.class);
try(CloseableHttpClient httpClient = HttpClients.createDefault()) {
try(CloseableHttpResponse response = httpClient.execute(httpPost)) {
return objectMapper.readValue(EntityUtils.toString(response.getEntity(), "UTF-8"), AppleSocialTokenResponse.class);
} catch (IOException e) {
log.error("Apple Token Payload 디코딩 실패 : {}", idTokenRequest);
throw new BaseException(AuthErrorCode.APPLE_LOGIN_ERROR);
}
} catch (IOException e) {
log.error("Apple Token Payload 디코딩 실패 : {}", idTokenRequest);
log.error("Apple Token 요청 실패 : {}", idTokenRequest);
throw new BaseException(AuthErrorCode.APPLE_LOGIN_ERROR);
}
return responseBody;
}

public void revokeToken(RevokeTokenRequest revokeTokenRequest) throws BaseException{
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("https://appleid.apple.com/auth/revoke");
List<NameValuePair> nvps = new ArrayList<>();
nvps.add(new BasicNameValuePair("client_id", revokeTokenRequest.getClient_id()));
Expand All @@ -77,7 +71,7 @@ public void revokeToken(RevokeTokenRequest revokeTokenRequest) throws BaseExcept
log.error("Apple Revoke Token Request Body 인코딩 실패 : {}", revokeTokenRequest);
throw new BaseException(AuthErrorCode.APPLE_REVOKE_ERROR);
}
try {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
httpClient.execute(httpPost);
} catch (IOException e) {
log.error("Apple Revoke Token 요청 실패 : {}", revokeTokenRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,75 +80,63 @@ public void checkBalance() {
}

private <T> T aligoReqeust(String url, List<NameValuePair> nvps, Class<T> responseType) {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = generateAligoHttpPost(httpClient, url, nvps);
CloseableHttpResponse response = executeAligoHttpClient(httpClient, httpPost);
AligoErrorHandle(httpClient, response);
T responseBody = mapValue(httpClient, response, responseType);
closeHttpClient(httpClient);
return responseBody;
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = generateAligoHttpPost(url, nvps);
try (CloseableHttpResponse response = executeAligoHttpClient(httpClient, httpPost)) {
aligoErrorHandle(response);
T responseBody = mapValue(response, responseType);
return responseBody;
}
} catch (IOException e) {
log.error("[Aligo] HTTP 클라이언트 종료에 실패했습니다.");
throw new BaseException(SmsErrorCode.SMS_AGENCY_ERROR);
}
}

private HttpPost generateAligoHttpPost(CloseableHttpClient httpClient, String url, List<NameValuePair> nvps) {
private HttpPost generateAligoHttpPost(String url, List<NameValuePair> nvps) {
HttpPost httpPost = new HttpPost(url);
nvps.add(new BasicNameValuePair("key", apiKey));
nvps.add(new BasicNameValuePair("user_id", userId));
try {
httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
} catch (UnsupportedEncodingException e) {
log.error("[Aligo] 문자 전송 메시지 인코딩에 실패했습니다.");
closeHttpClient(httpClient);
throw new BaseException(SmsErrorCode.SMS_AGENCY_ERROR);
}
return httpPost;
}

private CloseableHttpResponse executeAligoHttpClient(CloseableHttpClient httpClient, HttpPost httpPost) {
CloseableHttpResponse response;
try {
response = httpClient.execute(httpPost);
return httpClient.execute(httpPost);
} catch (IOException e) {
log.error("[Aligo] 메세지 서버와 연결에 실패했습니다.");
closeHttpClient(httpClient);
throw new BaseException(SmsErrorCode.SMS_AGENCY_ERROR);
}
return response;
}

private void AligoErrorHandle(CloseableHttpClient httpClient, CloseableHttpResponse response) {
private void aligoErrorHandle(CloseableHttpResponse response) {
if (response.getStatusLine().getStatusCode() > 0) return;

AligoErrorResponse errorBody = mapValue(httpClient, response, AligoErrorResponse.class);
AligoErrorResponse errorBody = mapValue(response, AligoErrorResponse.class);
switch (response.getStatusLine().getStatusCode()) {
case (-101) -> log.error("[Aligo] 인증오류입니다.");
case (-304) -> log.error("[Aligo] 발송 5분전까지만 취소가 가능합니다.");
default ->
log.error(String.format("[Aligo] 알 수 없는 에러가 발생했습니다. (%s, %s)", errorBody.getResult_code(), errorBody.getMessage()));
}
closeHttpClient(httpClient);
throw new BaseException(SmsErrorCode.SMS_AGENCY_ERROR);
}

private <T> T mapValue(CloseableHttpClient httpClient, CloseableHttpResponse response, Class<T> bodyType) {
private <T> T mapValue(CloseableHttpResponse response, Class<T> bodyType) {
ObjectMapper objectMapper = new ObjectMapper()
.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
T responseBody;
try {
responseBody = objectMapper.readValue(EntityUtils.toString(response.getEntity(), "UTF-8"), bodyType);
return objectMapper.readValue(EntityUtils.toString(response.getEntity(), "UTF-8"), bodyType);
} catch (IOException e) {
log.error(String.format("[Aligo] 문자 전송 응답 메시지(%s dto) 파싱에 실패했습니다.", bodyType.getName()));
closeHttpClient(httpClient);
throw new BaseException(SmsErrorCode.SMS_AGENCY_ERROR);
}
return responseBody;
}

private void closeHttpClient(CloseableHttpClient httpClient) {
try {
httpClient.close();
} catch (IOException e) {
log.error("[Aligo] HTTP 클라이언트 종료에 실패했습니다.");
}
}
}

0 comments on commit e3b774d

Please sign in to comment.