Skip to content

Commit cf6a899

Browse files
authored
Merge pull request #126 from UMCSCOI/Fix/#111
[Refactor] 주문 생성 테스트 API 제거
2 parents 2995e5d + 178fcd8 commit cf6a899

4 files changed

Lines changed: 35 additions & 80 deletions

File tree

src/main/java/com/example/scoi/domain/invest/client/adapter/UpbitApiClient.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -955,13 +955,46 @@ public InvestResDTO.OrderDTO testCreateOrder(
955955
ObjectMapper objectMapper = new ObjectMapper();
956956
ClientErrorDTO.Errors error = objectMapper.readValue(errorBody, ClientErrorDTO.Errors.class);
957957
if (error != null && error.error() != null) {
958+
String errorName = error.error().name();
959+
String errorMessage = error.error().message();
960+
958961
log.error("=== 업비트 주문 생성 테스트 실패 (400) ===");
959-
log.error("에러 이름: {}", error.error().name());
960-
log.error("에러 메시지: {}", error.error().message());
962+
log.error("에러 이름: {}", errorName);
963+
log.error("에러 메시지: {}", errorMessage);
961964
log.error("전체 응답: {}", errorBody);
965+
966+
// 업비트 API 에러 이름에 따라 구체적인 에러 코드로 변환
967+
if ("insufficient_funds".equals(errorName) ||
968+
(errorMessage != null && errorMessage.contains("잔고"))) {
969+
// 매수 시 잔고 부족
970+
if ("bid".equals(side)) {
971+
throw new InvestException(InvestErrorCode.INSUFFICIENT_BALANCE);
972+
}
973+
// 매도 시 보유 수량 부족
974+
else if ("ask".equals(side)) {
975+
throw new InvestException(InvestErrorCode.INSUFFICIENT_COIN_AMOUNT);
976+
}
977+
} else if ("invalid_min_total".equals(errorName) ||
978+
"under_min_total".equals(errorName) ||
979+
(errorMessage != null && (errorMessage.contains("최소") || errorMessage.contains("minimum")))) {
980+
// 최소 주문 금액 미만
981+
throw new InvestException(InvestErrorCode.MINIMUM_ORDER_AMOUNT);
982+
} else if ("over_price_limit_bid".equals(errorName) ||
983+
"over_price_limit_ask".equals(errorName) ||
984+
(errorMessage != null && errorMessage.contains("현재가"))) {
985+
// 호가 제한 초과 (현재가의 300% 이내에서만 주문 가능)
986+
Map<String, String> errorDetails = Map.of(
987+
"errorName", errorName,
988+
"errorMessage", errorMessage != null ? errorMessage : ""
989+
);
990+
throw new InvestException(InvestErrorCode.EXCHANGE_API_ERROR, errorDetails);
991+
}
962992
} else {
963993
log.error("업비트 주문 생성 테스트 실패 (400) - responseBody: {}", errorBody);
964994
}
995+
} catch (InvestException investEx) {
996+
// 구체적인 InvestException은 그대로 전파
997+
throw investEx;
965998
} catch (Exception parseException) {
966999
log.error("업비트 주문 생성 테스트 실패 (400) - JSON 파싱 실패: {}, responseBody: {}",
9671000
parseException.getMessage(), errorBody);

src/main/java/com/example/scoi/domain/invest/controller/InvestController.java

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -79,29 +79,6 @@ public ApiResponse<Void> checkOrderAvailability(
7979
return ApiResponse.onSuccess(InvestSuccessCode.ORDER_AVAILABLE);
8080
}
8181

82-
@PostMapping("/orders/test-create")
83-
@Override
84-
@SecurityRequirement(name = "JWT TOKEN")
85-
public ApiResponse<InvestResDTO.OrderDTO> testCreateOrder(
86-
@RequestBody InvestReqDTO.TestOrderDTO request,
87-
@AuthenticationPrincipal CustomUserDetails user
88-
) {
89-
String phoneNumber = user.getUsername();
90-
91-
// 주문 생성 테스트 (password 불필요)
92-
InvestResDTO.OrderDTO result = investService.testCreateOrder(
93-
phoneNumber,
94-
request.exchangeType(),
95-
request.market(),
96-
request.side(),
97-
request.orderType(),
98-
request.price(),
99-
request.volume()
100-
);
101-
102-
return ApiResponse.onSuccess(InvestSuccessCode.ORDER_SUCCESS, result);
103-
}
104-
10582
@PostMapping("/orders")
10683
@Override
10784
@SecurityRequirement(name = "JWT TOKEN")

src/main/java/com/example/scoi/domain/invest/controller/InvestControllerDocs.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,6 @@ ApiResponse<Void> checkOrderAvailability(
3737
@AuthenticationPrincipal CustomUserDetails user
3838
);
3939

40-
@Operation(
41-
summary = "주문 생성 테스트 By 강서현",
42-
description = "실제 주문을 생성하지 않고 주문 요청 형식과 주문 가능 여부를 검증합니다. " +
43-
"업비트 API의 주문 생성 테스트 엔드포인트(/v1/orders/test)를 사용하여 거래 수수료 없이 검증할 수 있습니다. " +
44-
"password는 필요하지 않습니다."
45-
)
46-
ApiResponse<InvestResDTO.OrderDTO> testCreateOrder(
47-
@RequestBody InvestReqDTO.TestOrderDTO request,
48-
@AuthenticationPrincipal CustomUserDetails user
49-
);
50-
5140
@Operation(
5241
summary = "코인 주문하기 By 강서현",
5342
description = "코인 주문을 생성합니다."

src/main/java/com/example/scoi/domain/invest/service/InvestService.java

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -103,50 +103,6 @@ public void checkOrderAvailability(
103103
}
104104
}
105105

106-
107-
// 주문 생성 테스트
108-
public InvestResDTO.OrderDTO testCreateOrder(
109-
String phoneNumber,
110-
ExchangeType exchangeType,
111-
String market,
112-
String side,
113-
String orderType,
114-
String price,
115-
String volume
116-
) {
117-
// 사용자 존재 여부 확인
118-
Member member = memberRepository.findByPhoneNumber(phoneNumber)
119-
.orElseThrow(() -> new InvestException(InvestErrorCode.API_KEY_NOT_FOUND));
120-
121-
// 거래소별 분기
122-
ExchangeApiClient apiClient = getApiClient(exchangeType);
123-
124-
try {
125-
// 주문 생성 테스트
126-
return apiClient.testCreateOrder(
127-
phoneNumber,
128-
exchangeType,
129-
market,
130-
side,
131-
orderType,
132-
price,
133-
volume
134-
);
135-
} catch (InvestException e) {
136-
throw e;
137-
} catch (FeignException e) {
138-
// FeignException은 FeignErrorDecoder에서 이미 로깅되었으므로, 여기서는 추가 정보만 로깅
139-
String errorBody = e.contentUTF8();
140-
log.error("거래소 주문 생성 테스트 실패 (FeignException) - exchangeType: {}, phoneNumber: {}, market: {}, side: {}, status: {}, responseBody: {}",
141-
exchangeType, phoneNumber, market, side, e.status(), errorBody);
142-
throw new InvestException(InvestErrorCode.EXCHANGE_API_ERROR);
143-
} catch (Exception e) {
144-
log.error("거래소 주문 생성 테스트 실패 - exchangeType: {}, phoneNumber: {}, market: {}, side: {}, error: {}",
145-
exchangeType, phoneNumber, market, side, e.getMessage(), e);
146-
throw new InvestException(InvestErrorCode.EXCHANGE_API_ERROR);
147-
}
148-
}
149-
150106
// 주문 생성
151107
@Transactional
152108
public InvestResDTO.OrderDTO createOrder(

0 commit comments

Comments
 (0)