'XML'에 해당되는 글 22건
- 2011/11/16 XSLT 변환(Transform)
- 2011/11/10 XSLT 소개
- 2011/11/08 XSL에 대하여
- 2011/10/27 XML 관련 O/X 문제~
- 2008/02/19 XML DeveloperGroup 자료모음 (7)
- 2007/11/07 8. SCORM 콘텐츠 패키징 절차에 대한 미니 생각..
- 2007/09/17 [도서] XML 원리와 응용 - XML, DTD, XML 스키마, XSLT
- 2007/04/11 7. SCOM CMI 데이터 모델 두번째
- 2007/03/28 6. SCOM CMI 데이터 모델 첫번째
- 2007/03/21 5. SCORM RTE(Run-Time Environment) #2
XML을 XSLT를 이용해서 어떻게 XHTML로 변환하는지 함 살펴볼 예정입니다.
여기에서는 큰그림으로 이해를 하시고, 세부사항은 다음 강좌에서 보다 자세히 다루도록 하겠슴다.
스타일시트 선언
XSL 스타일시트 문서도 XML로 구성되어 있습니다.
그러므로 XML의 기본인 루트 엘리먼트라는 것이 존재해야 합니다.
XSL 스타일시트의 루트엘리먼트는 <xsl:stylesheet> 또는 <xsl:transform>입니다.
왜 두가지를 사용하냐구요?
글쎄요~ 실제로 <xsl:stylesheet>나 <xsl:transform>모두 동일하게 사용됩니다.
그러므로 둘 중의 아무거나 쓰셔도 상관없습니다.
보통은 <xsl:stylesheet>를 사용합니다. 이걸 주로 쓰세요.. ^^
그럼 W3C의 권고안을 따르는 XSL 스타일시트 선언을 살펴보면 다음과 같습니다.
또는
xmlns라고 정의되어 있는 부분이 있습니다. 요건 XML 네임스페이스를 정의하는 겁니다.
xmlns:xsl을 정의함으로써 XSLT 엘리먼트, 속성에 접근할 수 있게 되는 겁니다.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 은 W3C의 공식적인 XSLT 네임스페이스입니다.
그리고 이 네임스페이스의 경우 version="1.0"을 사용합니다.
이 네임스페이스를 보면 XSLT가 1999년에 공식 발표되었다는 것을 어렴풋이 짐작할 수 있을 겁니다.
1999년 11월 16일에 W3C에서 Recommendation을 발표했었슴다.
참고로 W3C의 표준안을 만드는 순서를 말씀드리면.. 다음과 같습니다.
Notes -> Working Draft -> Candidate Recommendation -> Proposed Recommendation -> Recommendation
예제 XML 파일
자.. 그럼 앞으로 예제로 살펴볼 XML 파일에 대해 설명드리도록 하겠습니다.
cdcatalog.xml 파일을 XSLT 변환을 위한 예제로 사용할 겁니다.
문서는 간단합니다. 루트엘리먼트로 <catalog>가 있구요..
그 하위에 <cd>가 반복되는 형태입니다.
<cd> 엘리먼트에는 title, artist, country, company, price, year 정보가 포함되어 있습니다.
음.. XML 문서에 대한 내용은 제가 XML 기초강좌에서 이미 설명을 했기 때문에
여기서 더 이상 언급하지는 않겠습니다.
아래 링크를 누르면 사용할 XML 문서를 확인할 수 있습니다.
XSL 스타일시트 생성
이제 위 XML 문서를 HTML 형식으로 출력하기 위한 XSL 스타일시트(cdcatalog.xsl)를 만들어보겠습니다.
xsl:template로 구성하면 되는데요.. 소스는 다음과 같습니다.
<html> 태그들이 나오는 걸로 봐서 HTML 형태로 변환한다는 것을 알 수 있을 겁니다.
중간에 <xsl:for-each> 태그도 보이네요.. 루프를 돌면서 <table> 태그의 각 항목을 만들고 있습니다. ^^
보다 자세한 소스 설명은 강좌로 계속 진행하도록 하구요..
일단 위에서 설명한 XSL 스타일시트 선언부분이 제대로 되어 있는지 확인해 보시기 바랍니다.
XML 문서에 XSL 스타일시트 연결
이제 XML문서 cdcatalog.xml에 XSL 스타일시트를 연결해 보도록 하겠습니다.
2번째 줄에 <?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> 이 부분이 연결을 선언한 곳이네요..
이제 결과 화면을 보겠습니다. 투박하기는 하지만 HTML 테이블 형식으로 잘 나올 겁니다.
간단히 XSL 스타일시트를 선언하고 XML에 연동하는 것을 살펴봤습니다.
이제 다음에는 XSL 스타일시트의 내부로 들어가 볼 계획입니다.
'XML Developer > XSL' 카테고리의 다른 글
| XSLT <for-each> (0) | 2011/11/30 |
|---|---|
| XSLT <value-of> (0) | 2011/11/25 |
| XSLT <template> (0) | 2011/11/21 |
| XSLT 변환(Transform) (0) | 2011/11/16 |
| XSLT 소개 (0) | 2011/11/10 |
| XSL에 대하여 (0) | 2011/11/08 |
이번에는 XSLT에 대해서 간략히 살펴보려고 합니다.
XSLT와 XSL-FO가 있는데요..
XSLT는 XML문서를 다른 XML 문서로 바꾸는 것을 이야기 하구요.
XSL-FO는 XML 문서를 다른 문서(PDF, DOC 등)로 바꾸는 것을 이야기 합니다.
즉, FO는 Formatting Object의 약자이네요..
XSLT란?
- XSLT는 XSL Transformation을 의미합니다.
- XSLT는 XSL의 가장 중요한 부분입니다.
- XSLT는 XML 문서를 다른 XML 문서로 변환합니다.
- XSLT는 XML 문서를 탐색하기 위해서 XPath를 사용합니다.
- XSLT는 W3C의 표준입니다.
계속해서 반복되는 말들입니다. 자꾸 듣다 보면 익숙해지겠죠.. ^^
XSLT = XSL Transformations
지난번에 XSL은 세 가지 부분으로 구성되어 있다고 했습니다.
XSLT, XPath, XSL-FO...
이 중에서 XSLT가 가장 중요한 부분이라고 할 수 있습니다.
XSLT는 XML 문서를 다른 XML 문서로 변환하기도 하구요..
브라우저가 인식할 수 있는 XHTML이나 HTML과 같은 문서로 변환하기도 합니다.
보편적으로 XSLT를 XML 문서를 (X)HTML 문서로 변환하는데 많이 사용하고 있습니다.
그럼.. 변환이라는 것은 무엇을 한다는 것일까요?
XML 문서에 새로운 엘리먼트나 속성을 추가/삭제할 수도 있구요.
기존의 엘리먼트를 재정렬 할 수도 있구, 특정 엘리먼트를 보여줄지 말지 테스트를 통해서 결정할 수도 있습니다.
보다 정확하게 말하면, XSLT는 XML 소스 트리 구조를 XML 결과 트리 구조로 변환하는 겁니다.
XSLT는 XPath를 활용
XSLT는 XML 문서 내부의 정보를 검색하기 위해서 XPath를 사용합니다.
XPath는 XML 문서의 엘리먼트나 속성을 탐색하기 위해 사용되는 표준을 말합니다.
요~ XPath는 예전 강좌에서도 조금 다뤘는데요..
XSLT에 대한 이야기가 완료되면 살펴보기로 하죠..
XSLT의 동작 방법
XSLT에서는 템플릿이라는 것을 사용하는데요..
이 템플릿과 일치하는 엘리먼트나 속성들을 찾습니다.
뭘로 찾을까요?
당연히 XPath로 검색하겠죠.. ^^
(엘리먼트나 속성들이라고 표현한 것은 여러개를 찾을 수도 있기 때문입니다.)
템플릿과 일치하는 엘리먼트나 속성들이 있으면,
XML 결과 트리 구조에 따라서 이 부분을 변경하게 됩니다.
이런 역할을 하는 것이 바로 XSLT 프로세서입니다.
그럼 대표적인 XSLT 프로세서는 무엇이 있을까요?
바로 웹 브라우저입니다.
XSLT 브라우저들
모질라 파이어폭스 (Mozilla Firefox)
요즘 불여우를 사용하시는 분들이 점차 늘어나고 있는데요..
파이어폭스는 버전 1.0.2부터 XML과 XSLT를 지원하고 있습니다.
모질라 (Mozilla)
모질라는 XML 파싱 모듈을 포함하고 있는데요..
기본적으로 XML과 CSS를 지원한다고 합니다. 또한 네임스페이스도 지원하구요..
XSLT에 대한 구현도 할 거라고 되어있는데요..
이미 구현하지 않았을까 하네요.. ^^
넷스케이프 (Netscape)
넷스케이프 버전 8부터 모질라와 동일한 엔진을 사용하고 있다고 합니다.
그럼.. 위와 같겠죠
오페라 (Opera)
버전 9부터 XML과 XSLT, CSS를 지원한다고 합니다.
버전 8은 XML과 CSS만 지원했다고 하네요..
인터넷 익스플로러 (Internet Explorer)
버전 6부터 XML, 네임스페이스, CSS, XSLT, XPath를 지원하고 있습니다.
IE 버전 5는 W3C의 표준이 아닌 자기들만의 XML을 지원했었죠..
'XML Developer > XSL' 카테고리의 다른 글
| XSLT <for-each> (0) | 2011/11/30 |
|---|---|
| XSLT <value-of> (0) | 2011/11/25 |
| XSLT <template> (0) | 2011/11/21 |
| XSLT 변환(Transform) (0) | 2011/11/16 |
| XSLT 소개 (0) | 2011/11/10 |
| XSL에 대하여 (0) | 2011/11/08 |
XSL의 구성
'XML Developer > XSL' 카테고리의 다른 글
| XSLT <for-each> (0) | 2011/11/30 |
|---|---|
| XSLT <value-of> (0) | 2011/11/25 |
| XSLT <template> (0) | 2011/11/21 |
| XSLT 변환(Transform) (0) | 2011/11/16 |
| XSLT 소개 (0) | 2011/11/10 |
| XSL에 대하여 (0) | 2011/11/08 |
어제 XML 관련 과목에서 중간고사로 냈던 문제 중 O/X 문제입니다.
여러분들도 한번 풀어보시죠.. (답은 다음주에 올리도록 하죠.. ^^)
XML의 기본 개념을 다시 한번 검증하는데 도움이 될 겁니다.
찍는 걸 방지하기 위해 X일 경우, 이유도 적으라고 했네요.. ^^
O로 찍으면 맞는 개수가 적을거구...
4. 다음 각 항목에 O/X로 답하시오. X인 경우, 이유도 함께 작성하시오.
1) XML stands for “Example Markup Language”.
2) XML uses a DTD to describe the data.
3) XML’s goal is to replace HTML.
4) DTD stands for “Dynamic Type Definition”.
5) All XML documents must have a DTD.
6) All XML elements must be properly closed.
7) XML documents must have a root tag.
8) XML elements cannot be empty.
다음은 정답입니다.
1) XML stands for “Example Markup Language”. (X)
XML stands for "eXtensible Markup Language".
2) XML uses a DTD to describe the data. (O)
3) XML’s goal is to replace HTML. (X)
XML's goal is to replace SGML.
4) DTD stands for “Dynamic Type Definition”. (X)
DTD stands for "Document Type Definition".
5) All XML documents must have a DTD. (X)
Well-formed XML documents have not a DTD.
6) All XML elements must be properly closed. (O)
7) XML documents must have a root tag. (O)
8) XML elements cannot be empty. (X)XML elements can be empty.
'XML Developer > XML기초' 카테고리의 다른 글
| XML 관련 O/X 문제~ (0) | 2011/10/27 |
|---|---|
| 1.7 마치면서 (0) | 2002/08/02 |
| 1.6 XSL & XML (0) | 2002/08/02 |
| 1.5 XML & DTD (0) | 2002/08/02 |
| 1.4 DTD란? (0) | 2002/08/02 |
| 1.3 XML의 구성 요소 (0) | 2002/08/02 |
안녕하세요~ 미니입니다.
홈페이지 용량 초과로 자료모음을 닫았더니.. 아쉬워하는 분들이 많아서 여기에 올려놓게 되었습니다.
먼저 XML 기본 강좌의 소스입니다.
1.2 XML의 시작 소스입니다.
startxml.zip
1.5 XML & DTD 소스입니다.
dtdxml.zip
1.6 XSL & XML 소스입니다.
xslxml.zip
다음으로 MSSQL 연동과 관련된 소스입니다.
2.1 XML/IIS 지원 소스입니다.
MakeSQLDir.zip
2.3 템플릿 파일 실행 소스입니다.
Template.zip
2.4 주석 XDR 스키마 소스입니다.
Schema.zip
2.5 XPath 쿼리 소스입니다.
XPath.zip
2.6 마치면서 소스입니다.
MSSQL.zip
그리고 MSXML 관련 소스입니다.
3.1 MSXML에 대하여 중 VB에서 MSXML 호출 소스입니다.
StartMSXML_VB.zip
3.1 MSXML에 대하여 중 VC++에서 MSXML 호출 소스입니다.
StartMSXML_VC.zip
SCORM 관련 파일입니다.
SCORM 2번째 강좌에서 사용한 Photoshop.zip파일과
기본 SampleRTE.mdb 파일입니다.
Photoshop_SampleRTE_mdb..zip
SCORM API 래퍼인 MiniAPIWrapper 파일입니다.
MiniAPIWrapper.zip
마지막으로 기타 자료입니다.
XML과 e-Business에 대한 자료입니다.
xml_ebusiness.ppt
[JAVA] Log4J에 대하여 첨부자료입니다.
log4j.zip
log4j의 DailyRollingAppender 해결 파일입니다.
log4j_1.2.13_ext.jar
그럼.. 좋은 하루 되세요~~
'리뷰' 카테고리의 다른 글
| 사랑하지 않으면 떠나라! (0) | 2008/03/16 |
|---|---|
| IE8에 대한 기대와 우려 (2) | 2008/03/13 |
| XML DeveloperGroup 자료모음 (7) | 2008/02/19 |
| 야후는 왜 관심을 받지 못할까? (4) | 2008/01/21 |
| 미니맵 매쉬업의 iframe 소스 활용 (2) | 2008/01/15 |
| 익스트림 프로그래밍 - 변화를 포용하라 (2) | 2007/10/24 |
간혹 SCORM 콘텐츠 패키지에 대해 문의하시는 분들이 있습니다.
이번에 관련 절차를 한번 정리해 보려고 합니다..
음.. 이건 제 나름대로 정리하는 방식이니까..
참고하시면 됩니다. (요런 작업에는 정식이라는 것이 없어서요.. -.-)
1. 콘텐츠 추출
패키지할 콘텐츠를 정리합니다.
보통 html 파일과 swf 파일, 그리고 여러 스크립트 파일이 여기에 해당할 겁니다.
간혹 fla파일과 같은 원본 파일을 배포할 콘텐츠에 넣으시는 분들이 있는데요..
용량도 커지고.. 소스도 유출되고.. 빼는 게 좋겠죠.. ^^
2. API 파일 선정
SCORM을 사용하려면 SCORM API를 삽입해야 합니다.
그러려면 사용할 API가 필요한데요.. 일반적으로 SCORM 콘텐츠에 포함된 APIWrapper.js 파일을 사용하시면 되는데요..
이럴 경우, 다음과 같은 loadPage, unloadPage를 추가적으로 구현해 줘야 하는 문제가 있습니다.
var exitPageStatus = false;
function loadPage()
{
var result = doInitialize();
}
function unloadPage()
{
if (exitPageStatus != true)
{
doTerminate();
}
}
그래서 보통은 이것까지 감싼 Wrapper를 사용하는 것이 보편적입니다.
제가 작성한 MiniAPIWrapper.js 파일을 사용하시면 될 것 같습니다.
js 파일 하나지만 zip으로 묶어서 자료모음에 올려놓도록 하겠습니다.
필요에 따라 MiniAPIWrapper.js 파일의 하단 Mini Main Function을 변경해서 사용하시면 됩니다.
3. API 삽입
이제 SCORM API를 삽입해보도록 하겠습니다.
이 API는 자바스크립트로 되어 있기 때문에 반드시 기존 콘텐츠에 스크립트 오류가 있어서는 안됩니다.
간혹, flash 파일의 action script의 오류로 인해서 SCORM API 호출이 안되는 경우도 있었습니다.
꼼꼼히 확인하시기 바랍니다.
(인터넷 익스플로러의 경우 도구>인터넷옵션>고급>모든 스크립트 오류에 관련된 알림 표시를 체크해 두세요)
콘텐츠 HTML 상단에 다음과 같이 SCORM API를 포함합니다.
<script type="text/javascript" src="util/MiniAPIWrapper.js"></script>
MiniAPIWrapper.js 파일의 위치를 정확하게 표기하셔야 합니다.
이 위치를 잘못 설정해 놓고 안된다고 하시는 분들도 많더라구요 -.-
다음으로 HTML <body>태그에서 SCORM API를 호출합니다.
<body onLoad="loadPage()" onUnload="unloadPage()">
이걸로 콘텐츠에 API 삽입이 마무리 되었습니다. ^^ (쉽죠~~ 캬!!)
참! 여기서 주의할 사항이 있습니다.
콘텐츠가 iframe 구조로 되어 있는 경우, onUnload 이벤트가 호출되지 않는 경우가 종종 있었습니다.
이때는 onUnload 대신에 onBeforeUnload 이벤트를 사용하면 되더라구요.. 꼭 기억해 두세요~~
여기서 API가 제대로 되었는지 확인하고 싶으시다면..
Test Suite를 이용해서 SCO 테스트를 해보시면 됩니다.
MiniAPIWrapper.js를 넣고 로컬에서 테스트해보면
"API를 초기화할 수 없습니다."라는 메시지가 나올 겁니다.
SCO로 사용할 모든 HTML에 위와 같은 작업을 해 주시면 됩니다.
여기서 잠깐
SCORM에는 Asset이라는 것이 존재합니다 .
이것 또한 HTML 페이지라고 볼 수도 있는데요.. 이것은 SCO와 달리 학습결과를 추적하지 않습니다.
그러므로 위와 같은 API 추가 작업이 필요없습니다.
외국의 SCORM 예제를 보면 이런 Asset을 많이 사용하고 있는 것을 알 수 있습니다.
모든 학습 페이지의 학습여부를 판단하지 않고 중요한 것만 체크하는 방식이지요..
하지만 국내 이러닝 프로젝트에서는 모든 페이지의 학습결과를 체크하기를 요청하는 것 같습니다.
실제로 이런 학습결과 데이터가 무의미하게 너무 많이 쌓여서 나중에 문제가 되는 경우도 있더라구요. -.-
(페이지 단위의 cmi data는 학습 당시에는 쓸모가 있을 것 같아도 나중에는 별 소용이 없는 것 같기도 합니다. -.-)
4. SCORM 패키징
이제는 SCORM 패키징을 할 차례입니다.
imsmanifest.xml 파일을 만드는 것이죠..
이 작업은 반드시 툴을 활용하시라고 하고 싶습니다. (물론 직접 XML을 타이핑하실 분은 없겠죠.. ^^)
국내에도 괜찮은 제품들이 많이 있으니.. 참고하시구요~
오픈소스인 Reload를 사용하셔도 될 겁니다.
어쨌든 방식들은 거의 비슷합니다.
1. 패키지 만들고
2. resource 등록하고
3. organization 하위에 item 등록하고 resource와 연결시키구..
(DUNET에 있을 때 만든 DUNET Scorm Editor에서는 Resource와 Item 등록을 한번에 처리하도록 구성했었죠..
대부분 에디터가 2, 3번 단계를 따로 작업해야 하더라구요 -.-)
5. 메타데이터 삽입
패키징까지 잘 되었다면 필요한 부분에 메타데이터를 삽입하시면 됩니다.
LOM을 이용하는 SCORM 메타데이터의 범위가 꽤 넓고 다양합니다.
그러나 제가 사용해 본 바로는 General의 title, description, keyword 정도 입력해서..
SCO 검색용 정도로 활용해 본게 전부입니다.
일단 검색 이외의 용도로 메타데이터를 활용할 일은 별로 없을 것 같기도 합니다.
뭐.. 나중에 필요하다고 하면 어쩔수 없겠지만요..
어쨋든 메타데이터는 꼭 필요한 것만 최소한으로 그리고 정확하게 넣으시구요~~
KERIS에서 KEM이라는 메타데이터를 만들었습니다.
LOM과 거의 유사한데요. 7차 교육과정을 추가한 항목입니다.
그래서 메타데이터 입력할 때, KEM을 사용하면 ADL의 Test Suite를 통과하지 못합니다.
이점도 참고하세요~~
6. 테스트
이제 테스트할 차례입니다.
SCORM 규격에 맞다면, SCORM 2004 3rd Edition Comformance Test Suite와 Sample RTE에서 잘 돌아가야 합니다.
간혹, 프로젝트하다 보면...
콘텐츠하고 솔루션하고 다투는 경우가 있습니다.
서로 안맞는 거죠.. -.-
그런데.. 같은 스펙을 보고 하는데 왜 안맞는지.. 쩝~~
콘텐츠에서는 Test Suite와 Sample RTE에서 돌아간다는 것만 보여주면 됩니다.
반대로 솔루션은 LMS Test Content Package가 잘 돌아간다는 것만 보여주면.. 되겠죠~~
그러면 둘이 서로 싸울일은 없을 겁니다. ~~
그럼.. 댓글 하나씩 부탁드릴께요..
스펨 때문에 회원만 정보를 입력할 수 있도록 했더니.. 사이트 접속 숫자는 변함이 없는데..
글을 쓰시는 분들이 너무 적네요.. -.-
어쨋든 좋은 하루 되세요~~~
'XML Developer > SCORM' 카테고리의 다른 글
| 8. SCORM 콘텐츠 패키징 절차에 대한 미니 생각.. (0) | 2007/11/07 |
|---|---|
| 7. SCOM CMI 데이터 모델 두번째 (0) | 2007/04/11 |
| 6. SCOM CMI 데이터 모델 첫번째 (0) | 2007/03/28 |
| 5. SCORM RTE(Run-Time Environment) #2 (0) | 2007/03/21 |
| 4. SCORM RTE(Run-Time Environment) #1 (0) | 2007/01/25 |
| 3. 콘텐츠 통합 모델 (Contents Aggregation Model) (0) | 2006/11/27 |
![]() |
XML 원리와 응용 - XML, DTD, XML 스키마, XSLT - ![]() 홍성용 지음/한빛미디어 |
초창기에만 해도 책이 거의 없어서.. XML 스펙, DOM 스펙을 토대로 프로그래밍을 했던 기억이 나네요.
도서관에 들려서 오랜만에 XML 관련 서적을 쭉 살펴보다가 한번 읽어보려고 잡은 책입니다.
XML 스펙들에 대한 전반적인 설명이 잘 되어 있다고 생각됩니다.
전체적인 흐름은 이런 종류의 책을 보시면 되구요..
XSLT나 DOM, SAX등.. 세부사항에 대해서는 관련 서적을 한번 더 보시는게 도움이 될 겁니다.
간혹, 제 홈페이지(http://www.word.pe.kr)에 보면 XML의 기본적인 요소들을 질문하는 경우를 종종 봅니다.
웹사이트를 이리저리 찾아보다가 질문을 하시는 것 같아서.. 최대한 답변을 해드리고 있는데요..
이런분들은 위와 같은 책을 한번 정도 정독해 보시는 것이 크게 도움이 될 거라고 생각합니다.
웹사이트에 많은 정보가 있지만, 그래도 체계적으로 정리해 놓은 책 한권 정도는 읽고 난 다음에야.. 그 정보의 바다가 도움이 되지.. 처음부터 거기에서 모든 내용을 찾을 수는 없다고 보거든요..
참고로 XML은 거의 10년동안 IT의 중요한 이슈로 자리잡았구요.. 강컴이나 알라딘에서 XML로 검색해 보면 300~400권의 책이 나옵니다. 와우~ 많죠..
XML의 개념은 이제 어느정도 정리가 되어서 어떤 책을 보아도 상관이 없을 겁니다.
각자에게 맞는 책을 한권정도 읽어보시기 바랍니다.
음.. 이 책은 연습문제.. 심화문제.. 이런게 나오는 걸로 봐서 교재용으로 만든 것 같습니다.
참고로 책을 보다가 중간에 XML 제품을 소개하는 부분에서 GeneXis Xseek라는 게 나오는데..
XML 파서인 XParser를 포함해서 요 제품군을 제가 전에 있던 팀에서 개발한 것이거든요.. 느낌이 새로왔슴다.. ㅎㅎㅎ
그럼 책 내용을 살펴보도록 하지요..
일단 Part1은 XML의 기본내용인 문서구조, XML 작성방법, 환경등을 잘 설명하고 있습니다.
즉, XML 스펙을 정리해 놓았다고 보시면 되구요.. 한번 쭉 읽어보면 XML의 전체적인 구조를 파악할 수 있을 것입니다.
Part2는 XML과 관련된 각종 표준들을 다루고 있습니다.
DTD, XML Schema, XPath, XLink, XPointer, XSL..
그리고 XML을 활용하기 위해 가장 중요한 DOM과 SAX까지..
Part2의 내용은 XML을 다루기 위해서는 필수적인 요소라는 생각이 드네요..
Part3과 Part4는 XML 데이터베이스 활용인데요..
이 부분은 많은 변화가 있었습니다.
초창기 XML DB라고 나왔던 엑셀론이나 타미노는 이제는 잘 활용이 안되는 것 같구요..
MSSQL, Oracle, Mysql에서도 XML을 지원하기는 합니다만.. 제한적인 것 같네요..
이 부분은 이런게 있구나 하고 참고만 하시면 될 것 같습니다.
'리뷰 > 도서' 카테고리의 다른 글
| [도서] 아이폰 앱 기획 성공의 법칙 (0) | 2011/02/09 |
|---|---|
| [도서] 구글 개발자가 들려주는 HTML5 활용 (0) | 2011/01/30 |
| [도서] 생각이 지나친 사람은 실패한다. (0) | 2010/11/05 |
| [도서] 우리들의 생활을 바꾸는 15개의 새로운 세계 웹 3.0 (0) | 2010/03/02 |
| [도서] 걱정하지 말고 살아라 (0) | 2007/12/09 |
| [도서] XML 원리와 응용 - XML, DTD, XML 스키마, XSLT (0) | 2007/09/17 |
지난 시간에 이어서 SCORM의 CMI 데이터 모델에 대한 정리를 마무리 하도록 하겠습니다.
11. Learner ID
cmi.learner_id
SCO를 사용하는 학습자의 아이디 또는 구분자
GetValue
미니주석) 보통 LMS에 로그인 할 때 사용하는 ID가 있습니다. 그걸 의미한다고 보시면 됩니다.
12. Learner Name
cmi.learner_name
SCO를 사용하는 학습자의 이름
GetValue
미니주석) 역시 LMS에서 사용하는 학습자의 이름입니다. learner_id나 learner_name은 사용자가 설정할 수 없습니다. 즉, SetValue를 지원하지 않는 것이죠..
13. Learner Preference
cmi.learner_preference._children
cmi.learner_preference 데이터모델에서 지원하는 자식 엘리먼트의 리스트를 의미합니다.
GetValue
미니주석) learner_preference란 학습자의 성향이나 선호도라고 생각하시면 될 것 같습니다. audio나 언어 관련 정보를 지정합니다.
cmi.learner_preference.audio_level
학습자가 음성 볼륨 조절과 관련된 단계를 설정.
GetValue, SetValue
미니주석) 0 이상의 값을 가질 수 있습니다. 일반적으로 볼륨 조절이라고 생각하시면 되구요.. 1이 기본값입니다.
cmi.learner_preference.language
학습자가 선호하는 언어를 나타냄
GetValue, SetValue
cmi.learner_preference.delivery_speed
콘텐츠에 대한 속도 조절입니다. 2배 빠르게 혹은 2배 느리게.. 등으로 설정할 수 있습니다.
GetValue, SetValue
cmi.learner_preference.audio_captioning
음성에 대한 자막을 보여줄지 여부를 나타냄
GetValue, SetValue
다음과 같은 값들이 가능합니다.
"off", "no_change", "on" 각각 "-1", "0", "1"로 지정합니다.
미니주석) 실제로 learner_preference를 이용해서 볼륨조절이나 자막 보여주기, 속도조절을 적용하지는 않고 있습니다.
대부분 걍 콘텐츠 내부에서 사용자가 조절 할 수 있도록 구성하고 있지요~
어쨌든 SCORM에서는 이런 식으로 적용할 수도 있다는 것입니다. 참고하세요 ^^
14. Location
cmi.location
현재 학습하고 있는 SCO의 위치.
SCO는 여러개의 파일로 이루어 질 수 있습니다. 이런 경우, SCO내의 북마크로 활용될 수도 있습니다.
GetValue, SetValue
미니주석) location은 SCO에 대한 학습이 종료될 때. 즉, terminate()가 호출될 때 기본적으로 저장합니다.
북마크 기능이 필요했던 SCORM 1.2에서는 SCO가 초기화 할 때 이 location을 가져와서 해당 위치로 이동하기도 했었습니다.
15. Maximum Time Allowed
cmi.max_time_allowed
해당 SCO를 최대한 학습할 수 있는 시간.
GetValue
미니주석) imsmanifest.xml 파일에서 이 부분에 대한 값을 미리 설정해 둡니다. 그러면 CMI 데이터 모델에 있는 time_limit_action에 의해 학습시간이 초과되었을 경우, 처리하는 방식을 결정하게 됩니다.
제 생각에 원래 시험과 같이 주어진 시간 내에서 처리해야 하는 경우를 위해 만들어진 것이라고 보는데요..
실제 프로젝트에서는 지정된 시간 이상 학습하기를 원하는 요청이 많이 있어.. 꼼수로 이걸 이용하기도 했었습니다.
16. Mode
cmi.mode
학습자가 SCO를 어떤 형태로 학습하는지 결정하는 모드.
GetValue, Sequencing impacts
미니주석) mode는 다음 세가지 값을 가질 수 있습니다. "browse", "normal", "review"
실제 프로젝트에서는 "browse"는 관리자나 선생님이 SCO에 들어올 때 처리했었습니다. 이것은 학습진도를 체크하지 않고 관람자 모드이기 때문입니다.
"normal"이 일반적으로 학생들이 들어와서 학습하고, 학습추적 데이터를 저장할 때 사용했구요..
"review"는 학습이 완료된 상태에서 복습하기 위해 들어온 경우 처리했었습니다.
아마 스펙에 나와 있는 내용과도 일치할 거라구 생각하네요.. ^^
17. Objectives
학습목표라고 생각하면 됩니다. 보통 학습의 완료여부와 함께.. pass와 fail을 결정하기도 합니다.
시퀀싱을 활용하는데 있어 중요한 요소로 활용합니다.
cmi.objectives._children
cmi.objectives 데이터 모델에서 지원하는 자식 엘리먼트 리스트
GetValue
cmi.objectives._count
학습목표(objective)의 전체 개수.
GetValue
cmi.objectives.n.id
n번째 학습목표에 대한 구분자
GetValue
cmi.objectives.n.score._children
cmi.objectives.n.score 데이터 모델에서 지원하느 자식 엘리먼트 리스트
GetValue
cmi.objectives.n.score.scaled
n번째 학습목표에 대한 학습자의 점수를 비율로 적용한 값. -1 ~ 1 사이의 값.
GetValue, SetValue, Sequencing Impacts
미니주석) 시퀀싱에서 보면 Objective Measure Status / Objective Normalized Measure 라는 값이 있습니다.
이 값이 score.scaled와 연관이 되어 있다고 보시면 됩니다.
즉, score.scaled 가 설정되어 있지 않으면 Objective Measure Status는 false가 됩니다.
반면에 score.scaled가 설정되어 있으면 Objective Measure Status는 true가 되고, Objective Normalized Measure값은 score.scaled가 됩니다.
이 값을 이용해서 시퀀싱을 처리하게 됩니다.
cmi.objectives.n.score.raw
n번째 학습목표에 대한 학습자의 실제 점수
GetValue, SetValue
cmi.objectives.n.score.min
n번째 학습목표에 대한 가능한 최소 점수
cmi.objectives.n.score.max
n번째 학습목표에 대한 가능한 최대 점수
미니주석) 특정 학습목표가 존재할 경우, 이 값을 활용하게 됩니다. 그냥 해당 SCO에 대한 학습 결과는 cmi.score에 저장합니다.
cmi.objectives.n.success_status
n번째 학습목표에 대한 pass 여부입니다. ("passed", "failed", "unknown"의 값을 가집니다.)
GetValue, SetValue, Sequencing Impacts
cmi.objectives.n.completion_status
n번째 학습목표에 대한 완료 여부입니다. ("completed", "incomplete", "not_attempted", "unknown"의 값을 가집니다.)
GetValue, SetValue
cmi.objectives.n.progress_measure
n번째 학습목표에 대한 진행정도를 나타냅니다.
GetValue, SetValue
cmi.objectives.n.description
n번째 학습목표에 대한 설명.
GetValue, SetValue
18. Progress Measure
cmi.progress_measure
학습자의 학습진행 정도를 0 ~ 1 사이의 값으로 표시
0 : "not attempted", 1: "completed", 0 < n < 1 : "imcomplete"
GetValue, SetValue, Sequencing Impacts
19. Scaled Passing Score
cmi.scaled_passing_score
SCO를 master하기 위해 요구되는 Pass 점수. -1.0 ~ 1.0 사이의 값으로 표시
GetValue
미니주석) cmi.completion_threshold와 cmi.scaled_passing_score를 구분하셔야 합니다.
전자는 SCO를 완료(complete)하기 위한 조건이고, 후자는 SCO를 마스터(master)하기 위한 조건입니다.
일반적으로 complete는 학습완료라고 보시면 되구요.. master는 pass/fail에서 pass라고 보는 것이 맞을 듯 합니다.
20. Score
cmi.objectives에서 살펴본 내용과 크게 다르지 않습니다.
다만, 특정 학습목표가 아니라 SCO 전체에 대한 점수라고 생각하시면 됩니다.
cmi.score._children
cmi.score 데이터 모델에서 지원하느 자식 엘리먼트 리스트
GetValue
cmi.score.scaled
SCO에 대한 학습자의 점수를 비율로 적용한 값. -1 ~ 1 사이의 값.
GetValue, SetValue, Sequencing Impacts
cmi.score.raw
SCO에 대한 학습자의 실제 점수
GetValue, SetValue
cmi.score.min
SCO에 대한 가능한 최소 점수
cmi.score.max
SCO에 대한 가능한 최대 점수
21. Session Time
cmi.session_time
현재 세션에서 해당 SCO를 학습한 시간.
SetValue
미니주석) 해당 SCO에 대한 총 학습시간은 cmi.total_time에 저장됩니다.
22. Success_status
cmi.success_status
학습자가 SCO를 마스터(master) 했는지 여부. "passed", "failed", "unknown" 값 중의 하나.
GetValue, SetValue, Sequencing Impacts
미니주석) cmi.completetion_status와 구분하시기 바랍니다. 학습완료(complete)는 했으나 마스터(master)하지 못하는 경우도 있습니다.
Scaled Passing Score, Scaled Score, Success Satus를 이용해 값을 결정합니다.
Completion Threshold, Progress Measure, Completion Status를 이용해 complete 여부를 결정했었죠..
23. Suspend Data
cmi.suspend_data
cmi.exit로 빠져나깔 때, 잠시 중지(suspend)하는 경우가 있습니다. 이 경우, 다시 돌아왔을 때 전에 사용하던 데이터를 유지할 필요가 있을 수 있습니다.
그럴 때 suspend_data를 이용해 정보를 저장해 두면 된다고 하네요~~
SetValue
24. Time Limit Action
cmi.time_limit_action
cmi.max_time_allowed가 초과되었을 때 SCO가 처리해야 하는 방식을 나타냄.
"exit_message" : 메시지를 보여주고 종료
"continue_message" : 메시지를 보여주고 계속 진행
"exit_no_message" : 메시지 보여주지 않고 종료
"continue_no_message" : 메시지 보여주지 않고 계속 진행
GetValue
25. Total Time
cmi.total_time
학습자가 SCO를 학습한 총 시간.
GetValue
미니주석) 기본적으로 total time과 같이 시간간격을 표현하는 형식은 다음과 같습니다.
P[yY][mM][dD][T[hH][mM][s[.s]S]]
예를 들어, P1Y3M2DT3H 는 1년 3개월 2일 3시간을 나타냅니다.
이상으로 SCORM 2004의 CMI 데이터 모델에 대한 정의를 마무리 했습니다.
다음 주에는 마지막으로 SCORM 2004의 시퀀싱에 대해 알아보려고 합니다.
그럼.. 좋은 하루 되세요~~ 2007. 4. 11 From 미니...
'XML Developer > SCORM' 카테고리의 다른 글
| 8. SCORM 콘텐츠 패키징 절차에 대한 미니 생각.. (0) | 2007/11/07 |
|---|---|
| 7. SCOM CMI 데이터 모델 두번째 (0) | 2007/04/11 |
| 6. SCOM CMI 데이터 모델 첫번째 (0) | 2007/03/28 |
| 5. SCORM RTE(Run-Time Environment) #2 (0) | 2007/03/21 |
| 4. SCORM RTE(Run-Time Environment) #1 (0) | 2007/01/25 |
| 3. 콘텐츠 통합 모델 (Contents Aggregation Model) (0) | 2006/11/27 |
SCORM RTE에서 이야기한 CMI Data Model을 정리해서 올려놓겠습니다.
아마도 이 자료가 필요한 분들이 많을 거라고 생각됩니다.
처음 SCORM을 접했을 때, 가장 많이 봤던 부분이기도 하구요~~ 이미 다른 정리된 좋은 자료가 있을지 모르지만..
미니주석이라는 설명으로 제가 나름 파악한 내용도 추가해 놓도록 할께요~~
각 엘리먼트 다음에 GetValue, SetValue 등이 표시될 겁니다.
GetValue, SetValue가 모두 있으면 읽고 쓰기가 가능하다는 것이구요..
GetValue 는 읽기만 가능하구, SetValue는 쓰기가 가능하다는 것입니다.
위 말이 잘 이해가 안되면 이전 강좌를 참고하세요~~
그리고 스펙에 나와 있는 데이터 타입이나 에러 처리등 기타 상세한 부분은 정리하지 않았습니다.
그것은 SCORM 스펙을 직접 참고하시기 바랍니다.
SCORM 관련 이야기가 이제 거의 마무리 되어 가네요~
이러닝에 관심 없으셨던 분들은 다음 강좌를 기대해 주세요!!
1. Data Model Version
cmi._version
데이터 모델의 버전. SCORM Run-Time Envrionment Version 1.3에서는 "1.0"으로 사용함.
GetValue("cmi._version")
2. Comments From Learner
학습자가 사용할 수 있는 설명 혹은 주석을 의미합니다.
cmi.comments_from_learner._children
cmi.comments_from_learner에서 지원되는 자식 엘리먼트의 리스트를 나타냄.
다시 말하면 cmi.comments_from_learner의 자식으로 comment, location, timestamp가 올수 있다는 것을 알려주는 것입니다.
GetValue("cmi.comments_from_learner._children")
cmi.comments_from_learner._count
학습자가 해당 SCO에 대해 작성한 설명 혹은 주석(comment)의 수.
GetValue("cmi.comments_from_learner._count")
cmi.comments_from_learner.n.comment
학습자가 작성한 n번째의 설명 혹은 주석 (comment).
GetValue("cmi.comments_from_learner.0.comment")
SetValue("cmi.comments_from_learner.0.comment", "SCO에 대한 일부 설명들")
미니주석) 중간에 n 이 나타나는 것은 여러개가 올 수 있다는 것입니다. 그래서 바로 위에 _count가 있는 거겠죠..
학습자가 작성한 값을 넣어야 하니까. 당연히 SetValue도 가능한 겁니다.
cmi.comments_from_learner.n.location
학습자가 작성한 설명 혹은 주석이 SCO 내에서 발생한 위치
GetValue, SetValue
미니주석) 보통 SCO가 여러개의 HTML 파일로 이루어지니까요.. 그 해당 HTML 파일의 위치가 저장된다고 보시면 됩니다.
cmi.comments_from_learner.n.timestamp
학습자가 작성한 설명 혹은 주석이 생성되거나 최근에 수정된 날짜와 시각.
GetValue, SetValue
미니주석) SCORM 2004 TimeStamp의 날짜 형식은 2007-03-28T11:25:30 와 같습니다.
3. Comments From LMS
LMS 즉, 시스템이 보내주는 설명 혹은 주석을 의미합니다.
cmi.comments_from_lms._children
cmi.comments_from_lms에서 지원되는 자식 엘리먼트의 리스트를 나타냄.
다시 말하면 cmi.comments_from_lms의 자식으로 comment, location, timestamp가 올수 있다는 것을 알려주는 것입니다.
GetValue
미니주석) cmi.comments_from_lms의 경우, 모든 하위 엘리먼트에 대해 SetValue가 존재하지 않습니다.
시스템에서 값을 보내주는 것이기 때문에 콘텐츠 내부에서 SetValue를 호출해 저장할 필요가 없는 것이죠~~
cmi.comments_from_lms._count
LMS에서 작성된 설명 혹은 주석(comment)의 수.
GetValue
cmi.comments_from_lms.n.comment
LMS에서 작성된 n번째의 설명 혹은 주석 (comment).
GetValue
cmi.comments_from_lms.n.location
LMS에서 작성된 설명 혹은 주석이 SCO 내에서 발생한 위치
GetValue
cmi.comments_from_lms.n.timestamp
LMS에서 작성된 설명 혹은 주석이 생성되거나 최근에 수정된 날짜와 시각.
GetValue
4. Completion Status
학습완료 여부를 나타냅니다. 진도체크에서 가장 중요하게 활용되죠..
cmi.completion_status
학습자가 SCO의 학습을 모두 완료했는지 여부를 나타냄.
GetValue, SetValue, Sequencing impacts
미니주석) cmi.completion_status의 상태값은 다음 중 하나를 가지게 됩니다.
"completed" : SCO의 학습이 모두 완료된 상태. 학습완료..
"incomplete" : SCO의 학습은 시작했으나 아직 완료되지 않은 상태. 학습중..
"not attempted" : 아직 SCO의 학습이 시작되지 않은 상태. 미학습..
"unknown" : 상태값이 확정되지 않은 상태.. - 시퀀싱을 적용할 때 나타날 수 있음..
참고로 시퀀싱에 의해 학습여부 상태를 결정할 수 있습니다.
이때 사용하는 변수는 Completion Threshold, Progress Measure, Completion Status입니다.
자세한 조건은 역시 스펙을 참고하세요~~
5. Completion Threshold
SCO의 완료 여부, 즉 cmi.competion_status 값을 결정할 때 사용되는 값입니다.
cmi.completion_threshold
SCO의 완료여부를 결정하는데 사용하는 0.0~1.0 사이의 값.
GetValue
미니주석) SCO 완료 여부를 결정하는데 사용하면서 SetValue가 없으면 값을 어디에서 설정하게 될까요?
정답은 바로 imsmanifest.xml 파일입니다.. 즉, 콘텐츠를 생성하면서 넣어두는 것이죠..
그럼 SCO의 완료 여부를 결정하는 조건이 스펙에 다양하게 나와있지만.. 기본적인 규칙은..
Progress Measure 값이 Competion Threshold보다 크면 "completed", 학습완료입니다~
6. Credit
Credit이라는 단어는 여러 가지 뜻을 가지고 있죠..
여기에서는 학점 이수.. 이런 뜻으로 보시면 됩니다.
cmi.credit
학점 이수 과정 여부를 지정함.
GetValue
다음 값 중의 하나를 가지면 기본값은 "credit"입니다.
"credit" : 학점 이수 과정
"no-credit" : 학점 이수 과정 아님..
미니주석) "credit"으로 설정되어 있을 때, 이 값을 사용하는 것은 아래의 cmi.success_status에서입니다.
cmi.completion_status가 아니구요..
7. Entry
cmi.entry
학습자가 전에 SCO에 접속했었는지 여부를 나타냄.
GetValue
"ab-inito" : 처음 SCO에 접근함
"resume" : 이전에 SCO에 접근한 적이 있음.
"" : 정보 없음
미니주석) 시퀀싱이 없던 SCORM 1.2에서는 이걸 이용해 북마크 기능을 구현하기도 했었습니다.
SCORM 2004에서는 주로 복습여부를 결정할 때 사용합니다.
즉, 복습할 때에는 학습추적 데이터에 반영하지 않아야 하는 경우에 resume으로 설정해서 활용합니다.
8. Exit
cmi.exit
학습자가 SCO를 종료할 때 어떤 상황이었는지를 설정함.
SetValue, Sequencing impacts
"time-out" : max_time_allowed로 지정된 제한 시간을 넘겨서 종료할 때.
"suspend" : 일시정지 버튼을 통해 종료할 때.
"logout" : 로그아웃을 통해 종료할 때.
"normal" : 정상적으로 SCO를 종료할 때.
"" : 종료 조건이 정의되지 않았을 때.
미니주석) 종료하는 방식에 따라 시퀀싱에 영향을 주게 됩니다. 또한, 이 값은 읽을 수는 없고 SetValue를 통해 쓸 수만 있습니다.
9. Interactions
SCO에서 LMS로 전달되는 학습자의 상호작용(interaction)을 정의해 놓은 것이라고 합니다.
제 생각에는 질문(interaction)을 올리구요..
질문에 대한 학습목표(objective)를 설정하고, 정답(correct_resposne)를 결정합니다.
그리고 이에 대한 학습자의 답변(learner_response)를 받아서 결과(result)를 저장하고, 비중(weight)에 따라 학습성적에 반영할 수도 있는 구조인 듯 합니다.
하지만, 제대로 사용해 본적은 없어 정확한 용도를 설명하기가 애매하네요.. 일단 정의를 잘 살펴보시고 유추하시기 바랍니다.
cmi.interactions._children
cmi.interactions 데이터 모델에서 지원하는 엘리먼트 리스트.
GetValue
cmi.interactions._count
학습자 상호작용(interaction)의 전체 개수.
GetValue
cmi.interactions.n.id
n번째 interaction의 고유한 아이디
GetValue, SetValue
cmi.interactions.n.type
n번째 interaction의 타입
GetValue, SetValue
타입은 다음중 하나입니다.
"true-false", "choice", "fill-in", "long-fill-in", "likert", "matching", "performance", "sequencing", "numeric", "other"
cmi.interactions.n.objectives._count
n번째 interaction에 포함된 학습목표(objectives)의 개수.
GetValue
cmi.interactions.n.objectives.n.id
n번째 interaction에 포함된 n번째 학습목표의 고유한 아이디
GetValue, SetValue
cmi.interactions.n.timestamp
n번째 interaction을 사용할 수 있도록 생성한 시간.
GetValue, SetValue
cmi.interactions.n.correct_responses._count
n번째 interaction에 대한 LMS에서 선정한 정답의 개수.
GetValue
cmi.interactions.n.correct_responses.n.pattern
n번째 interaction에 대한 LMS가 선정한 정답 내용. cmi.interactions.n.type에 의해 내용이 결정됨.
GetValue, SetValue
cmi.interactions.n.weighting
n번째 interaction의 비중. SCO에서의 점수(score) 계산에 사용될 수 있다고 합니다.
GetValue, SetValue
cmi.interactions.n.learner_response
n번째 interaction에 대한 학습자의 응답.
GetValue, SetValue
cmi.interactions.n.result
n번째 interaction에 대한 결과
GetValue, SetValue
다음과 같은 값들이 가능합니다.
"correct", "incorrect", "unanticipated", "neutral", 실수값
cmi.interactions.n.latency
학습자가 interaction에 대해 응답을 할 때까지의 시간.
GetValue, SetValue
cmi.interactions.n.description
n번째 interaction에 대한 간단한 설명
GetValue, SetValue
10. Launch Data
cmi.launch_data
SCO를 초기화할 때 사용할 수 있는 데이터.
GetValue
미니주석) imsmanifest.xml을 만들때, 입력하는 <adlcp:dataFromLMS>의 값이 이걸 통해서 SCO로 전달되었던 것 같습니다.
정확히 기억이 안나내요.. -,- 이제는 이러닝을 떠난 상태라.. 쩝~~ (조금이라도 기억이 남아 있을 때.. 빨랑 정리해 둬야지.. ^^)
한번에 다 정리하려니.. 너무 양이 많습니다~~ 쩝!!
나머지는 다음번에 정리해서 올려놓도록 하겠습니다.
그럼.. 좋은 하루 되세요~~ 2007. 3. 28 From 미니...
'XML Developer > SCORM' 카테고리의 다른 글
| 8. SCORM 콘텐츠 패키징 절차에 대한 미니 생각.. (0) | 2007/11/07 |
|---|---|
| 7. SCOM CMI 데이터 모델 두번째 (0) | 2007/04/11 |
| 6. SCOM CMI 데이터 모델 첫번째 (0) | 2007/03/28 |
| 5. SCORM RTE(Run-Time Environment) #2 (0) | 2007/03/21 |
| 4. SCORM RTE(Run-Time Environment) #1 (0) | 2007/01/25 |
| 3. 콘텐츠 통합 모델 (Contents Aggregation Model) (0) | 2006/11/27 |
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 미니..
'XML Developer > SCORM' 카테고리의 다른 글
| 7. SCOM CMI 데이터 모델 두번째 (0) | 2007/04/11 |
|---|---|
| 6. SCOM CMI 데이터 모델 첫번째 (0) | 2007/03/28 |
| 5. SCORM RTE(Run-Time Environment) #2 (0) | 2007/03/21 |
| 4. SCORM RTE(Run-Time Environment) #1 (0) | 2007/01/25 |
| 3. 콘텐츠 통합 모델 (Contents Aggregation Model) (0) | 2006/11/27 |
| 2. SCORM 인증과 툴 활용 (0) | 2006/09/25 |


xml.zip

