프로젝트 할 때 SAP 과 연동 작업이 필요해서 이와 관련된 환경을 셋팅했다.
다음에 또 같은 환경을 쓸 때 참고하려고 sap jco 연동 방법 정리해 둔다~~
1. SAP Jco란?
- Java에서 SAP을 연동하여 시스템을 구축할 때 사용되는 SAP JAVA Connector.
- Java에서 SAP의 데이터를 가져오기 위해 SAP Jco 사용
2. 필요 파일
- sapjco.jar
- sapjco.dll
3. 환경 셋팅
** 주의: sapjco 관련 파일은 사용자의 OS 환경에 맞게 다운받아 설치해야 한다. 32bit 환경인데 64bit용 jco 파일을 설치하면 당연히 에러 ^^
(1) sapjco.dll 파일을 C 드라이브 > Windows > System32 아래로 넣어준다.
(2) sapjco.jar 파일은 maven 사용 시, pom 파일에 추가해주고
maven 사용하지 않는 경우, 프로젝트 우클릭 > properties > Java build path > libraries > add external jars 해서 추가해주면 된다.
(아래 사진 systemPath 태그에는 로컬 파일 경로를 명시해주었다)
--> maven 사용 시 중앙 리파지토리에 sapjco3.jar 파일을 등록하여 받아 쓰는 것도 가능하지만,
그렇게 설정하면 sapjco3.jar 파일에 버전정보가 붙은채로 땡겨오게 되고, 버전정보가 붙으면 maven build 시 jar 파일을
정상적으로 인식하지 못하는 에러가 발생했다. 그래서 우선 maven build 시 로컬 경로로부터 jar파일을 가져다 쓸 수 있도록
설정하여 사용했다.
(3) SAP 연결 정보 설정
- 내가 한 프로젝트의 경우 연결할 SAP 서버 정보를 properties 파일에서 관리했다.
properties 파일에는 아래와 같은 정보가 필요하다.
sap.client = sap.host = sap.language = ko sap.systemnumber = sap.user = ....접속 계정 정보 sap.password = ....접속 계정 정보 #connection pool 설정 sap.pool.capacity = ....허용 pool 갯수 sap.pool.limit = ....최대 허용 pool 갯수 |
- context-common.xml 파일 내 위에 설정한 properties 파일에 대한 설정을 해주었다.
<util:properties id="globalProperties" location="classpath:/property/global_test.properties" /> // global_test.properties 라는 파일에 sap 연결정보를 설정 <!-- Properties 초기화 --> <bean class="groupdId.artifactId.cmm.sapjco.JcoConnection"> // 위의 globalProperties 파일을 참고하여 JcoConnection class 초기화 <constructor-arg> <ref bean="globalProperties" /> </constructor-arg> </bean> |
(4) SAP 연결 정보 및 connection 얻기
- Properties 클래스는 HashTable<Object, Object> class 를 확장하고 있는 클래스로, key, value 형태의 properties 값들을 받는 역할을 한다.
- properties 파일에 정의해 놓았던 sap 연결 정보들을 key, value 형태로 Properties 클래스에 셋팅해준다.
- 앞에서 초기화 했던 JcoConnection class에서 globalProperties 파일을 통해 sap 연결정보 get!
public JcoConnection(Properties jcoProperties) { try { Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, jcoProperties.getProperty("sap.host")); connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, jcoProperties.getProperty("sap.systemnumber")); connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, jcoProperties.getProperty("sap.client")); connectProperties.setProperty(DestinationDataProvider.JCO_USER, jcoProperties.getProperty("sap.user")); connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, jcoProperties.getProperty("sap.password")); connectProperties.setProperty(DestinationDataProvider.JCO_LANG, jcoProperties.getProperty("sap.language")); connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, jcoProperties.getProperty("sap.pool.capacity")); connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, jcoProperties.getProperty("sap.pool.limit"));
File destCfg = new File(jcoProperties.getProperty("sap.host")+".jcoDestination"); FileOutputStream fos = new FileOutputStream(destCfg, false); connectProperties.store(fos, "for tests only !"); fos.close();
destination = JCoDestinationManager.getDestination(jcoProperties.getProperty("sap.host")); repository = destination.getRepository();
}catch (Exception e) { // } } |
(5) RFC Function 얻기
- SAP으로부터 필요한 데이터를 주고받기 위해 SAP에서 제공하는 함수를 가져온다.
public JCoFunction getFunction(String functionStr) { JCoFunction function = null; try { function = repository.getFunction(functionStr); } catch (Exception e) { throw new RuntimeException("Problem retrieving JCO.Function object."); } if (function == null) { throw new RuntimeException("Not possible to receive function. "); } return function; }
|
(6) RFC Function 실행
public void execute(JCoFunction function) { try { JCoContext.begin(destination); function.execute(destination);
} catch (JCoException e) { // } finally { try { JCoContext.end(destination); } catch (JCoException e) { // } } } |
(7) 서버 기동 시 SAP 연동
+ 연동 관련 로그 정보 추후 추가 예정
__________________________________________________________________________________________________________________________________________________________
** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :)
** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.
'JAVA' 카테고리의 다른 글
예외처리 관련 참고문서 (0) | 2017.06.11 |
---|---|
로깅(Logging) 참고문서 (0) | 2017.06.11 |
JAVA - 향상된 for 문 (from Java1.5) (0) | 2017.02.26 |
system32와 systemWOW64 (0) | 2017.02.26 |
JAVA_리팩토링 (1) | 2017.01.08 |