Miklix

Dynamics AX 2012 SysOperation 프레임워크 빠른 개요

게시됨: 2025년 2월 15일 오후 10시 35분 25초 UTC
마지막으로 업데이트되었습니다: 2026년 1월 12일 오전 8시 38분 53초 UTC

이 문서에서는 Dynamics AX 2012 및 Dynamics 365 for Operations의 SysOperation 프레임워크에서 처리 클래스와 배치 작업을 구현하는 방법에 대한 간략한 개요(또는 요약)를 제공합니다.


이 페이지는 가능한 한 많은 사람이 이용할 수 있도록 영어에서 기계 번역되었습니다. 안타깝게도 기계 번역은 아직 완성된 기술이 아니므로 오류가 발생할 수 있습니다. 원하시는 경우 여기에서 영어 원문을 보실 수 있습니다:

Dynamics AX 2012 SysOperation Framework Quick Overview

이 게시물의 정보는 Dynamics AX 2012 R3을 기준으로 작성되었습니다. 다른 버전에서는 유효하지 않을 수 있습니다. (업데이트: 이 글의 정보는 Dynamics 365 for Operations에서도 유효한 것으로 확인되었습니다.)


이 글은 간단한 개요 및 요약 정보 제공을 목적으로 작성되었습니다. SysOperation 프레임워크를 처음 접하는 경우, Microsoft에서 제공하는 관련 백서를 읽어보시기를 강력히 권장합니다. 이 글의 내용은 해당 프레임워크를 사용하여 작업을 개발하는 데 필요한 다양한 클래스에 대한 간략한 복습에만 유용할 수 있습니다.

다양한 변형이 있지만, 제가 프레임워크를 사용할 때는 일반적으로 세 가지 클래스를 구현합니다.

  • 데이터 계약(SysOperationDataContractBase를 확장해야 함)
  • 서비스(SysOperationServiceBase를 확장해야 함)
  • 컨트롤러(SysOperationServiceController를 상속해야 함)

또한, UIBuilder 클래스(SysOperationUIBuilder를 상속해야 함)를 구현할 수도 있지만, 이는 어떤 이유로든 프레임워크가 자동으로 생성하는 것보다 더 복잡한 대화 상자가 필요한 경우에만 필요합니다.


데이터 계약

데이터 계약은 작업에 필요한 데이터 멤버를 포함합니다. 이는 RunBase 프레임워크에서 정의되는 일반적인 CurrentList 매크로와 유사하지만, 클래스로 구현되어 있습니다. 데이터 계약은 SysOperationDataContractBase를 상속해야 하지만, 상속하지 않아도 작동합니다. 상위 클래스를 상속하면 유용한 세션 정보를 제공받을 수 있다는 장점이 있습니다.

[DataContractAttribute]
class MyDataContract extends SysOperationDataContractBase
{
    ItemId itemId;
}

이 예제에서 itemId는 데이터 멤버입니다. 각 데이터 멤버에 대해 parm 메서드를 구현하고 DataMemberAttribute 태그를 지정해야 프레임워크가 해당 멤버를 인식할 수 있습니다. 이렇게 하면 프레임워크가 자동으로 대화 상자를 생성할 수 있습니다.

[DataMemberAttribute]
public ItemId parmItemId(ItemId _itemId = itemId)
{
    ;

    itemId = _itemId;
    return itemId;
}


서비스

서비스 클래스는 실제 비즈니스 로직을 담고 있는 클래스입니다. 다이얼로그 표시, 일괄 처리 등은 서비스 클래스의 역할이 아니며, 컨트롤러 클래스의 책임입니다. 이렇게 로직을 분리하면 코드를 더 잘 설계하고 재사용성을 높일 수 있습니다.

데이터 계약 클래스와 마찬가지로 서비스 클래스는 특정 클래스를 상속할 필요는 없지만, 서비스가 배치 작업으로 실행될 것으로 예상되는 경우에는 SysOperationServiceBase 클래스를 상속하는 것이 좋습니다. 상위 클래스가 배치 컨텍스트에 대한 정보를 제공하기 때문입니다. 작업을 시작하는 메서드(즉, 비즈니스 로직을 실행하는 메서드)는 데이터 계약 클래스의 객체를 입력으로 받아야 하며, [SysEntryPointAttribute] 데코레이터를 사용해야 합니다. 예를 들면 다음과 같습니다.

class MyService extends SysOperationServiceBase
{
}

run이라는 메서드를 사용하여:

[SysEntryPointAttribute]
public void run(MyDataContract _dataContract)
{
    // run business logic here
}


제어 장치

컨트롤러 클래스는 작업의 실행 및 일괄 처리를 담당합니다. 또한 최대 성능을 위해 코드가 CIL(클라이언트 인터럽트 로직)에서 실행되도록 합니다. 컨트롤러 클래스는 일반적으로 SysOperationServiceController 클래스를 상속받지만, 다른 옵션도 있습니다.

class MyController extends SysOperationServiceController
{
}

슈퍼 클래스의 생성자는 클래스 이름, 메서드 이름, 그리고 (선택적으로) 실행 모드를 매개변수로 받습니다. 클래스 이름과 메서드 이름은 서비스 클래스의 이름과 해당 서비스 클래스에서 실행될 메서드 이름이어야 합니다. 따라서 컨트롤러의 생성자 메서드는 다음과 같이 구현할 수 있습니다.

public static MyController construct()
{
    ;

    return new MyController(classStr(MyService),
    methodStr(MyService, run));
}

그러면 MyController 클래스의 main 메서드는 다음과 같이 간단해질 수 있습니다.

public static void main(Args _args)
{
    ;

    MyController::construct().startOperation();
}

이것으로 기본적으로 완료되었습니다. 위 예시는 매우 간단한 예시이며, 프레임워크에는 훨씬 더 많은 옵션과 가능성이 있지만, 오랫동안 프레임워크를 사용하지 않았을 때 빠르게 개요를 확인할 수 있습니다.

추가 자료

이 글이 마음에 드셨다면 다음 제안도 마음에 드실 겁니다.


블루스카이에서 공유하기페이스북에서 공유하기LinkedIn에서 공유하기Tumblr에 공유하기X에서 공유LinkedIn에서 공유하기Pinterest에 고정

미켈 크리스텐슨

저자 소개

미켈 크리스텐슨
남자 이름은 miklix.com의 창시자이자 소유자입니다. 전문 컴퓨터 프로그래머/소프트웨어 개발자로 20년 이상 경력을 쌓았으며 현재 유럽의 대형 IT 기업에서 정규직으로 근무하고 있습니다. 블로그를 운영하지 않을 때는 여가 시간을 다양한 관심사, 취미, 활동으로 보내며 이 웹사이트에서 다루는 다양한 주제에 어느 정도 반영되어 있습니다.