IDL/Programming

IDL Task 소개 (Part 1)

이상우_idl 2018. 5. 4. 16:57
728x90
반응형

오늘은 IDL Task라는 것에 관해서 소개를 드려보고자 합니다. IDL Task는 IDL 8.5.2에서 처음 도입된 개념인데, 한마디로 정의하기가 좀 쉽진 않지만 대략적으로 정의해보면, IDL에서 어떤 작업을 수행하기 위하여 작성된 프로그램을 객체 지향적인(Object Oriented) 방식으로 사용할 수 있도록 포장하는 방법론이라고 보면 어떨까 합니다. 그래서 그냥 일반적인 프로그래밍 방식으로 일을 하시는 대다수의IDL 유저들에게는 생소하기도 하고 또 어쩌면 굳이 필요없는 방법론이라고 볼 수도 있습니다. 어차피 IDL Task라는 개념 없이도 여태까지 별 지장이 없었다면 앞으로도 별 지장이 없을 가능성이 크긴 합니다. 다만 이 IDL Task라는 개념은 기술적인 방법론이 어떤 것이냐의 문제 뿐 아니라 향후 IDL이 나아갈 방향과도 연결된 측면이 크기 때문에, 저로서도 심도있게 짚고 넘어가야 할 이슈라고 판단하여 이렇게 게시물로 올리게 되었습니다. 앞으로 몇 차례에 걸쳐 이어질 예정이므로, 지속적인 관심을 부탁드려봅니다.


먼저 IDL Task에 관한 전반적인 내용은 IDL 도움말에서 Environment --> IDL Task 섹션에 잘 나와 있습니다. 지금 작성중인 이 게시물의 내용도 그 내용을 토대로 하였습니다. 그 섹션에서 Custom IDL Task라는 섹션의 세부 내용을 보면 IDL Task에 관하여 다음과 같이 정의하고 있습니다.


IDL Tasks are an object-oriented API to encapsulate IDL procedures


여기서 API(Application Programming Interface)라는 용어가 등장을 하는데요. 어떤 IDL 프로그램이 수행하는 기능을 담은 객체 형태의 API를 만들 수 있는데, 이 API가 바로 IDL Task의 형태로 제작될 수 있다는 의미입니다. API라는 용어는 아시는 분들은 아시겠지만, 간단하게만 요약해보면 어떤 특정한 기능을 담당하는 프로그램 모듈을 뜻하는데, 이렇게 API로 제작된 모듈은 범용성을 갖습니다. 예를 들어 Twitter 제작사에서 Twitter API라는 것을 공개적으로 제공하면, 다른 앱이나 프로그램 개발자들이 이 API를 가져다가 그 안에 기능으로 끼워넣을 수 있습니다. 물론 그 API에서는 어떤 입력이 필요하고 어떤 결과를 출력하는가에 대한 정보도 함께 제공됩니다. 그래야 개발자들이 가져다가 레고블록 조립하듯이 끼워넣을 수 있습니다. 결국은 IDL에서도 이러한 역할을 하는 API를 만들 수 있게 되었고 그 형태가 IDL Task라고 보시면 됩니다. 그래서 IDL에서 Task의 형태로 제작한 API는 IDL에서도 활용이 가능할 뿐 아니라 IDL이 아닌 다른 언어에서도 사용이 가능합니다. 이 부분에 대해서는 나중에 언급하기로 하고, 오늘은 먼저 IDL Task를 제작하는 방법부터 살펴보도록 하겠습니다.


사실 IDL Task라고 해서 그 제작 방식이 기존의 IDL 프로그래밍과 완전히 동떨어진 것은 아닙니다. 기본적으로 .pro 형식의 IDL 프로그램으로 작성해야 하는 것은 동일합니다. 다만 Task로서 제 역할을 하려면 .pro 파일 뿐 아니라 .task라는 파일도 필요한데, 이에 관해서는 좀있다 언급하기로 하겠습니다. 먼저 .pro 형태의 IDL 소스코드부터 만들어보겠습니다. 첫번째 예제이므로 다음과 같이 비교적 간단한 기능을 수행하는 프로그램의 형태가 되도록 해봅시다.


PRO my_calc_task, A=a, B=b, RESULT=result


COMPILE_OPT IDL2


result = a+b


END


