주식과 관련된 프로젝트를 하고 싶었다. 시황을 내가 원한대로 시황을 확인하고, 다양한 전략을 구상하여 백테스팅을 할 수 있는 샌드박스를 만들고 싶었다. 시중에 자료를 편하게 접할 수 있는 파이썬으로 api와 연결하거나 라이브러리를 활용해 data를 스크랩핑할 수 있었으나 삽질끝에 실력이 늘어날 것 같아서 자바로 하고 싶었다.
대신증권 api는 dll을 사용하여 개발을 하게 되는데, dll은 dynamic link library의 약자로 동적으로 연결되 사용할 수 있는 라이브러리로 다른 app이 사용할 수 있다. c/c++ vb에서 사용할 수 있다. 자바로 개발하기 위해서 dll을 자바로 컨버팅하는 과정이 필요하다.
com4j는 컴포넌트 변환 라이브러리로
dll을 자바로 전환해 준다.
컨버팅한 dll은 프로젝트에 임포트하여 사용할 수 있다.
링크
위 링크를 참조해 사전 및 준비를 맞추면 된다.오늘은 com4j를 사용하여 컨버팅 후 프로젝트에 임포트 하는 과정을 설명하겠다.
다운로드 페이지
다운로드를 해주고 압축을 풀어줍니다.
저는 C:// 디렉토리에 압출을 풀어줬습니다.
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"
컨버팅 후의 모습입니다. 이제 프로젝트에 해당 라이브러리를 임포트 해줍니다.
이제 이클립스를 열어 개발을 준비해 봅시다. 이클립스 32bit를 실행시켜 줍니다. 하지만 지금은 dll을 임포트해도 사용할 수 없습니다. 이를 사용할 수 있도록 com4j를 의존성 주입해줘야하기 때문입니다. 해당 프로젝트를 메이븐으로 컨버팅하고(혹은 메이븐 프로젝트로 생성을 하고)
pom.xml에
<dependency>
<groupId>org.jvnet.com4j</groupId>
<artifactId>com4j</artifactId>
<version>2.1</version>
</dependency>
을 추가해 의존성을 주입합니다.
이클립스 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()));
}
}
http://cybosplus.github.io/ 해당 링크를 통해서 손쉽게 api를 확인할 수 있습니다.
참조
tbacking 블로그