반응형

그 전에 Java에서 SAP JCO RFC 인터페이스를 하는 방법에 대한 글을 작성했다.

2023.05.16 - [Language/Java] - [Java] Java에서 SAP JCO RFC 인터페이스 통신하는 방법

 

[Java] Java에서 SAP JCO RFC 인터페이스 통신하는 방법

SAP는 규모가 있는 기업에서는 ERP로 다양한 분야에서 정말 많이 사용합니다. 그 중에서도, MM 분야에서는 물류로 많이 사용하고 있는데, 다른 ERP와 레거시 솔루션 간의 인터페이스 통신을 위해 DBC

yongku.tistory.com

 

이번 글에서는 SAP와 RFC 통신을 할 때, 어떠한 구조로 RFC 통신을 할 수 있는지, 우리가 SAP로 데이터를 던질 때 어떤 형식으로 던져서 어떤 형식으로 리턴을 받는지에 대한 글을 작성한다.


목차

1. SAP와 RFC 통신
2. RFC 통신 방법

1. SAP와 RFC 통신

우리가 SAP와 RFC 통신 인터페이스를 할 때, 제일 먼저 했던 것이 통신을 하기 위한 정보들을 가져오는 setProperty하는 작업이었다. 물론, SAP RFC 통신을 위한 환경 구성은 다 했다고 가정한다.

 

아래와 같이, IP부터 SAP시스템번호, Client, 패스워드 등을 설정한다.

static String ABAP_NOPOOL = "ABAP_AS_WITHOUT_POOL";
static String ABAP_POOL = "ABAP_AS_WITH_POOL";

Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "IP");
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "SAP시스템번호");
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "CLIENT");
connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "ID");
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "PASSWD");
connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   "언어");
connectProperties.setProperty(DestinationDataProvider.JCO_R3NAME, "R3NAME");
connectProperties.setProperty(DestinationDataProvider.JCO_GROUP,  "SGROUP[");
connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "CAPACT");
connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT,"SLIMIT");
createDestinationDataFile("ABAP_AS_WITH_POOL", connectProperties);

 

그 다음에, 호출할 RFC를 설정하는데, 제일 중요한 것이 RFC 호출을 하기 위한 이름을 설정해야 한다. 제일 먼저, RFC 호출 통신을 하기 위해 우리가 설정한 RFC 이름이 있는지 확인을 하는데, 이게 없으면 연결을 하지 않는다.

// destination 설정
JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);

// RFC 이름이 있는지 확인 
JCoFunction function = destination.getRepository().getFunction("String 형 RFC 이름");

// RFC가 없으면 Exception 처리
if(function == null) {
    throw new RuntimeException("FUNCTION not found in SAP. Error");
}

 

위와 같이, destination을 설정하고 RFC 이름이 있는지 확인을 하여 없으면 Exception을 리턴한다.

 

2. RFC 통신 방법

RFC 통신하는 방법에 있어서는 Java를 기준으로 설명하는데, 송신(Send)과 수신(Return)으로 나눈다. 송신하는 방법에 있어서 map, List(table), 헤더-Table 기준 등으로 보낼 수 있다.

 

1) map1개의 map에 Key-Value 형태로 담아서 데이터를 전송하는 방법이다. 

try {
	JCoParameterList paramlist = function.getImportParameterList();
    Iterator keys = hashMap.keySet().iterator();
    String key = "";
    
    //위에서 key값을 가져와서 paramlist에 다시 key-value형태로 담는다.
    while(keys.hasNext()){
        key = (String) keys.next();
        paramlist.setValue(key, hashMap.get(key));
    }
    
    // rfc 실행
    rfcExecute(function, destination);

}
catch(AbapException e)
{
    return returnList;
}

// 실행 후 정상적으로 호출이 완료되었으면, table 형태로 데이터가 넘어 온다.
JCoTable returnTable = function.getTableParameterList().getTable("RFC 리턴 테이블 이름 명시");
     
// 리턴 받은 테이블에서 Row 수를 가져온 다음에, row 수 만큼 변수를 꺼내와서 다시 Hashmap에 담아 리턴한다.
int rfcRowNum = returnTable.getNumRows();
for(int j = 0; j < rfcRowNum; j++){
    DataMap returnMap = new DataMap();
    returnTable.firstRow();
    JCoFieldIterator retbl = returnTable.getFieldIterator();
    JCoField jField = null;
    while(retbl.hasNextField()){
        jField = retbl.nextField();
        returnMap.put(jField.getName(), jField.getValue());
    }

    returnList.add(j, returnMap);
    returnTable.deleteRow(0);
}

 

이 방법은 HashMap 형태로 던져서, 결과는 Table로 리턴 받지만, Table 형태에서 데이터를 꺼내 오는 방법은 다시 HashMap으로 가져오고, 그것을 다시 Java에 맞게 List로 세팅하여 리턴하는 소스다.

 

이 방법 외에도, HashMap으로 송신을 하였을 때, 단일로 HashMap을 리턴받는 형태로도 RFC 통신을 진행할 수 있다. 다음 글에서는 HashMap으로 리턴받는 형태에 글을 작성한다.


 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기