이와 같이 매우 간단한 내용의 프로그램으로 작성하였습니다. 이 프로그램에서는 키워드 A, B를 통하여 두개의 입력값들을 받은 후, 두 값을 합한 결과값을 RESULT에 지정된 변수에 담게 됩니다. 그래서 내용으로 보면 일반적인 IDL 프로시저들과 큰 차이는 없습니다. 다만 이 프로그램에서는 일반적인 프로그래밍에서는 잘 사용하지 않던 "COMPILE_OPT IDL2"라는 특이한 문구가 보입니다. 일단 이 문구의 의미에 관해서는 제가 예전에 작성했던 게시물이 있으므로 이 내용을 참조하시기 바랍니다. 중요한 것은 IDL Task로 만들고자 하는 작업 내용을 IDL 프로그램으로 작성할 때, 이 프로그램에서는 이 "COMPILE_OPT IDL2"라는 문구가 반드시 포함되어야 한다는 것입니다. 이 점을 먼저 유념해두시기 바랍니다. 어쨌든 이 내용을 my_calc_task.pro라는 IDL 소스코드 파일로 저장을 합니다. 그리고 이렇게 작성된 프로그램을 직접 활용할 경우에는 다음과 같이 각 키워드마다 값 또는 변수를 지정하면 됩니다.


IDL> my_calc_task, A=5, B=8, RESULT=c

IDL> print, c

      13


이제 이를 바탕으로 IDL Task를 만들기 위해서는 또 다른 파일을 만들어야 하는데, 먼저 그 파일의 이름은 my_calc_task.task가 되어야 합니다. 즉 파일의 확장자가 .task이면서 그 앞의 이름은 .pro 파일과 동일해야 합니다. 물론 이 .task 파일은 일반적인 텍스트 파일이므로, 이러한 파일을 작성하려면 별도의 텍스트 에디터를 활용하거나 아니면 IDL 에디터에서 해도 됩니다. 물론 저장할 때에는 반드시 확장자가 .task가 되도록 해야 합니다. 그런데 어떤 내용으로 이 파일을 채워야할까요? 결론부터 말씀드리면 그 내용은 다음과 같은 형태가 되어야 합니다.


{

  "name": "my_calc_task",

  "base_class": "IDLTaskFromProcedure",

  "schema": "idltask_1.0",

  "routine": "my_calc_task",

  "display_name": "My Calculation Task",

  "description": "A task for my custom calculation.",

  "parameters": [

    {

      "name": "a",

      "direction": "input",

      "type": "float",

      "display_name": "A",

      "required": true,

      "description": "The first value for my calculation."

    },

    {

      "name": "b",

      "direction": "input",

      "type": "float",

      "display_name": "B",

      "required": true,

      "description": "The second value for my calculation."

    },

    {

      "name": "result",

      "direction": "output",

      "type": "float",

      "display_name": "Result",

      "required": true,

      "description": "The result of for my calculation."

    }

  ]

}


혹시 이러한 형식이 어떤 형식인지 아시겠습니까? 아마 아시는 분들도 계실지 모르겠는데, 이게 바로 JSON이라는 형식입니다. 즉 .task파일은 이렇게 JSON 형식으로 제작되어야 한다는 얘기입니다. 사실 이런 부분이 일반적인 IDL 유저들에게는 굉장히 낯설고 당혹스럽게느껴질 수 있습니다. 하지만 IDL Task의 형태를 만들려면 이 과정은 필수입니다. 물론 이 시점에서 JSON이라는 형식에 관하여 자세히 아는 것도 필요할 수 있겠지만, 일단 여기서는 어떤 내용이 이 안에 담겨야하는가에 관해서만 알고 넘어가도 충분할 것 같습니다. 혹시라도 IDL에서 JSON 형식을 취급하는 방식에 관하여 관심있는 분들은 역시 제가 관련 게시물을 전에 작성한 바 있으므로 이 내용을 참조하시기 바랍니다.


일단 이 단계에서는 위의 내용을 그대로 카피하여 my_calc_task.task라는 파일을 만드시면 됩니다. 물론 앞서 먼저 만들었던 .pro 파일과 지금 만드는 .task 파일은 같은 작업 디렉토리 내에 공존해야 합니다. 그리고 .task 파일에 들어갈 위의 내용에서 가장 주목해서 봐야 할 부분을 제가 붉은 색상으로 처리해놓았는데요. 잘 보면 앞서 우리가 만들었던 .pro 소스코드의 핵심적인 항목들이 위의 내용 안에 포함되어 있음을 알 수 있습니다. 즉 프로그램 이름인 my_calc_task, 필요인자들인 a, b, result 등이 여기에 해당됩니다. 물론 이외에도 다양한 항목들이 .task 파일에 포함되어 있는데, 이러한 항목들 전체에 대한 정리를 한번 해볼 필요가 있습니다. 이와 같이 .task 파일 내에 JSON 형식으로 어떤 내용들이 구체적으로 포함되는가에 관해서는 IDL 도움말에서 다음 섹션을 참조하시면 됩니다.


