From c999af4eec8bfa0e0154db913c47df36bf9f64e4 Mon Sep 17 00:00:00 2001 From: bbbang105 <2018111366@dgu.ac.kr> Date: Sun, 16 Jun 2024 01:53:51 +0900 Subject: [PATCH] =?UTF-8?q?#33=20[feat]=20:=20=EC=97=85=EB=B9=84=ED=8A=B8?= =?UTF-8?q?=20API=20=ED=86=B5=EC=8B=A0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dgu/backend/service/UpbitApiClient.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 backend/src/main/java/org/dgu/backend/service/UpbitApiClient.java diff --git a/backend/src/main/java/org/dgu/backend/service/UpbitApiClient.java b/backend/src/main/java/org/dgu/backend/service/UpbitApiClient.java new file mode 100644 index 0000000..f57c53c --- /dev/null +++ b/backend/src/main/java/org/dgu/backend/service/UpbitApiClient.java @@ -0,0 +1,97 @@ +package org.dgu.backend.service; + +import lombok.RequiredArgsConstructor; +import org.dgu.backend.dto.UpbitDto; +import org.dgu.backend.exception.UpbitErrorResult; +import org.dgu.backend.exception.UpbitException; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +import java.util.Objects; +import java.util.Optional; + +@Component +@RequiredArgsConstructor +public class UpbitApiClient { + private final RestTemplate restTemplate; + + // HTTP GET 요청을 보내고 결과를 처리하는 메서드 + private T sendHttpGetRequest(String url, Class responseType, Optional token) { + HttpHeaders headers = new HttpHeaders(); + headers.set("accept", MediaType.APPLICATION_JSON_VALUE); + token.ifPresent(t -> headers.add("Authorization", "Bearer " + t)); + + try { + ResponseEntity responseEntity = restTemplate.exchange( + url, + HttpMethod.GET, + new HttpEntity<>(headers), + responseType + ); + if (Objects.isNull(responseEntity.getBody())) { + throw new UpbitException(UpbitErrorResult.FAIL_GET_RESPONSE); + } + return responseEntity.getBody(); + } catch (HttpClientErrorException e) { + if (e.getStatusCode() == HttpStatus.UNAUTHORIZED && e.getResponseBodyAsString().contains("no_authorization_ip")) { + throw new UpbitException(UpbitErrorResult.UNAUTHORIZED_IP); + } else { + throw new UpbitException(UpbitErrorResult.UNAUTHORIZED_KEY); + } + } + } + + // HTTP POST 주문 요청을 보내고 결과를 처리하는 메서드 + private T sendHttpPostRequest(String url, Class responseType, String token, Object requestBody) { + HttpHeaders headers = new HttpHeaders(); + headers.set("accept", MediaType.APPLICATION_JSON_VALUE); + headers.add("Authorization", "Bearer " + token); + headers.setContentType(MediaType.APPLICATION_JSON); + + try { + ResponseEntity responseEntity = restTemplate.exchange( + url, + HttpMethod.POST, + new HttpEntity<>(requestBody, headers), + responseType + ); + if (Objects.isNull(responseEntity.getBody())) { + throw new UpbitException(UpbitErrorResult.FAIL_GET_RESPONSE); + } + return responseEntity.getBody(); + } catch (HttpClientErrorException e) { + if (e.getStatusCode() == HttpStatus.UNAUTHORIZED && e.getResponseBodyAsString().contains("no_authorization_ip")) { + throw new UpbitException(UpbitErrorResult.UNAUTHORIZED_IP); + } else { + throw new UpbitException(UpbitErrorResult.UNAUTHORIZED_KEY); + } + } + } + + // 캔들 차트 조회 업비트 API와 통신하는 메서드 + public UpbitDto.CandleInfoResponse[] getCandleInfoAtUpbit(String url) { + return sendHttpGetRequest(url, UpbitDto.CandleInfoResponse[].class, Optional.empty()); + } + + // 가상화폐 조회 업비트 API와 통신하는 메서드 + public UpbitDto.MarketResponse[] getAllMarketsAtUpbit(String url) { + return sendHttpGetRequest(url, UpbitDto.MarketResponse[].class, Optional.empty()); + } + + // 전체 계좌 조회 업비트 API와 통신하는 메서드 + public UpbitDto.Account[] getUserAccountsAtUpbit(String url, String token) { + return sendHttpGetRequest(url, UpbitDto.Account[].class, Optional.ofNullable(token)); + } + + // 시세 현재가 조회 업비트 API와 통신하는 메서드 + public UpbitDto.Ticker[] getTickerPriceAtUpbit(String url) { + return sendHttpGetRequest(url, UpbitDto.Ticker[].class, Optional.empty()); + } + + // 주문 생성 업비트 API와 통신하는 메서드 + public UpbitDto.OrderResponse[] createNewOrder(String url, String token, UpbitDto.OrderRequest request) { + return sendHttpPostRequest(url, UpbitDto.OrderResponse[].class, token, request); + } +} \ No newline at end of file