대신증권 api(사이보스 플러스) 자바로 개발하기 1. dll 컨버팅

자이로 체펠리·2021년 9월 22일
0

시스템트레이딩

목록 보기
2/3

서론.

주식과 관련된 프로젝트를 하고 싶었다. 시황을 내가 원한대로 시황을 확인하고, 다양한 전략을 구상하여 백테스팅을 할 수 있는 샌드박스를 만들고 싶었다. 시중에 자료를 편하게 접할 수 있는 파이썬으로 api와 연결하거나 라이브러리를 활용해 data를 스크랩핑할 수 있었으나 삽질끝에 실력이 늘어날 것 같아서 자바로 하고 싶었다.

준비물

사전 지식

dll이란?

대신증권 api는 dll을 사용하여 개발을 하게 되는데, dll은 dynamic link library의 약자로 동적으로 연결되 사용할 수 있는 라이브러리로 다른 app이 사용할 수 있다. c/c++ vb에서 사용할 수 있다. 자바로 개발하기 위해서 dll을 자바로 컨버팅하는 과정이 필요하다.

com4j

com4j는 컴포넌트 변환 라이브러리로
dll을 자바로 전환해 준다.
컨버팅한 dll은 프로젝트에 임포트하여 사용할 수 있다.

링크
위 링크를 참조해 사전 및 준비를 맞추면 된다.오늘은 com4j를 사용하여 컨버팅 후 프로젝트에 임포트 하는 과정을 설명하겠다.

시작

1. com4j 다운로드

다운로드 페이지

다운로드를 해주고 압축을 풀어줍니다.
저는 C:// 디렉토리에 압출을 풀어줬습니다.

2. dll to java 컨버팅

c 디렉토리에 압축을 푼이유는 커맨드 작성하기도 쉽고, 프로젝트에 라이브러리를 임포트하기도 쉽기 때문이다.
cmd에 들어가 준다.
윈도우키 + r을 눌러 실행창을 열어주고 cmd를 입력하시거나 편한 방법을 사용하면된다.
커맨드 창을 열었으면 다음의 명령어와 같이

com4j 디렉토리에 이동합니다.
오늘 컨버팅 할 dll은 cpdib.dll, cputil.dll, CpCysDib.dll, cptrade.dll 총 4가지 입니다.

오늘의 타겟 입니다.

java -jar tlbimp.jar -o DS -p dashin.cpdib "C:\DAISHIN\CYBOSPLUS\cpdib.dll"

명령어를 분석 해보면 -o 폴더명 -p 패키지명 "디렉토리\dll명"
으로 이뤄져있으며 위의 명령어를 실행하면 com4j디렉토리 않에 test, cp 폴더(패키지) 내부에 dll을 컨버팅하여 만든 java 파일을들 확인할 수 있습니다.

이제 나머지 dll을 컨버팅 해봅시다.

java -jar tlbimp.jar -o DS -p dashin.cputil "C:\DAISHIN\CYBOSPLUS\cputil.dll"
java -jar tlbimp.jar -o DS -p dashin.cpsysdib "C:\DAISHIN\CYBOSPLUS\CpSysDib.dll"
java -jar tlbimp.jar -o DS -p dashin.cptrade "C:\DAISHIN\CYBOSPLUS\cptrade.dll"


컨버팅 후의 모습입니다. 이제 프로젝트에 해당 라이브러리를 임포트 해줍니다.

3. 의존성 주입

이제 이클립스를 열어 개발을 준비해 봅시다. 이클립스 32bit를 실행시켜 줍니다. 하지만 지금은 dll을 임포트해도 사용할 수 없습니다. 이를 사용할 수 있도록 com4j를 의존성 주입해줘야하기 때문입니다. 해당 프로젝트를 메이븐으로 컨버팅하고(혹은 메이븐 프로젝트로 생성을 하고)
pom.xml에

		<dependency>
		    <groupId>org.jvnet.com4j</groupId>
		    <artifactId>com4j</artifactId>
		    <version>2.1</version>
		</dependency>

을 추가해 의존성을 주입합니다.

4. converted dll 임포트

이클립스 x32를 관리자 권한으로 열어 주고, dll라이브러리를 임포트할 프로젝트의 src를 우클릭하고 import wizard를 열여 줍니다.

file system -> next

browse

컨버팅 해준 dll의 패키지 폴더를 임포트해줍니다.
=> 패키지 이름이 틀려서 오류가 발생할 수도 있으니
이를 수정해 줍시다. 사실 임포트이번에 처음해서 맨날 틀렸습니다.

테스트

테스트를 통해 잘 연결되었나 확인해 보겠습니다.

package main;

import dashin.cputil.ClassFactory;
import java.util.*;
public class test {
	public static void main(String[] args) {

			System.out.println("연결 성공");
			//종목 코드 확인
			dashin.cputil.ICpStockCode icd =ClassFactory.createCpStockCode();
			String strName =icd.codeToName("A056080");
			System.out.println(strName);
			//전체종목 코드 불러오기
			dashin.cputil.ICpCodeMgr codeMgr = ClassFactory.createCpCodeMgr();
            //리턴 형식이 object이지만 Object[]로 캐스팅 하여 리스트를 받는다.
			Object[] market = (Object[]) codeMgr.getStockListByMarket(dashin.cputil.CPE_MARKET_KIND.CPC_MARKET_KOSPI);
			System.out.println(market.length);
			//테스트로 하나만 종목 이름 출력
			System.out.println(icd.codeToName(market[3].toString()));
				
	}
 	
}

ps

http://cybosplus.github.io/ 해당 링크를 통해서 손쉽게 api를 확인할 수 있습니다.

참조
tbacking 블로그

굳good,!

profile
"경의를 표해라. 경의를 갖고 회전의 다음 단계로 나아가는 거다…… [LESSON 4] 다."

0개의 댓글