Environment --> IDL Tasks --> Custom IDL Tasks --> Task Definitions


물론 우리가 만든 my_calc_task.task의 내용도 이를 근거로 살펴볼 필요가 당연히 있습니다만, 내용이 좀 길어질 것 같아서 다음 회차 게시물에서 다루기로 하고, 일단 오늘은 이렇게 제작된 IDL Task를 활용하는 방법까지만 살펴보기로 하겠습니다. IDL Task를 IDL에서 활용하는 방식은, 우리가 기존에 알고 있던 프로시저나 함수를 사용하는 방식과는 약간 다릅니다. 앞서 .pro 파일로 작성되었던 프로시저를 활용하는 예제에서 했던 작업을 IDL Task 기반으로는 다음과 같이 하게 됩니다. 가장 먼저 다음과 같이 IDL Task를 객체의 형태로 정의합니다.


IDL> task = IDLTask('my_calc_task')


그 다음에는 계산에 필요한 각 인자값들을 다음과 같이 부여한 후, 이 task를 실행(execute)합니다.


IDL> task.A = 5

IDL> task.B = 8

IDL> task.execute


그 다음에는 계산의 결과값을 다음과같이 출력합니다.


IDL> print, task.RESULT

      13.0000


이러한 방식입니다. 사실 이러한 문법은 우리가 객체 지향 프로그래밍(Object Oriented Programming)에서 클래스(Class), 속성(Property), 메서드(Method) 등이 개념으로 이해해야 하는 것이 맞긴 하지만, 일단은 그냥 IDL Task를 사용하는 방식과 문법이 이렇다라는 정도만 아셔도 충분합니다. 만약 A라는 항목의 값만 11로 바꿔서 계산 결과를 얻고자 한다면, IDL Task 기반에서는 다음과 같이 작업하면 됩니다.


IDL> task.A = 11

IDL> task.execute

IDL> print, task.RESULT

      19.0000


이와 같이 변경하고자 하는 인자만 값을 바꿔서 지정한 후 execute를 다시 해주면 됩니다. 만약 이와 같은 작업을 만약 .pro 소스코드를 기반으로 할 경우에는 다음과 같이 모든 인자들에 대한 정의가 또 들어가야 하겠지요.


IDL> my_calc_task, A=11, B=8, RESULT=c

IDL> print, c

      19


앞서 언급했듯이 IDL Task로 정의된 기능은 객체 지향적인 방식으로 구동되어야 하기 때문에, 기존의 IDL 프로시저들과는 구동 및 사용방식이 많이 다릅니다. 그리고 객체의 형태일 경우 갖는 특징 중 하나는, 객체에 속한 인자값들이 객체와 함께 저장된다는 것입니다. 현재 task라는 이름으로 정의되어 있는 객체를 다음과 같이 IDL sav 파일로 저장해봅시다.


IDL> save, filename='my_task.sav', task


그리고 IDL 인터페이스에서 리셋 버튼을 누르거나 커맨드 입력창에서 다음과 같이 .reset 명령을 실행하여 모든 기억을 지우고 초기화합니다. 이렇게 하면 앞서 우리가 정의했던 task에 관한 기억 자체가 완전히 사라집니다.


IDL> .reset


그 다음에 다음과 같이 restore 명령을 이용하여, 앞서 .sav 파일로 저장했던 내용을 다시 되살려봅시다.


IDL> restore, 'my_task.sav'


이렇게 되살아난 task라는 객체에 대하여 다음과 같이 A, B, RESULT 항목의 값들을 출력해보면, 우리가 앞서 정의했던 값들이 그대로 살아있음을 확인할 수 있습니다.


IDL> print, task.A

      11.0000

IDL> print, task.B

      8.00000

IDL> print, task.RESULT

      19.0000


이러한 모습은 IDL Task에서만 존재하는 것이 아니라, IDL Task가 "객체(Object)"의 형태이고, 이러한 객체들이 갖는 일반적인 특성이 원래 이렇게 때문이라고 보시면 됩니다.


오늘 소개한 내용도 사실 양이 그리 적지는 않았던 것 같습니다. 다음 회차에서는 .task 파일에 JSON 형식으로 들어가게 되는 내용에 관하여 좀 더 자세히 살펴보고, 여력이 된다면 IDL Task에 관한 또 다른 내용들도 함께 다뤄보기로하겠습니다.

반응형