diff --git a/backend/src/main/java/org/dgu/backend/controller/DashBoardController.java b/backend/src/main/java/org/dgu/backend/controller/DashBoardController.java index 68e7015..a75fa17 100644 --- a/backend/src/main/java/org/dgu/backend/controller/DashBoardController.java +++ b/backend/src/main/java/org/dgu/backend/controller/DashBoardController.java @@ -33,4 +33,12 @@ public ResponseEntity>> getUserC List userCoins = dashBoardService.getUserCoins(authorizationHeader); return ApiResponse.onSuccess(SuccessStatus.SUCCESS_GET_USER_COINS, userCoins); } + + // 대표 코인 5개 조회 API + @GetMapping("/coins/representative") + public ResponseEntity>> getRepresentativeCoins() { + + List representativeCoinResponses = dashBoardService.getRepresentativeCoins(); + return ApiResponse.onSuccess(SuccessStatus.SUCCESS_GET_REPRESENTATIVE_COINS, representativeCoinResponses); + } } \ No newline at end of file diff --git a/backend/src/main/java/org/dgu/backend/service/DashBoardService.java b/backend/src/main/java/org/dgu/backend/service/DashBoardService.java index 4b9bc11..5f8d812 100644 --- a/backend/src/main/java/org/dgu/backend/service/DashBoardService.java +++ b/backend/src/main/java/org/dgu/backend/service/DashBoardService.java @@ -7,4 +7,5 @@ public interface DashBoardService { DashBoardDto.UserAccountResponse getUserAccount(String authorizationHeader); List getUserCoins(String authorizationHeader); + List getRepresentativeCoins(); } \ No newline at end of file diff --git a/backend/src/main/java/org/dgu/backend/service/DashBoardServiceImpl.java b/backend/src/main/java/org/dgu/backend/service/DashBoardServiceImpl.java index 7153cad..11bf17f 100644 --- a/backend/src/main/java/org/dgu/backend/service/DashBoardServiceImpl.java +++ b/backend/src/main/java/org/dgu/backend/service/DashBoardServiceImpl.java @@ -3,6 +3,7 @@ import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dgu.backend.common.constant.Coin; import org.dgu.backend.domain.UpbitKey; import org.dgu.backend.domain.User; import org.dgu.backend.domain.UserCoin; @@ -40,7 +41,7 @@ public DashBoardDto.UserAccountResponse getUserAccount(String authorizationHeade String token = jwtUtil.generateUpbitToken(upbitKey.getAccessKey(), upbitKey.getSecretKey()); String url = "https://api.upbit.com/v1/accounts"; - UpbitDto.Account[] responseBody = connectUpbitApi(url, token); + UpbitDto.Account[] responseBody = getUserAccountsAtUpbit(url, token); if (Objects.isNull(responseBody)) { throw new UpbitException(UpbitErrorResult.FAIL_ACCESS_USER_ACCOUNT); } @@ -69,7 +70,7 @@ public List getUserCoins(String authorizationHead String token = jwtUtil.generateUpbitToken(upbitKey.getAccessKey(), upbitKey.getSecretKey()); String url = "https://api.upbit.com/v1/accounts"; - UpbitDto.Account[] responseBody = connectUpbitApi(url, token); + UpbitDto.Account[] responseBody = getUserAccountsAtUpbit(url, token); if (Objects.isNull(responseBody)) { throw new UpbitException(UpbitErrorResult.FAIL_ACCESS_USER_ACCOUNT); } @@ -102,6 +103,22 @@ public List getUserCoins(String authorizationHead return userCoinResponses; } + // 대표 코인 5개 정보를 반환하는 메서드 + @Override + public List getRepresentativeCoins() { + String url = "https://api.upbit.com/v1/ticker?markets="; + List representativeCoinResponses = new ArrayList<>(); + for (Coin coin : Coin.values()) { + UpbitDto.Ticker[] responseBody = getTickerPriceAtUpbit(url + coin.getMarketName()); + if (Objects.isNull(responseBody[0])) { + throw new UpbitException(UpbitErrorResult.FAIL_ACCESS_COIN_INFO); + } + representativeCoinResponses.add(DashBoardDto.RepresentativeCoinResponse.of(responseBody[0], coin.getKoreanName())); + } + + return representativeCoinResponses; + } + // 코인 가격 상승 여부를 판단하는 메서드 private boolean isBalanceIncreased(UpbitDto.Account account, UserCoin userCoin) { BigDecimal curBalance = BigDecimal.valueOf(account.getBalance()) @@ -110,8 +127,8 @@ private boolean isBalanceIncreased(UpbitDto.Account account, UserCoin userCoin) return curBalance.compareTo(userCoin.getBalance()) > 0; } - // 업비트 API와 통신하는 메서드 - private UpbitDto.Account[] connectUpbitApi(String url, String token) { + // 전체 계좌 조회 업비트 API와 통신하는 메서드 + private UpbitDto.Account[] getUserAccountsAtUpbit(String url, String token) { String authenticationToken = "Bearer " + token; HttpHeaders headers = new HttpHeaders(); headers.set("accept", MediaType.APPLICATION_JSON_VALUE); @@ -125,4 +142,18 @@ private UpbitDto.Account[] connectUpbitApi(String url, String token) { return responseEntity.getBody(); } + + // 시세 현재가 조회 업비트 API와 통신하는 메서드 + private UpbitDto.Ticker[] getTickerPriceAtUpbit(String url) { + HttpHeaders headers = new HttpHeaders(); + headers.set("accept", MediaType.APPLICATION_JSON_VALUE); + ResponseEntity responseEntity = restTemplate.exchange( + url, + HttpMethod.GET, + new HttpEntity<>(headers), + UpbitDto.Ticker[].class + ); + + return responseEntity.getBody(); + } } \ No newline at end of file