Dynamics AX 2012에서 X++에서 AIF 문서 서비스 직접 호출
게시됨: 2025년 2월 16일 오전 11시 23분 2초 UTC
마지막으로 업데이트되었습니다: 2026년 1월 12일 오전 8시 55분 17초 UTC
이 문서에서는 Dynamics AX 2012의 애플리케이션 통합 프레임워크(AIF) 문서 서비스를 X++ 코드에서 직접 호출하는 방법을 설명합니다. 이 방법은 수신 및 발신 호출을 모두 에뮬레이션하여 AIF 코드의 오류를 훨씬 쉽게 찾고 디버깅할 수 있도록 합니다.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
이 게시물의 정보는 Dynamics AX 2012 R3을 기준으로 작성되었습니다. 다른 버전에서는 유효하지 않을 수 있습니다.
최근 저는 한 고객사가 다른 시스템에서 가져온 데이터를 기반으로 고객을 생성하는 애플리케이션 통합 프레임워크(AIF) 인바운드 포트를 구현하는 것을 지원했습니다. Dynamics AX는 이미 이 로직을 구현하는 CustCustomer 문서 서비스를 제공하고 있었기 때문에, 간단하게 표준 솔루션을 사용하기로 결정했습니다.
하지만 외부 시스템에서 Dynamics AX가 허용하는 XML을 생성하는 데에는 많은 문제가 있다는 사실이 곧 드러났습니다. Dynamics AX에서 생성하는 XML 스키마는 상당히 복잡하며, 다른 도구에서는 스키마가 유효한 XML임에도 불구하고 Dynamics AX 자체에서 이를 거부하는 버그가 있는 것으로 보입니다. 따라서 전반적으로 생각했던 것보다 훨씬 복잡한 작업이었습니다.
이 작업을 진행하면서 AIF에서 제공하는 오류 메시지가 너무 불충분해서 특정 XML 파일의 정확한 문제점을 파악하는 데 어려움을 겪는 경우가 많았습니다. 또한 외부 시스템에서 MSMQ를 통해 새 메시지를 보내고, AIF가 해당 메시지를 수신하여 처리할 때까지 기다려야 오류를 확인할 수 있었기 때문에 매우 번거로웠습니다.
그래서 좀 더 빠른 테스트를 위해 로컬 XML 파일을 사용하여 서비스 코드를 직접 호출할 수 있는지 조사해 보았고, 가능하다는 것을 알게 되었습니다. 뿐만 아니라, 실제로 매우 간단하게 수행할 수 있으며 훨씬 더 의미 있는 오류 메시지를 제공합니다.
아래 예제 작업은 로컬 XML 파일을 읽어 AxdCustomer 클래스(CustCustomer 서비스에서 사용하는 문서 클래스)를 이용하여 고객을 생성하려고 시도합니다. 필요한 경우 AxdSalesOrder와 같은 다른 문서 클래스에 대해서도 유사한 작업을 수행할 수 있습니다.
{
FileNameOpen fileName = @'C:\\TestCustomerCreate.xml';
AxdCustomer customer;
AifEntityKey key;
#File
;
new FileIoPermission(fileName, #IO_Read).assert();
customer = new AxdCustomer();
key = customer.create( XmlDocument::newFile(fileName).xml(),
new AifEndpointActionPolicyInfo(),
new AifConstraintList());
CodeAccessPermission::revertAssert();
info('Done');
}
AIF의 "생성" 서비스 작업에 해당하는 customer.create() 메서드가 반환하는 AifEntityKey 객체에는 생성된 CustTable 레코드의 RecId를 포함하여 어떤 고객이 생성되었는지에 대한 정보가 포함되어 있습니다.
테스트하려는 대상이 아웃바운드 포트이거나 인바운드 포트에서 XML이 어떻게 표시되는지 예시를 확인하고 싶다면, document 클래스의 read() 메서드(서비스 작업 "읽기"에 해당)를 호출하여 고객 정보를 파일로 내보낼 수도 있습니다. 예를 들면 다음과 같습니다.
{
FileNameSave fileName = @'C:\\TestCustomerRead.xml';
Map map = new Map( Types::Integer,
Types::Container);
AxdCustomer customer;
AifEntityKey key;
XMLDocument xmlDoc;
XML xml;
AifPropertyBag bag;
#File
;
map.insert(fieldNum(CustTable, AccountNum), ['123456']);
key = new AifEntityKey();
key.parmTableId(tableNum(CustTable));
key.parmKeyDataMap(map);
customer = new AxdCustomer();
xml = customer.read(key,
null,
new AifEndpointActionPolicyInfo(),
new AifConstraintList(),
bag);
new FileIoPermission(fileName, #IO_Write).assert();
xmlDoc = XmlDocument::newXml(xml);
xmlDoc.save(fileName);
CodeAccessPermission::revertAssert();
info('Done');
}
물론 '123456'을 조회하려는 고객의 계좌번호로 바꿔야 합니다.
추가 자료
이 글이 마음에 드셨다면 다음 제안도 마음에 드실 겁니다.
- Dynamics AX 2012에서 모든 소수점을 포함한 실수를 문자열로 변환
- Dynamics AX 2012에서 data()와 buf2Buf()의 차이점
- Dynamics AX 2012에서 법인(회사 계정) 삭제
