|
6 | 6 |
|
7 | 7 | import org.springframework.stereotype.Component; |
8 | 8 |
|
| 9 | +import com.fasterxml.jackson.core.JsonProcessingException; |
| 10 | +import com.fasterxml.jackson.databind.ObjectMapper; |
9 | 11 | import com.rabbittick.streamer.connector.dto.upbit.UpbitOrderBookDto; |
10 | 12 | import com.rabbittick.streamer.connector.dto.upbit.UpbitTickerDto; |
11 | 13 | import com.rabbittick.streamer.connector.dto.upbit.UpbitTradeDto; |
|
16 | 18 | import com.rabbittick.streamer.global.dto.TickerPayload; |
17 | 19 | import com.rabbittick.streamer.global.dto.TradePayload; |
18 | 20 |
|
| 21 | +import lombok.RequiredArgsConstructor; |
| 22 | + |
19 | 23 | /** |
20 | | - * Upbit 외부 API DTO를 시스템 표준 DTO로 변환하는 컨버터. |
| 24 | + * Upbit WebSocket 수신 데이터를 시스템 표준 DTO로 변환하는 컨버터. |
21 | 25 | * |
22 | | - * <p>각 데이터 타입별로 명시적인 변환 메서드를 제공하여 |
23 | | - * 타입 안전성과 코드 가독성을 확보한다. |
| 26 | + * <p>{@link ExchangeDataConverter}를 구현하여 원시 JSON 문자열을 직접 수신하고, |
| 27 | + * Upbit 전용 DTO로 파싱한 후 거래소 독립적인 {@link MarketDataMessage}로 변환한다. |
24 | 28 | * |
25 | 29 | * <p>지원하는 데이터 타입: |
26 | 30 | * <ul> |
|
30 | 34 | * </ul> |
31 | 35 | */ |
32 | 36 | @Component |
33 | | -public class UpbitDataConverter { |
| 37 | +@RequiredArgsConstructor |
| 38 | +public class UpbitDataConverter implements ExchangeDataConverter { |
| 39 | + |
| 40 | + private final ObjectMapper objectMapper; |
34 | 41 |
|
35 | 42 | private static final String EXCHANGE_NAME = "UPBIT"; |
36 | 43 | private static final String VERSION = "1.0"; |
37 | 44 |
|
| 45 | + @Override |
| 46 | + public String getExchangeName() { |
| 47 | + return EXCHANGE_NAME; |
| 48 | + } |
| 49 | + |
| 50 | + /** |
| 51 | + * 원시 JSON 문자열을 {@link UpbitTickerDto}로 파싱하여 표준 ticker 메시지로 변환한다. |
| 52 | + * |
| 53 | + * @param rawJson Upbit WebSocket으로부터 수신된 원시 JSON 문자열 |
| 54 | + * @return 표준화된 ticker MarketDataMessage |
| 55 | + * @throws IllegalArgumentException JSON 파싱 실패 시 |
| 56 | + */ |
| 57 | + @Override |
| 58 | + public MarketDataMessage<TickerPayload> convertTicker(String rawJson) { |
| 59 | + try { |
| 60 | + UpbitTickerDto dto = objectMapper.readValue(rawJson, UpbitTickerDto.class); |
| 61 | + return convertTickerData(dto); |
| 62 | + } catch (JsonProcessingException e) { |
| 63 | + throw new IllegalArgumentException("Ticker JSON 파싱 실패: " + e.getMessage(), e); |
| 64 | + } |
| 65 | + } |
| 66 | + |
| 67 | + /** |
| 68 | + * 원시 JSON 문자열을 {@link UpbitTradeDto}로 파싱하여 표준 trade 메시지로 변환한다. |
| 69 | + * |
| 70 | + * @param rawJson Upbit WebSocket으로부터 수신된 원시 JSON 문자열 |
| 71 | + * @return 표준화된 trade MarketDataMessage |
| 72 | + * @throws IllegalArgumentException JSON 파싱 실패 시 |
| 73 | + */ |
| 74 | + @Override |
| 75 | + public MarketDataMessage<TradePayload> convertTrade(String rawJson) { |
| 76 | + try { |
| 77 | + UpbitTradeDto dto = objectMapper.readValue(rawJson, UpbitTradeDto.class); |
| 78 | + return convertTradeData(dto); |
| 79 | + } catch (JsonProcessingException e) { |
| 80 | + throw new IllegalArgumentException("Trade JSON 파싱 실패: " + e.getMessage(), e); |
| 81 | + } |
| 82 | + } |
| 83 | + |
| 84 | + /** |
| 85 | + * 원시 JSON 문자열을 {@link UpbitOrderBookDto}로 파싱하여 표준 orderbook 메시지로 변환한다. |
| 86 | + * |
| 87 | + * @param rawJson Upbit WebSocket으로부터 수신된 원시 JSON 문자열 |
| 88 | + * @return 표준화된 orderbook MarketDataMessage |
| 89 | + * @throws IllegalArgumentException JSON 파싱 실패 시 |
| 90 | + */ |
| 91 | + @Override |
| 92 | + public MarketDataMessage<OrderBookPayload> convertOrderBook(String rawJson) { |
| 93 | + try { |
| 94 | + UpbitOrderBookDto dto = objectMapper.readValue(rawJson, UpbitOrderBookDto.class); |
| 95 | + return convertOrderBookData(dto); |
| 96 | + } catch (JsonProcessingException e) { |
| 97 | + throw new IllegalArgumentException("OrderBook JSON 파싱 실패: " + e.getMessage(), e); |
| 98 | + } |
| 99 | + } |
| 100 | + |
38 | 101 | /** |
39 | 102 | * UpbitTickerDto를 표준 MarketDataMessage로 변환한다. |
40 | 103 | * |
|
0 commit comments