지난 게시글에서 CYBOS 5와 CYBOS PLUS를 설치했는데, 이번 게시글에서 부터는 CYBOS PLUS는 어떠한 방식으로 동작하는지와 기본적으로 어떠한 함수들이 존재하는지에 대해 정리해보고자 한다.
CYBOS PLUS, 데이터 요청과 수신 방식 알아보기
대신증권 홈페이지(클릭 시 이동)에 따르면, 대신증권의 Open API 통신 방식은 크게 ① 요청/응답(Requect/Reply, RQ/RP) 방식과 ② 구독/생산(Subscribe/Publish, SB/PB) 방식으로 동작한다고 설명하고 있다. 대체로 키움증권 영웅문의 동작 방식과 거의 동일한데, ①번의 요청/응답 방식은 단순하게 1회 요청에 대한 1회 응답의 방식을 갖고 있으며 ②번의 구독/생산 방식은 1회 요청에 대한 다회 응답의 방식을 갖고 있다. 내용을 정리하자면 아래와 같이 요약할 수 있을 것이다.
① 요청/응답 방식 ▶ 1회 통신 적합 - 사용자: 삼성전자(005930) 종목에 대한 현재가 데이터 반환해줘. - CYBOS: 현재 가격은 80,000원입니다.
② 구독/생산 방식 ▶ 다회 통신 적합(계속적인 실시간 데이터 수신 등) - 사용자: 삼성전자(005930) 종목에 대한 실시간 현재가 데이터좀 줘. - CYBOS: (HH:MM:SS 시점) 현재 가격은 79,000원입니다. - CYBOS: (HH:MM:SS 시점) 현재 가격은 79,100원입니다. - CYBOS: (HH:MM:SS 시점) 현재 가격은 79,200원입니다. - CYBOS: (HH:MM:SS 시점) 현재 가격은 79,300원입니다. - CYBOS: (HH:MM:SS 시점) 현재 가격은 79,200원입니다. - CYBOS: (HH:MM:SS 시점) 현재 가격은 79,300원입니다.
여기서 ① 요청/응답 방식의 경우 요청할 때에는 `SetInputValue()` 함수를 통해 조회하고자 하는 내용(예를 들면, 종목코드, "005930")을 입력하고 `Request()`를 통해 서버에 데이터를 요청하며, ② 구독/생산 방식의 경우에도 조회하고자 하는 내용은 ①번에서 살펴봤던 방식과 동일하게 `SetInputValue()` 함수를 통해 변수를 입력하지만 서버에 데이터를 요청할 때에에는 Request()가 아닌 `Subscribe()` 함수를 사용한다.
데이터를 요청한 후에는 서버로부터 데이터가 전달되었을 것인데, 우리가 만들 프로그램을 통해 서버로부터 데이터를 꺼내오는 함수는 `GetHeaderValue()` 함수이다. 이 함수는 너나 할 것 없이 거의 모든 상황에서 '서버로부터 데이터를 가져오는 기능'을 수행하고 있으며, 앞으로도 많이 사용될 함수이니 어떤 기능을 수행하는지 기억하도록 하자.
이게 전부일리 없지.
일단 근본적인 통신 방식은 앞서 살펴봤던 두 가지 방식으로 분류할 수 있는데, 사실 동작 방식에 있어서 1회 통신이냐 다회 통신이냐를 가지고 구분하기 보다도 '어떠한 목적을 가지고 요청하는 데이터인가'에 중점을 두고 구분하면 조금 더 쉬울 것이다. ①번 방식의 경우에는 단발성 요청이지만, ②번 방식의 경우에는 실시간 데이터와 같은 다회성 요청인 경우에 사용한다고 보면 된다.
이 이상의 이해가 불필요한 이유가 하나 있다. 바로 대신증권 CYBOS PLUS는 기본적으로 특정 함수에 대해 설명할 때 그 함수의 통신 종류로 Request/Reply(요청/응답) 방식인지 아니면 Subscribe/Publish(구독/생산) 방식인지를 명시하고 있기 때문이다. 다시 말해, 우리가 특정 함수에 대해서 ②번 방식(구독/생산 방식)을 사용하고 싶다고 한들 서버에서 ①번 방식(요청/응답 방식)으로만 데이터를 조회할 수 있도록 설정해두었다면 우리는 그 함수에 대해 실시간으로 데이터를 조회하듯이 데이터를 요청할 수 없기 때문이다.
여지껏 살펴봤던 두 가지 통신 방식은 기능 상에서의 차이는 있을지언정, 근본적으로 '비동기' 방식으로 작동한다는 공통점을 가지고 있다. 여기서 이야기하는 비동기 방식이란, 우리가 서버에 데이터를 요청한 이후에 서버로부터 특정 데이터의 수신이 완료되었음을 확인할 수 있어야 하는데 그런 부분을 고려하지 않는다는 것이다. 다시 말해, 우리가 요청한 데이터를 우리가 잘 전달받았는지 아닌지는 고려하지 않고, '데이터를 잘 받았겠거니' 하고 넘어간다는 것이다. 하지만 실제로 프로그램을 구현하다보면 '내가 요청한 데이터를 잘 수신받았는지'는 무엇보다도 중요한 부분이다.
예를 들어, 내가 어떤 장사를 한다고 했을 때 B 제품을 생산하기 위해 없어서는 안 될 A 재료를 발주를 넣었다고 가정해보자. 이때 우리는 A 재료가 나에게 잘 도착했는지를 확인한 후에 B 제품을 생산하는 것이 좋을까 ? 아니면 재료야 언젠가 오겠거니 생각하고 B 제품을 생산하고 있는 것이 좋을까 ? 당연히 A 재료의 재고가 있음을 파악하고 나서 B 재료의 생산 공정을 진행시키는 것이 이치이다. 이 때, 우리가 발주한 A 재료가 우리의 창고에 잘 들어와있는지를 확인하는 것이 바로 '동기' 방식인데, 대신 증권에서는 '동기 방식'로 작동하는 통신 종류에 대해서도 설명하고 있다.
728x90
반응형
동기 방식의 통신 방법
앞서 살펴본 ①번 방식과 ②번 방식은 모두 `SetInputValue()`라는 함수에 우리가 조회하고자 하는 데이터의 종류와 그 데이터에 해당하는 값을 입력한 후, `Request()` 또는 `Subscribe()` 함수를 사용하여 서버에 데이터를 요청했다.
이와 관련하여 동기 방식의 통신 방식도 크게 다르지 않다. 즉, `SetInputValue()` 함수에 우리가 조회하고자 하는 데이터의 종류(예를 들면 종목코드)와 그 데이터에 해당하는 값(예를 들면 '005930')을 전달하는 것까지는 동일하지만 실제로 그 데이터를 서버에 요청할 때는 Request()나 Subscribe()가 아닌 `BlockRequest()`를 사용한다.
이 `BlockRequest()` 함수를 통해 서버로부터 응답이 완료될 때까지 대기 상태를 유지하도록 설정할 수 있으며, 시스템 상에서는 30초 동안 서버로부터 응답이 없을 경우에는 타임아웃으로 처리되어 데이터 통신에 실패한 것으로 본다고 설명하고 있다.
이러한 통신 방식의 또 다른 기능은 바로 '단발성 데이터 요청(①번 방식)을 여러 번 진행시킬 수 있다.'는 것이다. 위에서 예로 들었던 사례에서 보았듯이, 우리는 B 제품을 생산하고자 할 때 A 재료가 필수적으로 필요하다면, A 재료를 주문한 후에 B 제품을 생산하면서도 A 재료가 없음이 확인되었다면 곧바로 A 재료를 주문하고 A 재료가 도착했음을 확인한 후에 다시 B 제품을 생산하는 절차를 계속해서 반복하게 되는데, 이처럼 A 재료를 주문하고 A 재료가 도착했음을 확인할 때 필요한 것이 `BlockRequest()` 함수인 것이다.
더 나아가, 차트 데이터의 경우에는 단발성 조회(`Request()` 또는 `BlockRequest()`)로는 충분한 양의 데이터를 수신받지 못할 수도 있다. 왜냐하면 Open API는 삼성전자의 일봉 차트 데이터를 조회한다고 한들 1975년 6월 11일에 한국증권거래소에 상장된 삼성전자의 일봉 차트 데이터는 수없이 많기 때문이다. 일년에 약 240개의 일봉이 생긴다고 가정했을 때, 1975년부터 2024년까지 약 49년에 해당하는 기간 동안 11,760개의 일봉 차트 데이터가 생성되기 때문이다. Open API는 11,760개의 차트 데이터를 한꺼번에 회신해주지 않고 일부(키움증권의 경우 요청 회당 600개)만 회신해주는데, 그렇기 때문에 데이터를 한 번 요청한 이후에 추가적으로 조회할 수 있는 데이터가 있다면 재차 `Request()` 또는 `BlockRequest()` 함수를 통해 데이터를 요청해야 한다. 여기서, '추가적으로 조회할 수 있는 데이터가 있는지 없는지의 여부'를 회신해주는 기능을 수행하는 함수가 있는데, 바로 `Continue()` 함수이다.
앞서 대신증권에서는 함수별로 통신 방식이 ①요청/응답 방식인지 아니면 ②구독/생산 방식인지에 대해 정리해놓았다고 설명했는데, 여기서 살펴본 추가적으로 조회할 수 있는 데이터의 유무, 즉 연속 조회의 가불가를 의미하는 `Continue()` 함수를 사용할 수 있는지 없는지에 대해서도 따로 표기해놨다.
여기까지 우리가 프로그램을 제작하면서 어떠한 함수를 사용해서 대신증권의 Open API인 CYBOS PLUS와 통신해야 하는지, 그리고 CYBOS PLUS는 어떠한 방식으로 우리에게 데이터를 돌려주는지에 대해 알아봤다. 함수의 대략적인 기능에 대한 이해는 여기까지 하고, 다음 게시글에서는 CYBOS PLUS에 내장되어 있는 함수에는 어떠한 것들이 있는지 그리고 그 함수들은 어떠한 기능을 수행하는지에 대해 더 자세하게 살펴보도록 하자.