ls증권 api 아웃블록 처리 요령 – occurs
ls증권 api로 대이터를 리퀘스트하면 구조체로 온다. 이 api는 이 struct를 OutBlock이라 한다.
아웃블록의 종류 – 일체형과 분리형
아웃블록은 하나가 올 수 있고 둘 이상이 올 수도 있다. 후자의 경우 각 아웃블록이 따로 수신될 수 있고 여러 아웃블록들이 연결된 채로 한 번에 수신될 수도 있다. 다시 전자를 분리형이라 하고 후자는 일체형이라 한다. 아웃블록이 어떤 형태인지는 레퍼런스를 보고 알 수 있다. 일체형은 header가 b이고 분리형은 a이다.
아웃블록의 종류에 따라 처리하는 방법이 다른데 분리형이 문제된다.
여러 아웃블록들이 한꺼번에 오는 경우
분리형 아웃블록은 수신을 한 때 수신 패킷의 BlockName 필드를 확인하여 처리하면 문제될 게 없다. 그러나 일체형은 BlockName 필드에 아무 값도 없으므로 TransactionCode 필드로 확인해야 한다.
트랜잭션 코드로 확인을 했으면 레퍼런스에 나온 각 아웃블록의 크기로 끊어 읽어야 한다. 여기서부터 복잡해진다.
애트리뷰트가 있는 경우
각 필드에는 부가적인 대이터를 저장하는 애트리뷰트 1바이트가 더 있을 수도 있다. 그 여부는 레퍼런스의 attribute 항목이 O인지 X인지를 보면 알 수 있다. 예를 들어 크기가 50 바이트인 outBlock1에 애트리뷰트가 있고 필드가 다섯 개라면 비록 레퍼런스에 이 아웃블록의 크기가 50으로 나와 있다 해도 실제로는 55인 거다. 따라 outBlock2는 50에서 끊어 읽으면 안 되고 55부터 읽어야 한다.
occurs인 경우
특히 문제되는 경우다. 아웃블록이 occurs인지 여부는 레퍼런스의 아웃블록 이름을 보면 된다.
occurs는 오래 전 코볼에 나오는 용어다. something occurs n times 즉 무언가가 몇 번 반복된다는 뜻이다. 차트 대이터가 전형적인 예다. 가령 열흘치의 대이터를 요청했다면 같은 아웃블록 열 개가 붙어서 온다. 분리형의 경우 수신된 대이터를 아웃블록 크기로 나누면 occurs 횟수를 알 수 있다. 하지만 일체형인 경우에는 수신된 대이터에 다른 아웃블록의 대이터도 섞여 있으니 앞의 방법으로는 알 수가 없다.
분리형의 occurs 횟수는 첫 필드 앞에 5바이트의 대이터로 저장되어 온다. 문제는 이 크기가 레퍼런스에 나오는 아웃블록의 크기에는 포함되어 있지 않다는 거다. 예를 들어 50 바이트 크기의 outBlock1이 occurs이고 그 값이 5라면 이 아웃블록이 다섯 개 연결되어 있다는 뜻이니 그 크기는 5 + 50 * 5 = 255이다. 따라서 outBlock2는 255부터 읽어야 한다.
이용하기 많이 번거롭다.