Spring boot/Spring
09. spring - 개인 트러블 관련(PS. Spring framework을 사용할거면 모든걸 일임하라..)
akatjd
2022. 8. 26. 10:59
토이 프로젝트로 Upbit 관련 자동매매를 Spring 사용하여 구현중..
RSI 계산, Websocket 연동, 매매 까지 테스트 완료.
실제 구현해나가는데 지속해서 막히는 부분 생김.
Websocket Listener 쪽에서 Message 수신해주는 메서드쪽에 RSI계산, 매매 로직 삽입하려 하지만 지속 실패.
(물론 RSI계산, 매매 로직 등을 따로 spring에 위임하지 않은 class로 작성했으면 됐겠지만 DB 사용이 필요했기에 지속 spring 위임 한채로 시도.)
원인을 찾아보니 Websocket Listener를 주입해서 불러오지 않고 생성자를 통해 생성해줌.
따라서 Spring에 위임되지 않은 새로운 Websocket Listener가 불러와짐.
해당 Listener에서 Spring에 일임된 서비스나 레파지토리를 불러오려니 당연한 실패..
결국 spring에 대한 이해도가 아직도 떨어져서 발생했던 문제...
물론 다사용자가 사용한다는 가정이면 또 다른 접근 방법과 테스트가 필요할 것으로 보임.
public void conUpbitWebsocket(String url, List<String> tickerList) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
logger.info("tickerList :: " + tickerList);
// 생성자를 통해 만들어버리니 Spring에서 관리가 되지 않음.
UpbitWebsocketListener webSocketListener = new UpbitWebsocketListener();
webSocketListener.setParameter(MarketPriceType.TRADE, tickerList);
client.newWebSocket(request, webSocketListener);
client.dispatcher().executorService().shutdown();
}
------------------------------------------------------------------------------------
// 의존성 주입으로 Spring에 일임함.
@Autowired
UpbitWebsocketListener webSocketListener;
public void conUpbitWebsocket(String url, List<String> tickerList) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
logger.info("tickerList :: " + tickerList);
webSocketListener.setParameter(MarketPriceType.TRADE, tickerList);
client.newWebSocket(request, webSocketListener);
client.dispatcher().executorService().shutdown();
}
Spring에서 관리하는 Listener이니 관리받는 Component 들을 제대로 사용할 수 있음.
// 생성자 생성을 통해 불러온 Listener인데 Spring에서 관리중인 서비스를 의존성 주입하려 함.(당연히 못씀)
@Autowired
CryptoTradeService cryptoTradeService;
@Override
public void onMessage(@NotNull WebSocket webSocket, @NotNull ByteString bytes) {
String market = "KRW-SAND";
String side = "bid";
String volume = "";
String price = "1"; // 테스트
String ordType = "price"; // 시장가 매수
try {
cryptoTradeService.postOrders(market, side, volume, price, ordType);
System.out.println("getAccessKey :: " + up.get().getAccessKey());
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}