From 8dd8011aceba7e090a4363a8a0615c755b0360d2 Mon Sep 17 00:00:00 2001 From: JuHeon Date: Mon, 9 Feb 2026 16:46:23 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20=EC=9E=85?= =?UTF-8?q?=EA=B8=88=20=EC=A3=BC=EC=86=8C=20=ED=99=95=EC=9D=B8=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20API=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD=20(?= =?UTF-8?q?=EA=B0=81=20=EC=BD=94=EC=9D=B8=ED=83=80=EC=9E=85,=20=EB=84=A4?= =?UTF-8?q?=ED=8A=B8=EC=9B=8C=ED=81=AC=20=ED=83=80=EC=9E=85=20->=20?= =?UTF-8?q?=EC=B5=9C=EC=83=81=EB=8B=A8=20=EB=B0=98=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../charge/controller/ChargeController.java | 17 +- .../controller/ChargeControllerDocs.java | 8 +- .../domain/charge/service/ChargeService.java | 170 +++++------------- .../scoi/global/client/BithumbClient.java | 8 +- .../scoi/global/client/UpbitClient.java | 8 +- 5 files changed, 58 insertions(+), 153 deletions(-) diff --git a/src/main/java/com/example/scoi/domain/charge/controller/ChargeController.java b/src/main/java/com/example/scoi/domain/charge/controller/ChargeController.java index 5a46ae4..70335be 100644 --- a/src/main/java/com/example/scoi/domain/charge/controller/ChargeController.java +++ b/src/main/java/com/example/scoi/domain/charge/controller/ChargeController.java @@ -8,10 +8,6 @@ import com.example.scoi.domain.member.enums.ExchangeType; import com.example.scoi.global.apiPayload.ApiResponse; import com.example.scoi.global.apiPayload.code.BaseSuccessCode; - -import com.example.scoi.domain.charge.exception.ChargeException; -import com.example.scoi.domain.charge.exception.code.ChargeErrorCode; -import com.example.scoi.domain.member.enums.ExchangeType; import com.example.scoi.global.security.userdetails.CustomUserDetails; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -70,19 +66,12 @@ public ApiResponse getBalances( // 입금 주소 확인하기 @GetMapping("/deposits/address") - public ApiResponse> getDepositAddress( + public ApiResponse getDepositAddress( @AuthenticationPrincipal CustomUserDetails user, - @RequestParam ExchangeType exchangeType, - @RequestParam(defaultValue = "") List coinType, - @RequestParam(defaultValue = "") List netType + @RequestParam ExchangeType exchangeType ){ BaseSuccessCode code = ChargeSuccessCode.OK; - return ApiResponse.onSuccess(code, chargeService.getDepositAddress( - user.getUsername(), - exchangeType, - coinType.stream().map(String::toUpperCase).toList(), - netType.stream().map(String::toUpperCase).toList() - )); + return ApiResponse.onSuccess(code, chargeService.getDepositAddress(user.getUsername(), exchangeType)); } // 입금 주소 생성하기 diff --git a/src/main/java/com/example/scoi/domain/charge/controller/ChargeControllerDocs.java b/src/main/java/com/example/scoi/domain/charge/controller/ChargeControllerDocs.java index 5f25b2d..ed9e869 100644 --- a/src/main/java/com/example/scoi/domain/charge/controller/ChargeControllerDocs.java +++ b/src/main/java/com/example/scoi/domain/charge/controller/ChargeControllerDocs.java @@ -40,13 +40,11 @@ ApiResponse getBalances( @Operation( summary = "입금 주소 확인하기 API By 김주헌", - description = "코인의 입금 주소를 확인합니다. 리스트로 보내실때 꼭! 인덱스 맞춰서 보내주세요. 입금 주소가 없는 경우, 해당 코인은 제외하고 응답이 옵니다." + description = "코인의 입금 주소를 확인합니다. 해당 유저의 입금 주소 전체를 조회하고 최상단에 잇는 입금 주소를 반환합니다." ) - ApiResponse> getDepositAddress( + ApiResponse getDepositAddress( @AuthenticationPrincipal CustomUserDetails user, - @RequestParam ExchangeType exchangeType, - @RequestParam(defaultValue = "") List coinType, - @RequestParam(defaultValue = "") List netType + @RequestParam ExchangeType exchangeType ); @Operation( diff --git a/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java b/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java index ce4944d..8e13e35 100644 --- a/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java +++ b/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java @@ -9,8 +9,8 @@ import com.example.scoi.domain.charge.exception.ChargeException; import com.example.scoi.domain.charge.exception.code.ChargeErrorCode; import com.example.scoi.domain.member.enums.ExchangeType; -import com.example.scoi.domain.member.repository.MemberApiKeyRepository; import com.example.scoi.domain.member.exception.MemberException; +import com.example.scoi.domain.member.repository.MemberApiKeyRepository; import com.example.scoi.domain.member.repository.MemberRepository; import com.example.scoi.global.client.BithumbClient; import com.example.scoi.global.client.UpbitClient; @@ -27,9 +27,7 @@ import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; @Service @RequiredArgsConstructor @@ -300,146 +298,58 @@ public BalanceResDTO.BalanceListDTO getBalancesByPhone(String phoneNumber, Excha } // 입금 주소 확인하기 - public List getDepositAddress( + public String getDepositAddress( String phoneNumber, - ExchangeType exchangeType, - List coinType, - List netType + ExchangeType exchangeType ) { // 거래소별 요청 보내기 String token; - List result = new ArrayList<>(); - Map bindError = new HashMap<>(); - switch (exchangeType){ - case UPBIT: - for (int idx = 0; idx < coinType.size(); idx++) { - try { - token = jwtApiUtil - .createUpBitJwt( - phoneNumber, - "currency=" + coinType.get(idx) + "&net_type=" + netType.get(idx), - null - ); - - UpbitResDTO.GetDepositAddress upbitResult = upbitClient - .getDepositAddress(token, coinType.get(idx), netType.get(idx)); - - // 그게 아닌 경우 - result.add( - ChargeConverter.toGetDepositAddress( - upbitResult.currency(), - upbitResult.deposit_address() - ) - ); - // JWT 토큰 제작 실패 - } catch (GeneralSecurityException e) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - // 해당 코인의 입금주소가 없는 경우 - } catch (FeignException.NotFound e) { - ObjectMapper objectMapper = new ObjectMapper(); - ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - - if (!error.error().name().equals("coin_address_not_found")) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } - // 잘못된 파라미터, 거래소에서 지원하지 않는 코인 - } catch (FeignException.BadRequest e) { - ObjectMapper objectMapper = new ObjectMapper(); - ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - - // 잘못된 파라미터인 경우: DTO 코인 정보를 잘못 기입 - switch (error.error().name()) { - - // 잘못된 파라미터 입력 - case "validation_error": - case "invalid_parameter": - throw new ChargeException(ChargeErrorCode.WRONG_COIN_TYPE); - - // 거래소에서 지원하지 않는 코인 - case "currency does not have a valid value": - bindError.put(coinType.get(idx), netType.get(idx)); - break; - - default: - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } - // JWT 토큰 생성 오류 - } catch (FeignException.Unauthorized e) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); + String result; + try{ + switch (exchangeType) { + case UPBIT: + token = jwtApiUtil.createUpBitJwt(phoneNumber, null, null); + List upbitResult = upbitClient.getDepositAddresses(token); + + // 만약 해당 유저 입금 주소가 존재하지 않을 때 (추측) + if (upbitResult.isEmpty()) { + throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); } - } - break; + + result = upbitResult.getFirst().deposit_address(); + break; case BITHUMB: - for (int idx = 0; idx < coinType.size(); idx++){ - try { - token = jwtApiUtil - .createBithumbJwt( - phoneNumber, - "currency="+coinType.get(idx)+"&net_type="+netType.get(idx), - null - ); - - BithumbResDTO.GetDepositAddress bithumbResult = bithumbClient - .getDepositAddress(token, coinType.get(idx), netType.get(idx)); - - // 그게 아닌 경우 - result.add( - ChargeConverter.toGetDepositAddress( - bithumbResult.currency(), - bithumbResult.deposit_address() - ) - ); - // JWT 토큰 제작 실패 - } catch (GeneralSecurityException e) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - // 해당 코인의 입금주소가 없는 경우 - } catch (FeignException.NotFound e) { - ObjectMapper objectMapper = new ObjectMapper(); - ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - - if (!error.error().name().equals("coin_address_not_found")) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } - // 잘못된 파라미터, 거래소에서 지원하지 않는 코인 - } catch (FeignException.BadRequest e) { - ObjectMapper objectMapper = new ObjectMapper(); - ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - - // 잘못된 파라미터인 경우: DTO 코인 정보를 잘못 기입 - switch (error.error().name()) { - - // 잘못된 파라미터 입력 - case "validation_error": - case "invalid_parameter": - throw new ChargeException(ChargeErrorCode.WRONG_COIN_TYPE); - - // 네트워크 미지원: 넘기기 - case "request_for_address_of_not_supported_currency": - bindError.put(coinType.get(idx), netType.get(idx)); - break; - - // 거래소에서 지원하지 않는 코인 - case "currency does not have a valid value": - throw new ChargeException(ChargeErrorCode.NOT_SUPPORT_COIN); - - default: - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } - // JWT 토큰 생성 오류 - } catch (FeignException.Unauthorized e) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } + token = jwtApiUtil.createBithumbJwt(phoneNumber, null, null); + List bithumbResult = bithumbClient.getDepositAddresses(token); + + // 만약 해당 유저 입금 주소가 존재하지 않을 때 (추측) + if (bithumbResult.isEmpty()) { + throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); } + + result = bithumbResult.getFirst().deposit_address(); break; default: throw new ChargeException(ChargeErrorCode.WRONG_EXCHANGE_TYPE); - } + } + // 거래소 JWT 토큰 오류 + } catch (GeneralSecurityException e) { + throw new ChargeException(ChargeErrorCode.EXCHANGE_API_KEY_NOT_FOUND); + // 거래소 JWT 토큰 인증 오류 + } catch (FeignException.Unauthorized e) { + ObjectMapper objectMapper = new ObjectMapper(); + ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - // 만약 bindError에 값이 있으면 - if (!bindError.isEmpty()){ - throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND, bindError); + if (error.error().name().equals("out_of_scope")) { + throw new ChargeException(ChargeErrorCode.EXCHANGE_FORBIDDEN); + } + throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); + // 거래소별 입금 주소가 없는 경우 (추측) + } catch (FeignException.NotFound e) { + throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); } + return result; } diff --git a/src/main/java/com/example/scoi/global/client/BithumbClient.java b/src/main/java/com/example/scoi/global/client/BithumbClient.java index bcb9b37..c380a27 100644 --- a/src/main/java/com/example/scoi/global/client/BithumbClient.java +++ b/src/main/java/com/example/scoi/global/client/BithumbClient.java @@ -1,10 +1,8 @@ package com.example.scoi.global.client; -import com.example.scoi.domain.member.dto.MemberReqDTO; import com.example.scoi.domain.transfer.dto.TransferReqDTO; import com.example.scoi.global.client.dto.BithumbReqDTO; import com.example.scoi.global.client.dto.BithumbResDTO; -import com.example.scoi.global.client.dto.UpbitResDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -75,6 +73,12 @@ BithumbResDTO.GetDepositAddress getDepositAddress( @RequestParam("net_type") String netType ); + // 전체 입금 주소 조회 + @GetMapping("/v1/deposits/coin_addresses") + List getDepositAddresses( + @RequestHeader("Authorization") String token + ); + // 이체 출금 가능 정보 // 쿼리 파라미터 O @GetMapping("/v1/withdraws/chance") diff --git a/src/main/java/com/example/scoi/global/client/UpbitClient.java b/src/main/java/com/example/scoi/global/client/UpbitClient.java index da8e2b5..202ad69 100644 --- a/src/main/java/com/example/scoi/global/client/UpbitClient.java +++ b/src/main/java/com/example/scoi/global/client/UpbitClient.java @@ -1,8 +1,6 @@ package com.example.scoi.global.client; -import com.example.scoi.domain.member.dto.MemberReqDTO; import com.example.scoi.domain.transfer.dto.TransferReqDTO; -import com.example.scoi.global.client.dto.BithumbResDTO; import com.example.scoi.global.client.dto.UpbitReqDTO; import com.example.scoi.global.client.dto.UpbitResDTO; import org.springframework.cloud.openfeign.FeignClient; @@ -79,6 +77,12 @@ UpbitResDTO.GetDepositAddress getDepositAddress( @RequestParam("net_type") String netType ); + // 입금 주소 목록 조회 + @GetMapping("/v1/deposits/coin_addresses") + List getDepositAddresses( + @RequestHeader("Authorization") String token + ); + // 출금(이체) 가능 금액 조회 // 쿼리파라미터 O @GetMapping("/v1/withdraws/chance") From 717d84483f936536266e3919bcb33eab6fcf4a09 Mon Sep 17 00:00:00 2001 From: Myungjun Jang Date: Tue, 10 Feb 2026 14:59:55 +0900 Subject: [PATCH 2/9] =?UTF-8?q?=E2=9C=A8=20feat:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EA=B8=B0=EB=B3=B8=EA=B0=92=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 --- src/main/java/com/example/scoi/domain/auth/dto/AuthReqDTO.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/example/scoi/domain/auth/dto/AuthReqDTO.java b/src/main/java/com/example/scoi/domain/auth/dto/AuthReqDTO.java index 5b369b7..68528da 100644 --- a/src/main/java/com/example/scoi/domain/auth/dto/AuthReqDTO.java +++ b/src/main/java/com/example/scoi/domain/auth/dto/AuthReqDTO.java @@ -57,10 +57,9 @@ public record SignupRequest( @Schema(description = "AES 암호화된 6자리 간편비밀번호 (Base64)", example = "ItfrsoB1J0hl3O60mahB1A==") String simplePassword, - @Schema(description = "회원 타입 (INDIVIDUAL: 개인, CORPORATION: 법인)", + @Schema(description = "회원 타입 (미입력 시 INDIVIDUAL 기본값)", example = "INDIVIDUAL", allowableValues = {"INDIVIDUAL", "CORPORATION"}) - @NotNull(message = "회원 타입은 필수입니다.") MemberType memberType, @Schema(description = "바이오 인증 등록 여부 (true: 등록, false: 나중에)", example = "false") From 04f828f423238053aa6b83b650857cb006e6067a Mon Sep 17 00:00:00 2001 From: Myungjun Jang Date: Tue, 10 Feb 2026 15:00:34 +0900 Subject: [PATCH 3/9] =?UTF-8?q?=E2=9C=A8=20feat:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EA=B8=B0=EB=B3=B8=EA=B0=92=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/scoi/domain/auth/service/AuthService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/scoi/domain/auth/service/AuthService.java b/src/main/java/com/example/scoi/domain/auth/service/AuthService.java index 38b3665..4a0c44e 100644 --- a/src/main/java/com/example/scoi/domain/auth/service/AuthService.java +++ b/src/main/java/com/example/scoi/domain/auth/service/AuthService.java @@ -6,6 +6,7 @@ import com.example.scoi.domain.auth.exception.code.AuthErrorCode; import com.example.scoi.domain.member.dto.MemberReqDTO; import com.example.scoi.domain.member.entity.Member; +import com.example.scoi.domain.member.enums.MemberType; import com.example.scoi.domain.member.entity.MemberToken; import com.example.scoi.domain.member.repository.MemberRepository; import com.example.scoi.domain.member.repository.MemberTokenRepository; @@ -200,7 +201,7 @@ public AuthResDTO.SignupResponse signup(AuthReqDTO.SignupRequest request) { .koreanName(request.koreanName()) .residentNumber(request.residentNumber()) .simplePassword(hashedPassword) - .memberType(request.memberType()) + .memberType(request.memberType() != null ? request.memberType() : MemberType.INDIVIDUAL) .isBioRegistered(request.isBioRegistered() != null ? request.isBioRegistered() : false) .build(); From 7b9637d14ec279f4dfb3e4c7da10e922752c0c81 Mon Sep 17 00:00:00 2001 From: JuHeon Date: Tue, 10 Feb 2026 16:26:00 +0900 Subject: [PATCH 4/9] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20Swagger=20?= =?UTF-8?q?=EC=84=9C=EB=B2=84=20=EC=A3=BC=EC=86=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/scoi/global/config/SwaggerConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/scoi/global/config/SwaggerConfig.java b/src/main/java/com/example/scoi/global/config/SwaggerConfig.java index d90f3a0..9eb20b7 100644 --- a/src/main/java/com/example/scoi/global/config/SwaggerConfig.java +++ b/src/main/java/com/example/scoi/global/config/SwaggerConfig.java @@ -29,7 +29,8 @@ public OpenAPI swagger() { return new OpenAPI() .info(info) - .addServersItem(new Server().url("http://13.209.12.10:8081")) + .addServersItem(new Server().url("http://13.209.12.10:8081").description("개발 서버")) + .addServersItem(new Server().url("http://localhost:8080").description("로컬")) .addSecurityItem(securityRequirement) .components(components); } From 17ea706516f085291ccb569c395033c394b66186 Mon Sep 17 00:00:00 2001 From: JuHeon Date: Tue, 10 Feb 2026 16:35:20 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20=EA=B0=84?= =?UTF-8?q?=ED=8E=B8=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=9E=AC?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20(?= =?UTF-8?q?=EC=A0=84=ED=99=94=EB=B2=88=ED=98=B8=20->=20JWT=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=ED=86=A0=ED=81=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scoi/domain/member/controller/MemberController.java | 3 +-- .../java/com/example/scoi/domain/member/dto/MemberReqDTO.java | 4 +--- .../com/example/scoi/domain/member/service/MemberService.java | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/scoi/domain/member/controller/MemberController.java b/src/main/java/com/example/scoi/domain/member/controller/MemberController.java index c45b1e9..7860e6f 100644 --- a/src/main/java/com/example/scoi/domain/member/controller/MemberController.java +++ b/src/main/java/com/example/scoi/domain/member/controller/MemberController.java @@ -11,7 +11,6 @@ import com.example.scoi.global.security.userdetails.CustomUserDetails; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -53,7 +52,7 @@ public ApiResponse> changePassword( // 간편 비밀번호 재설정 @PostMapping("/members/me/password/reset") public ApiResponse resetPassword( - @Validated @RequestBody MemberReqDTO.ResetPassword dto, + @RequestBody MemberReqDTO.ResetPassword dto, @AuthenticationPrincipal CustomUserDetails user ){ BaseSuccessCode code = MemberSuccessCode.RESET_SIMPLE_PASSWORD; diff --git a/src/main/java/com/example/scoi/domain/member/dto/MemberReqDTO.java b/src/main/java/com/example/scoi/domain/member/dto/MemberReqDTO.java index 4b670bc..7edb298 100644 --- a/src/main/java/com/example/scoi/domain/member/dto/MemberReqDTO.java +++ b/src/main/java/com/example/scoi/domain/member/dto/MemberReqDTO.java @@ -1,7 +1,6 @@ package com.example.scoi.domain.member.dto; import com.example.scoi.domain.member.enums.ExchangeType; -import jakarta.validation.constraints.Pattern; public class MemberReqDTO { @@ -13,8 +12,7 @@ public record ChangePassword( // 간편 비밀번호 재설정 public record ResetPassword( - @Pattern(regexp = "^\\d{11}$") - String phoneNumber, + String verificationCode, String newPassword ){} diff --git a/src/main/java/com/example/scoi/domain/member/service/MemberService.java b/src/main/java/com/example/scoi/domain/member/service/MemberService.java index 411be85..4ab4e00 100644 --- a/src/main/java/com/example/scoi/domain/member/service/MemberService.java +++ b/src/main/java/com/example/scoi/domain/member/service/MemberService.java @@ -126,7 +126,7 @@ public Void resetPassword( .orElseThrow(() -> new MemberException(MemberErrorCode.MEMBER_NOT_FOUND)); // 인증된 전화번호인지 확인 - if (!redisUtil.exists(VERIFICATION_PREFIX+dto.phoneNumber())){ + if (!redisUtil.exists(VERIFICATION_PREFIX+dto.verificationCode())){ throw new MemberException(MemberErrorCode.UNVERIFIED_PHONE_NUMBER); } From 1e58efbe98dd51fb9f48a2e6fa0098c21ea8593a Mon Sep 17 00:00:00 2001 From: JuHeon Date: Tue, 10 Feb 2026 17:58:04 +0900 Subject: [PATCH 6/9] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=A0=81=EC=9A=A9=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20CORS,=20Swagger=20=EC=84=9C=EB=B2=84=20URI=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/scoi/global/config/SecurityConfig.java | 6 +++--- .../java/com/example/scoi/global/config/SwaggerConfig.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/scoi/global/config/SecurityConfig.java b/src/main/java/com/example/scoi/global/config/SecurityConfig.java index f098bb4..091297d 100644 --- a/src/main/java/com/example/scoi/global/config/SecurityConfig.java +++ b/src/main/java/com/example/scoi/global/config/SecurityConfig.java @@ -49,7 +49,7 @@ public PasswordEncoder passwordEncoder() { } @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + public SecurityFilterChain securityFilterChain(HttpSecurity http){ http .csrf(AbstractHttpConfigurer::disable) .cors(cors -> cors.configurationSource(corsConfigurationSource())) @@ -75,8 +75,8 @@ public CorsConfigurationSource corsConfigurationSource() { // 프로덕션 환경: 실제 도메인으로 제한 configuration.setAllowedOrigins(List.of( "http://localhost:3000", - "http://localhost:8080" - // "https://scoi.~~~" // 배포 시 추가 + "http://localhost:8080", + "https://scoi.shop" )); configuration.setAllowedMethods(Arrays.asList( diff --git a/src/main/java/com/example/scoi/global/config/SwaggerConfig.java b/src/main/java/com/example/scoi/global/config/SwaggerConfig.java index 9eb20b7..e4961ca 100644 --- a/src/main/java/com/example/scoi/global/config/SwaggerConfig.java +++ b/src/main/java/com/example/scoi/global/config/SwaggerConfig.java @@ -29,7 +29,7 @@ public OpenAPI swagger() { return new OpenAPI() .info(info) - .addServersItem(new Server().url("http://13.209.12.10:8081").description("개발 서버")) + .addServersItem(new Server().url("https://scoi.shop").description("개발 서버")) .addServersItem(new Server().url("http://localhost:8080").description("로컬")) .addSecurityItem(securityRequirement) .components(components); From fc4ab453fce1c599a458dcdb5381ea9969edab28 Mon Sep 17 00:00:00 2001 From: JuHeon Date: Mon, 9 Feb 2026 16:46:23 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20=EC=9E=85?= =?UTF-8?q?=EA=B8=88=20=EC=A3=BC=EC=86=8C=20=ED=99=95=EC=9D=B8=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20API=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD=20(?= =?UTF-8?q?=EA=B0=81=20=EC=BD=94=EC=9D=B8=ED=83=80=EC=9E=85,=20=EB=84=A4?= =?UTF-8?q?=ED=8A=B8=EC=9B=8C=ED=81=AC=20=ED=83=80=EC=9E=85=20->=20?= =?UTF-8?q?=EC=B5=9C=EC=83=81=EB=8B=A8=20=EB=B0=98=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../charge/controller/ChargeController.java | 17 +- .../controller/ChargeControllerDocs.java | 8 +- .../domain/charge/service/ChargeService.java | 170 +++++------------- .../scoi/global/client/BithumbClient.java | 8 +- .../scoi/global/client/UpbitClient.java | 8 +- 5 files changed, 58 insertions(+), 153 deletions(-) diff --git a/src/main/java/com/example/scoi/domain/charge/controller/ChargeController.java b/src/main/java/com/example/scoi/domain/charge/controller/ChargeController.java index 5a46ae4..70335be 100644 --- a/src/main/java/com/example/scoi/domain/charge/controller/ChargeController.java +++ b/src/main/java/com/example/scoi/domain/charge/controller/ChargeController.java @@ -8,10 +8,6 @@ import com.example.scoi.domain.member.enums.ExchangeType; import com.example.scoi.global.apiPayload.ApiResponse; import com.example.scoi.global.apiPayload.code.BaseSuccessCode; - -import com.example.scoi.domain.charge.exception.ChargeException; -import com.example.scoi.domain.charge.exception.code.ChargeErrorCode; -import com.example.scoi.domain.member.enums.ExchangeType; import com.example.scoi.global.security.userdetails.CustomUserDetails; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -70,19 +66,12 @@ public ApiResponse getBalances( // 입금 주소 확인하기 @GetMapping("/deposits/address") - public ApiResponse> getDepositAddress( + public ApiResponse getDepositAddress( @AuthenticationPrincipal CustomUserDetails user, - @RequestParam ExchangeType exchangeType, - @RequestParam(defaultValue = "") List coinType, - @RequestParam(defaultValue = "") List netType + @RequestParam ExchangeType exchangeType ){ BaseSuccessCode code = ChargeSuccessCode.OK; - return ApiResponse.onSuccess(code, chargeService.getDepositAddress( - user.getUsername(), - exchangeType, - coinType.stream().map(String::toUpperCase).toList(), - netType.stream().map(String::toUpperCase).toList() - )); + return ApiResponse.onSuccess(code, chargeService.getDepositAddress(user.getUsername(), exchangeType)); } // 입금 주소 생성하기 diff --git a/src/main/java/com/example/scoi/domain/charge/controller/ChargeControllerDocs.java b/src/main/java/com/example/scoi/domain/charge/controller/ChargeControllerDocs.java index 5f25b2d..ed9e869 100644 --- a/src/main/java/com/example/scoi/domain/charge/controller/ChargeControllerDocs.java +++ b/src/main/java/com/example/scoi/domain/charge/controller/ChargeControllerDocs.java @@ -40,13 +40,11 @@ ApiResponse getBalances( @Operation( summary = "입금 주소 확인하기 API By 김주헌", - description = "코인의 입금 주소를 확인합니다. 리스트로 보내실때 꼭! 인덱스 맞춰서 보내주세요. 입금 주소가 없는 경우, 해당 코인은 제외하고 응답이 옵니다." + description = "코인의 입금 주소를 확인합니다. 해당 유저의 입금 주소 전체를 조회하고 최상단에 잇는 입금 주소를 반환합니다." ) - ApiResponse> getDepositAddress( + ApiResponse getDepositAddress( @AuthenticationPrincipal CustomUserDetails user, - @RequestParam ExchangeType exchangeType, - @RequestParam(defaultValue = "") List coinType, - @RequestParam(defaultValue = "") List netType + @RequestParam ExchangeType exchangeType ); @Operation( diff --git a/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java b/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java index ce4944d..8e13e35 100644 --- a/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java +++ b/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java @@ -9,8 +9,8 @@ import com.example.scoi.domain.charge.exception.ChargeException; import com.example.scoi.domain.charge.exception.code.ChargeErrorCode; import com.example.scoi.domain.member.enums.ExchangeType; -import com.example.scoi.domain.member.repository.MemberApiKeyRepository; import com.example.scoi.domain.member.exception.MemberException; +import com.example.scoi.domain.member.repository.MemberApiKeyRepository; import com.example.scoi.domain.member.repository.MemberRepository; import com.example.scoi.global.client.BithumbClient; import com.example.scoi.global.client.UpbitClient; @@ -27,9 +27,7 @@ import java.security.GeneralSecurityException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; @Service @RequiredArgsConstructor @@ -300,146 +298,58 @@ public BalanceResDTO.BalanceListDTO getBalancesByPhone(String phoneNumber, Excha } // 입금 주소 확인하기 - public List getDepositAddress( + public String getDepositAddress( String phoneNumber, - ExchangeType exchangeType, - List coinType, - List netType + ExchangeType exchangeType ) { // 거래소별 요청 보내기 String token; - List result = new ArrayList<>(); - Map bindError = new HashMap<>(); - switch (exchangeType){ - case UPBIT: - for (int idx = 0; idx < coinType.size(); idx++) { - try { - token = jwtApiUtil - .createUpBitJwt( - phoneNumber, - "currency=" + coinType.get(idx) + "&net_type=" + netType.get(idx), - null - ); - - UpbitResDTO.GetDepositAddress upbitResult = upbitClient - .getDepositAddress(token, coinType.get(idx), netType.get(idx)); - - // 그게 아닌 경우 - result.add( - ChargeConverter.toGetDepositAddress( - upbitResult.currency(), - upbitResult.deposit_address() - ) - ); - // JWT 토큰 제작 실패 - } catch (GeneralSecurityException e) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - // 해당 코인의 입금주소가 없는 경우 - } catch (FeignException.NotFound e) { - ObjectMapper objectMapper = new ObjectMapper(); - ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - - if (!error.error().name().equals("coin_address_not_found")) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } - // 잘못된 파라미터, 거래소에서 지원하지 않는 코인 - } catch (FeignException.BadRequest e) { - ObjectMapper objectMapper = new ObjectMapper(); - ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - - // 잘못된 파라미터인 경우: DTO 코인 정보를 잘못 기입 - switch (error.error().name()) { - - // 잘못된 파라미터 입력 - case "validation_error": - case "invalid_parameter": - throw new ChargeException(ChargeErrorCode.WRONG_COIN_TYPE); - - // 거래소에서 지원하지 않는 코인 - case "currency does not have a valid value": - bindError.put(coinType.get(idx), netType.get(idx)); - break; - - default: - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } - // JWT 토큰 생성 오류 - } catch (FeignException.Unauthorized e) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); + String result; + try{ + switch (exchangeType) { + case UPBIT: + token = jwtApiUtil.createUpBitJwt(phoneNumber, null, null); + List upbitResult = upbitClient.getDepositAddresses(token); + + // 만약 해당 유저 입금 주소가 존재하지 않을 때 (추측) + if (upbitResult.isEmpty()) { + throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); } - } - break; + + result = upbitResult.getFirst().deposit_address(); + break; case BITHUMB: - for (int idx = 0; idx < coinType.size(); idx++){ - try { - token = jwtApiUtil - .createBithumbJwt( - phoneNumber, - "currency="+coinType.get(idx)+"&net_type="+netType.get(idx), - null - ); - - BithumbResDTO.GetDepositAddress bithumbResult = bithumbClient - .getDepositAddress(token, coinType.get(idx), netType.get(idx)); - - // 그게 아닌 경우 - result.add( - ChargeConverter.toGetDepositAddress( - bithumbResult.currency(), - bithumbResult.deposit_address() - ) - ); - // JWT 토큰 제작 실패 - } catch (GeneralSecurityException e) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - // 해당 코인의 입금주소가 없는 경우 - } catch (FeignException.NotFound e) { - ObjectMapper objectMapper = new ObjectMapper(); - ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - - if (!error.error().name().equals("coin_address_not_found")) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } - // 잘못된 파라미터, 거래소에서 지원하지 않는 코인 - } catch (FeignException.BadRequest e) { - ObjectMapper objectMapper = new ObjectMapper(); - ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - - // 잘못된 파라미터인 경우: DTO 코인 정보를 잘못 기입 - switch (error.error().name()) { - - // 잘못된 파라미터 입력 - case "validation_error": - case "invalid_parameter": - throw new ChargeException(ChargeErrorCode.WRONG_COIN_TYPE); - - // 네트워크 미지원: 넘기기 - case "request_for_address_of_not_supported_currency": - bindError.put(coinType.get(idx), netType.get(idx)); - break; - - // 거래소에서 지원하지 않는 코인 - case "currency does not have a valid value": - throw new ChargeException(ChargeErrorCode.NOT_SUPPORT_COIN); - - default: - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } - // JWT 토큰 생성 오류 - } catch (FeignException.Unauthorized e) { - throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - } + token = jwtApiUtil.createBithumbJwt(phoneNumber, null, null); + List bithumbResult = bithumbClient.getDepositAddresses(token); + + // 만약 해당 유저 입금 주소가 존재하지 않을 때 (추측) + if (bithumbResult.isEmpty()) { + throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); } + + result = bithumbResult.getFirst().deposit_address(); break; default: throw new ChargeException(ChargeErrorCode.WRONG_EXCHANGE_TYPE); - } + } + // 거래소 JWT 토큰 오류 + } catch (GeneralSecurityException e) { + throw new ChargeException(ChargeErrorCode.EXCHANGE_API_KEY_NOT_FOUND); + // 거래소 JWT 토큰 인증 오류 + } catch (FeignException.Unauthorized e) { + ObjectMapper objectMapper = new ObjectMapper(); + ClientErrorDTO.Errors error = objectMapper.readValue(e.contentUTF8(), ClientErrorDTO.Errors.class); - // 만약 bindError에 값이 있으면 - if (!bindError.isEmpty()){ - throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND, bindError); + if (error.error().name().equals("out_of_scope")) { + throw new ChargeException(ChargeErrorCode.EXCHANGE_FORBIDDEN); + } + throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); + // 거래소별 입금 주소가 없는 경우 (추측) + } catch (FeignException.NotFound e) { + throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); } + return result; } diff --git a/src/main/java/com/example/scoi/global/client/BithumbClient.java b/src/main/java/com/example/scoi/global/client/BithumbClient.java index bcb9b37..c380a27 100644 --- a/src/main/java/com/example/scoi/global/client/BithumbClient.java +++ b/src/main/java/com/example/scoi/global/client/BithumbClient.java @@ -1,10 +1,8 @@ package com.example.scoi.global.client; -import com.example.scoi.domain.member.dto.MemberReqDTO; import com.example.scoi.domain.transfer.dto.TransferReqDTO; import com.example.scoi.global.client.dto.BithumbReqDTO; import com.example.scoi.global.client.dto.BithumbResDTO; -import com.example.scoi.global.client.dto.UpbitResDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -75,6 +73,12 @@ BithumbResDTO.GetDepositAddress getDepositAddress( @RequestParam("net_type") String netType ); + // 전체 입금 주소 조회 + @GetMapping("/v1/deposits/coin_addresses") + List getDepositAddresses( + @RequestHeader("Authorization") String token + ); + // 이체 출금 가능 정보 // 쿼리 파라미터 O @GetMapping("/v1/withdraws/chance") diff --git a/src/main/java/com/example/scoi/global/client/UpbitClient.java b/src/main/java/com/example/scoi/global/client/UpbitClient.java index da8e2b5..202ad69 100644 --- a/src/main/java/com/example/scoi/global/client/UpbitClient.java +++ b/src/main/java/com/example/scoi/global/client/UpbitClient.java @@ -1,8 +1,6 @@ package com.example.scoi.global.client; -import com.example.scoi.domain.member.dto.MemberReqDTO; import com.example.scoi.domain.transfer.dto.TransferReqDTO; -import com.example.scoi.global.client.dto.BithumbResDTO; import com.example.scoi.global.client.dto.UpbitReqDTO; import com.example.scoi.global.client.dto.UpbitResDTO; import org.springframework.cloud.openfeign.FeignClient; @@ -79,6 +77,12 @@ UpbitResDTO.GetDepositAddress getDepositAddress( @RequestParam("net_type") String netType ); + // 입금 주소 목록 조회 + @GetMapping("/v1/deposits/coin_addresses") + List getDepositAddresses( + @RequestHeader("Authorization") String token + ); + // 출금(이체) 가능 금액 조회 // 쿼리파라미터 O @GetMapping("/v1/withdraws/chance") From fa31af70d65da2f9fed76862aad1bc433f4e870c Mon Sep 17 00:00:00 2001 From: JuHeon Date: Mon, 9 Feb 2026 20:04:12 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20=EC=9E=85?= =?UTF-8?q?=EA=B8=88=20=EC=A3=BC=EC=86=8C=20=ED=99=95=EC=9D=B8=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20API=20=EC=B5=9C=EC=B4=88=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/scoi/domain/charge/service/ChargeService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java b/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java index 8e13e35..68ced4d 100644 --- a/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java +++ b/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java @@ -312,7 +312,7 @@ public String getDepositAddress( token = jwtApiUtil.createUpBitJwt(phoneNumber, null, null); List upbitResult = upbitClient.getDepositAddresses(token); - // 만약 해당 유저 입금 주소가 존재하지 않을 때 (추측) + // 만약 해당 유저 입금 주소가 존재하지 않을 때: 업비트는 빈 리스트 반환 if (upbitResult.isEmpty()) { throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); } From e7c007c6b79d703e65866c5dc3906b2cfa038fe2 Mon Sep 17 00:00:00 2001 From: JuHeon Date: Tue, 10 Feb 2026 18:28:38 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20=EC=9E=85?= =?UTF-8?q?=EA=B8=88=20=EC=A3=BC=EC=86=8C=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20API=20=EA=B1=B0=EB=9E=98=EC=86=8C=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=98=A4=EB=8A=94=20=EC=9D=91=EB=8B=B5=20(currency)=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/code/ChargeErrorCode.java | 2 +- .../domain/charge/service/ChargeService.java | 34 ++++++++----------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/example/scoi/domain/charge/exception/code/ChargeErrorCode.java b/src/main/java/com/example/scoi/domain/charge/exception/code/ChargeErrorCode.java index 94dff2a..054ffd8 100644 --- a/src/main/java/com/example/scoi/domain/charge/exception/code/ChargeErrorCode.java +++ b/src/main/java/com/example/scoi/domain/charge/exception/code/ChargeErrorCode.java @@ -47,7 +47,7 @@ public enum ChargeErrorCode implements BaseErrorCode { "주문 내역을 찾을 수 없습니다."), ADDRESS_NOT_FOUND(HttpStatus.NOT_FOUND, "CHARGE404_3", - "해당 코인의 입금 주소가 없습니다."), + "해당 유저의 입금 주소가 없습니다."), ; private final HttpStatus status; diff --git a/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java b/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java index 68ced4d..3ecd534 100644 --- a/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java +++ b/src/main/java/com/example/scoi/domain/charge/service/ChargeService.java @@ -10,8 +10,6 @@ import com.example.scoi.domain.charge.exception.code.ChargeErrorCode; import com.example.scoi.domain.member.enums.ExchangeType; import com.example.scoi.domain.member.exception.MemberException; -import com.example.scoi.domain.member.repository.MemberApiKeyRepository; -import com.example.scoi.domain.member.repository.MemberRepository; import com.example.scoi.global.client.BithumbClient; import com.example.scoi.global.client.UpbitClient; import com.example.scoi.global.client.converter.BithumbConverter; @@ -38,8 +36,6 @@ public class ChargeService { private final JwtApiUtil jwtApiUtil; private final BithumbClient bithumbClient; private final UpbitClient upbitClient; - private final MemberRepository memberRepository; - private final MemberApiKeyRepository memberApiKeyRepository; // 원화 충전 요청하기 public ChargeResDTO.ChargeKrw chargeKrw( @@ -312,23 +308,24 @@ public String getDepositAddress( token = jwtApiUtil.createUpBitJwt(phoneNumber, null, null); List upbitResult = upbitClient.getDepositAddresses(token); - // 만약 해당 유저 입금 주소가 존재하지 않을 때: 업비트는 빈 리스트 반환 - if (upbitResult.isEmpty()) { - throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); - } + // USDT, USDC 중 가장 먼저 찾은 입금 주소를 result로 + result = upbitResult.stream().filter(depositAddress -> + depositAddress.currency().equals("USDT") || depositAddress.currency().equals("USDC")) + .findFirst() + .orElseThrow(() -> new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND)) + .deposit_address(); - result = upbitResult.getFirst().deposit_address(); break; case BITHUMB: token = jwtApiUtil.createBithumbJwt(phoneNumber, null, null); List bithumbResult = bithumbClient.getDepositAddresses(token); - // 만약 해당 유저 입금 주소가 존재하지 않을 때 (추측) - if (bithumbResult.isEmpty()) { - throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); - } - - result = bithumbResult.getFirst().deposit_address(); + // USDT, USDC 중 가장 먼저 찾은 입금 주소를 result로 + result = bithumbResult.stream().filter(depositAddress -> + depositAddress.currency().equals("USDT") || depositAddress.currency().equals("USDC")) + .findFirst() + .orElseThrow(() -> new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND)) + .deposit_address(); break; default: throw new ChargeException(ChargeErrorCode.WRONG_EXCHANGE_TYPE); @@ -345,9 +342,6 @@ public String getDepositAddress( throw new ChargeException(ChargeErrorCode.EXCHANGE_FORBIDDEN); } throw new ChargeException(ChargeErrorCode.EXCHANGE_BAD_REQUEST); - // 거래소별 입금 주소가 없는 경우 (추측) - } catch (FeignException.NotFound e) { - throw new ChargeException(ChargeErrorCode.ADDRESS_NOT_FOUND); } return result; @@ -379,7 +373,7 @@ public List createDepositAddress( UpbitResDTO.CreateDepositAddress upbitResult = upbitClient .createDepositAddress(token, upbitDto); - result.add(coin); + result.add(upbitResult.currency()); } break; case BITHUMB: @@ -397,7 +391,7 @@ public List createDepositAddress( BithumbResDTO.CreateDepositAddress bithumbResult = bithumbClient .createDepositAddress(token, bithumbDto); - result.add(coin); + result.add(bithumbResult.currency()); } break; default: