티스토리 뷰

 

API Wrapper 함수

 

앞의 Photoshop 예제를 다운로드 했다면 (혹시 받지 않았으면 자료모음에서 받으시기 바랍니다.)

다음 위치의 파일을 보시기 바랍니다.

 

photoshop/util/Photoshop_APIWrapper.js

 

이 파일을 텍스트 에디터로 열어 보시면.. 위 함수와 이름은 비슷한데..

doInitialize, doTeminate.. 등으로 이루어진 것을 볼 수 있습니다. 이것이 바로 Wrapper 함수라고 보시면 되구요.

내부에서 Initialize, Teminate.. 등을 호출하고 있지요~~

 

이런 Wrapper를 왜 사용할까요? 그대로 쓰기 보다는 사용자의 다양한 요구를 받아들여서 적절히 수정해서 적용할 수 있는 융통성을 주기 위해서가 아닐까 하네요...

Wrapper  함수의 이름도 사용자가 임의로 지어서 사용할 수도 있겠죠.. 보통은 표준과 비슷하게 만들겠지만요~

 

자.. 여기까지 하고 실제 Wrapper 함수의 내부를 간략하게만 살펴보도록 하죠...

Wrapper 함수가 이전 강의에서 설명한 API 함수들과 1:1 매핑이 되는 것이 있습니다.

 

doInitialize() -> Initialize()

doTerminate() -> Terminate()

doCommit() -> Commit()

doGetValue() -> GetValue()

doSetValue() -> SetValue()

doGetLastError() -> GetLastError()

doGetErrorString() -> GetErrorString()

doGetDiagnostic() -> GetDiagnostic()

 

실제 소스를 살펴보면 위와 같이 매핑된다는 것을 확인할 수 있을 겁니다.

물론 Wrapper 함수에서 API 함수를 호출하기 전에 몇가지 작업을 더 하기는 합니다만, 기본적으로는 동일하다고 볼 수 있죠..

 

그리고 SCORM Wrapper함수에서 반드시 가지고 있어야 하는 것이 있습니다.

바로 getAPI() 함수입니다. SCORM RTE를 처리하기 위한 API Adapter를 가져오는 부분이라고 할 수 있습니다.


 

SCORM에서 API 함수들을 호출하려면 이런 함수들을 가지고 있는 API Adapter를 이용해야 하거든요.

 

function getAPI()

{

   var theAPI = findAPI(window);

   if ((theAPI == null) && (window.opener != null) && (typeof(window.opener) != "undefined"))

   {

      theAPI = findAPI(window.opener);

   }

   if (theAPI == null)

   {

      alert("Unable to find an API adapter");

   }

   return theAPI

}

 

findAPI 함수를 호출해서 API Adapter를 찾게 됩니다.

 

function findAPI(win)

{

   while ((win.API_1484_11 == null) && (win.parent != null) && (win.parent != win))

   {

      findAPITries++;

      

      if (findAPITries > 500)

      {

         alert("Error finding API -- too deeply nested.");

         return null;

      }

      

      win = win.parent;

 

   }

   return win.API_1484_11;

}

findAPI는 루프를 돌면서 API_1484_11이란 이름을 찾게 되는 것이죠..

SCORM 1.2에서는 win.API를 가져오면 되구요.. 2004에서는 win.API_1484_11을 찾으면 되네요..

 

이렇게 해서 가져오 API Adapter를 가지고서 각종 API 함수를 호출할 수 있게 되는 것이죠..

 

Wraper함수와 API함수가 1:1로 매핑되는 것의 내부를 보시면..

api.Initialize() 와 같은 형태를 볼 수 있을 것입니다. getAPI()를 통해 가져온 API Adapter를 이용하는 것이죠..

 

SCO와 API의 연결

 

이제 Wrapper 함수도 알아봤습니다. 하지만, 아직 우리는 Wrapper 함수를 호출하지 않았습니다.

그쵸~~ 잘 생각해보세요.. API Adapter에서 사용하는 함수를 배웠고.. 그것을 감싸는 Wrapper 함수를 이야기 했을 뿐입니다.

그렇다면, 이런 Wrapper 함수를 이제는 사용해야 합니다.

 

(갑자기 이런 질문을 하는 분도 있겠네요.. ~ 저기요~~ getAPI()를 이용해서 API Adapter를 가져왔잖아요..

음.. getAPI를 통해서 가져온 API Adapter로 API 함수를 호출하죠.. 어디에서.. Wrapper 내부에서..

그럼. 지금 필요로 하는 것은 Wrapper 함수 자체를 호출하는 것이죠..

쩝~~ 더 해깔려지나... 암튼, API 함수들 > API Adapter > Wrapper > ?

요 ?를 살펴보자는 것이죠.. )

 

Wrapper 함수를 사용하는 곳은 어디일까요?

바로 콘텐츠입니다. 즉, LMS에 학습진도나 다른 학습 데이터를 전송하고 받는 임무는 LMS 시스템이 아니라, 콘텐츠의 것입니다. 콘텐츠 중에서도 서버와 통신을 하는 것은 Asset이 아니라 SCO라고 했었죠 ^^

 

SCO 파일에서 Wrapper 함수를 사용하게 될 것입니다.

맞는지 확인해 볼까요?

 

photoshop예제에서 SCO는 Question1.htm... 이죠..

우와~ 제가 이것을 어떻게 알았을까요?

imsmanifest.xml 파일을 열어서 <resource... > 부분의 adlcp:scormType을 보시면 됩니다.

콘텐츠 통합모델 할 때 설명했었죠..^^ 기억이 안나시면 다시 앞강으로 가셔서 살펴보시기 바랍니다.

 

어쨌든 Question1.htm 파일을 열어 보도록 하죠..

 

<script language=javascript src="util/Photoshop_APIWrapper.js"></script>

 

윗부분에 보면 Wrapper 함수를 포함하고 있는 것을 알 수 있습니다. 그쵸.. asset용 파일들을 살펴보시면 이 부분이 없을 겁니다. 한번씩 확인해 보세요.. (Lesson1.htm.. 파일들을 열어보면 알겠죠.)

 

그럼 Wrapper 함수를 어디에서 호출하는지 살펴보도록 하죠..

 

<body onLoad="loadPage()" onunload="return unloadPage()">

 

HTML의 <body> 부분입니다. 페이지를 열면서 loadPage()를 호출하구요.. 닫으면서 unloadPage()를 호출하고 있죠..

 

SCORM에서 SCO를 만들때 알아두어야 하는 기본적인 형태입니다.

 

기본적으로

loadPage()에서는 doInitialize()를 호출하구요..

unloadPage()에서는 doTerminate()를 호출합니다..

 

상황에 따라 doSetValue()나 doGetValue()를 호출할 수도 있겠죠..

자세한 내용은 살펴보시기 바랍니다.

 

옹? unloadPage()에서는 doTerminate()를 호출하지 않는데요? 하는 생각이 든다면.. 하나씩 추적해 보시기 바랍니다.

unloadPage() -> doQuit() -> calcScore() -> doTerminate().. 이해되죠?

 

 



 

SCORM Data Model

 

이제 SCO와 LMS 시스템과 연결이 되었습니다. 바로 API Adapter를 이용해서 된 거죠?

마지막으로 다룰 것은 바로 LMS 시스템에 넘겨줄 데이터에 관련 된 것입니다.

 

콘텐츠와 시스템을 연결했으니.. 당연히 전송할 데이터의 형식을 결정해야 하겠죠..

 

이것이 바로 CMI Data Model이라 부는 것입니다.

 


 

위 그림을 보면 GetValue를 사용하여 학습자 이름인 judy를 가져오고 있죠..

그리고 SetValue를 통해서 학습자 이름을 judy로 저장하고 있습니다.

이때 사용하는 학습자 이름이 왼쪽에 보이는 cmi.learner_name인 것이죠..

 

Wrappr 함수를 호출하는 형식으로 써보면 다음과 같습니다.

 

name = doGetValue("cmi.learner_name");

doSetValue("cmi.learner_name", "judy");

 

이런 식으로 하게 되면 GetValue와 SetValue만 가지고 다양한 데이터를 저장할 수 있게 되죠~~

 

cmi.learner_name 이외에도 60여개의 데이터 모델이 있습니다.

 

또한, 모든 데이터 모델이 GetValue와 SetValue가 허용되는 것은 아니구요..

읽기 전용인 경우, SetValue가 허용되지 않기도 합니다.

버전 정보를 나타내는 cmi._version이나

LMS에서 보내는 메시지를 나타내는 cmi.comments_from_ims._children이 해당이 되는 것이죠 ^^

 

기회가 되면 SCORM 2004 Data Model을 정리하도록 하겠습니다.

 

이상으로 오랜만에 강의를 하나 올렸네요~ 그동안 기다리셨던 분들께는 죄송하구요 ^^

SCORM 2004의 RTE는 그리 어렵지 않으니.. 꼭 숙지하시고..

특히 SCORM형 콘텐츠를 만드는 분들도 이해하셔서~~ SCORM 시스템 개발자들의 수고를 좀 덜어주세요~~

 

그럼.. 좋은 하루 되세요~~ 2007.3.21 From 미니..

댓글
댓글쓰기 폼