RDF in Mozilla FAQ

  • 리비전 슬러그: RDF_in_Mozilla_FAQ
  • 리비전 제목: RDF in Mozilla FAQ
  • 리비전 아이디: 326723
  • 제작일시:
  • 만든이: ethertank
  • 현재 리비전인가요?
  • 댓글

리비전 내용

일반

어디에서부터 시작해야 하나요?

RDF 는 Mozilla 에서 크게 두가지 기능을 제공합니다. 첫번째가, 단순히 작은 데이터 저장 공간을 위한 크로스 플랫폼의 데이터베이스 (cross-platform database for small data stores) 역할이며 두번째가 더 중요한데 RDF 모델이 XUL 템플릿과 함께 사용되어 정보 표현을 위한 추상적인 "API" 를 제공하는 것입니다. RDF in Fifty Words or Less 문서는 Mozilla 에서 RDF 가 어떤 작업을 수행하는지를 손쉽게, 고 수준에서 살펴볼 수 있게 해 줍니다. RDF 백엔드 구조 문서는 Mozilla 의 RDF 구현이 동작하는 방식을 더욱 자세히 설명하며, 거기에 포함된 인터페이스들에 대한 간략한 개요를 살펴볼 수 있습니다.

Open Directory ("dmoz") 상의 어디에서 정보를 찾아야 하나요?

불행히도, 여기는 아닙니다! 음, 여기는 그저.. Open Directory 에 대한 정보는 http://www.dmoz.org/ 를 방문해 보기 바랍니다. Open Directory 의 데이터 셋은 (거대한) RDF/XML 덤프로 이용 가능합니다. 이것은 수천개의 웹 사이트를 더블린 코어(Dublin Core)의 메타데이터 어휘와 DMoz 분류법을 혼합하여 분류해 놓은 것 입니다. 더 자세한 정보는 DMoz 의 RDF 페이지를 살펴보시고, 거기에 사용된 데이터 형식에 관련된 업데이트 사항은 odp-rdf-announce 페이지를 살펴보기 바랍니다. ChefMoz 사이트(공동(collaborative) 음식점 가이드) 도 역시 RDF 페이지를 제공합니다.

만약 DMoz 나 ChefMoz 데이터와 관련된 문제점이 발생한다면 해당 프로젝트에 직접 연락하는 것이 좋습니다. 하지만 당신이 그 컨텐츠를 사용하여 어떤 작업을 하고 있다면 (즉, 원격 사이트에서 XUL UI 로 해당 컨텐츠를 로드하는 것처럼) mozilla-rdfRDF Interest Group 메일링 리스트에 알리는 것을 잊지 마십시오. 이들은 DMoz 데이터를 삭제하고 재처리하고 저장하는 툴에 대해서도 관심을 가지고 있을 것 입니다. ODP RDF 덤프를 사용하는 사이트에 대한 정보는ODP 데이터를 사용하는 사이트들 페이지를 보십시오.

데이터 소스(datasource)가 뭐죠?

RDF 는 일반적으로 2가지 관점으로 볼 수 있습니다: 하나는 노드와 호(arc)로 이루어진 그래프로 보는 관점이며 다른 하나는 논리적인 구문들(logical statements)로 이루어진 "수프"(soup) 로 보는 관점이다. 데이터 소스는 특정한 기준으로 그룹지어진 하위 그래프(subgraph) (혹은 다른 관점에서 본다면 구문들의 집합) 입니다. 예를 들면, "브라우저 북마크", "브라우저 전역 방문 기록 (global history)", "IMAP 메일 계정", "NNTP 뉴스 서버", "RDF/XML 파일" 등이 있습니다.

Mozilla 에서는 데이터 소스들은 복합 (composite) 데이터 소스 기능을 사용하여 통합(compose) 될 수 있습니다. 이것은 그래프를 오버레이(overlay) 시키는 것이나 구문의 집합들을 병합(merge)하는 것("microtheories")과 비슷합니다. 동일한 RDF 자원에 대한 구문은 혼용(intermingle)될 수 있습니다: 예를 들어 특정 웹사이트의 "최근 방문 시간"은 "브라우저 전역 방문 기록" 데이터 소스에서 얻을 수 있고, 해당 웹사이트로 가기 위한 "단축 키워드(shortcut keyword)"는 "브라우저 북마크" 데이터 소스에서 얻을 수 있습니다. 두 데이터 소스는 URL 을 통해 "웹사이트" 를 가리킵니다: 이것이 데이터 소스들이 효율적으로 "병합"될 수 있는 "핵심"(key)이 됩니다.

데이터 소스를 작성하는 방법에 대한 자세한 사항은 RDF 데이터 소스 How-To 문서를 참조하기 바랍니다.

Mozilla 는 어떻게 데이터 소스를 관리하나요?

RDF 서비스는 로드된 모든 데이터 소스의 테이블을 관리합니다. 이 테이블은 데이터 소스의 "URI" -RDF/XML 파일의 URL 이거나 내장된 데이터 소스를 가리키는 rdf: 로 시작하는 "특별한" URI - 를 키로 사용합니다.

데이터 소스는 RDF 서비스의 GetDataSource() 메소드를 통해 로드됩니다. URI 인수(argument)가 XML/RDF 파일의 URL 을 가리키는 경우에는 RDF 서비스는 RDF/XML 데이터 소스 를 생성하고 비동기적으로 이를 구문 분석(parse)합니다. 이 데이터 소스는 자신을 가리키는 마지막 참조가 해제(release)될 때까지 메모리 상에 "캐시"(cache) 됩니다.

만약 URI 인수가 내장 데이터 소스를 가리키는 경우에는, RDF 서비스는 XPCOM 컴포넌트 관리자 를 사용하여 "특별한" URI 와 잘 알려진(well-known) 접두어 @mozilla.org/rdf/datasource;1?name=</code> 를 이용해 ContractID 를 생성한 컴포넌트를 로드합니다.

예를 들어,

rdf:foo

인 경우에는 아래와 같은 컴포넌트가 로드됩니다:

@mozilla.org/rdf/datasource;1?name=foo

RDF/XML 데이터 소스와 마찬가지로 이러한 방식으로 생성된 데이터 소스도 RDF 서비스에 의해 마지막 참조가 해제될 때까지 메모리 상에 "캐시" 됩니다.

RDF/XML 파일에서 어떻게 데이터 소스를 생성하나요?

RDF 서비스GetDataSource() 메소드를 사용하여 RDF/XML 데이터 소스를 생성할 수 있습니다:

// RDF 서비스를 얻습니다.
var RDF =
  Components
  .classes["@mozilla.org/rdf/rdf-service;1"]
  .getService(Components.interfaces.nsIRDFService);
// ...그리고 여기에서 데이터 소스를 얻습니다. 당신의 웹 브라우저가
// 이 데이터 소스를 text/xml (추천) 혹은 text/rdf로 다루는지 확인하십시오!
var ds = RDF.GetDataSource("http://www.mozilla.org/some-rdf-file.rdf");
// ds 는 비동기적으로 로드되므로, 여기에 바로 assert 를 실행한다면
// 올바르게 동작하지 않을 것 입니다.

또다른 방법으로는, 아래와 같이 XPCOM 컴포넌트 관리자를 사용하여 직접 생성하는 방법이 있습니다:

// XPCOM 컴포넌트 관리자를 사용하여 RDF/XML 데이터 소스 생성하기
var ds =
  Components
  .classes["@mozilla.org/rdf/datasource;1?name=xml-datasource"]
  .createInstance(Components.interfaces.nsIRDFDataSource);
// nsIRDFRemoteDataSource 인터페이스는 데이터 소스를 설정하기 위한 인터페이스들을 가지고 있습니다.
var remote =
   ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
// 당신의 웹 서버가 이것을 text/xml (추천) 혹은 text/rdf로 전송하는지 확인하십시오!
remote.Init("http://www.mozilla.org/some-rdf-file.rdf");
// 로드합니다! 이것은 비동기적으로 실행된다는 것을 명심하십시오.
// aBlocking 인수를 true 로 설정하면, 동기적으로 실행되게 설정할 수 있습니다.
// 하지만 이렇게 되면 UI 가 멈춰버리기 때문에 일반적으로는 좋지 않은 아이디어입니다!
remote.Refresh(false);
//  ds 는 비동기적으로 로드되므로, 여기에 바로 assert 를 실행한다면
// 올바르게 동작하지 않을 것 입니다.

만약 당신이 RDF/XML 파일을 강제로 동기적으로 로드하고 싶다면 "직접"(manually) 생성할 필요가 있습니다.

RDF/XML 데이터 소스를 어떻게 갱신(reload)하나요?

RDF/XML 데이터 소스 (혹은 nsIRDFRemoteDataSource 를 지원하는 어떠한 데이터 소스일지라도) 는 nsIRDFRemoteDataSourceRefresh() 메소드를 사용하여 강제로 갱신할 수 있습니다. Refresh() 메소드는 수행이 동기적("blocking)으로 이루어질지 비동기적("non-blocking")으로 이루어 질지를 나타내는 하나의 인수를 가집니다. 당신은 정말로 그렇게 해야만 할 필요가 없다면 절대 동기적인 수행을 선택하지 않아야 합니다: 동기적으로 수행하도록 한다면 로드가 끝날때까지 모든 UI 가 동작하지 않을 것입니다!

RDF/XML 데이터 소스가 로드되었는지 어떻게 알 수 있나요?

nsIRDFRemoteDataSource 인터페이스를 사용하면, loaded 속성의 값으로 데이터 소스가 로드되었는지 즉시 알아볼 수 있습니다:

// RDF 서비스를 얻습니다
var RDF =
  Components
  .classes["@mozilla.org/rdf/rdf-service;1"]
  .getService(Components.interfaces.nsIRDFService);
// 데이터 소스를 얻습니다..
var ds = RDF.GetDataSource("http://www.mozilla.org/some-rdf-file.rdf");
// 이제 로드되었는지 살펴봅니다..
var remote =
  ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);

if (remote.loaded) {
  alert("the datasource was already loaded!");
}
else {
  alert("the datasource wasn't loaded, but it's loading now!");
}

만약 아직 데이터 소스가 로드되지 않았다고 가정합시다. (비동기적으로 로드됩니다). 위의 API 와 자바스크립트의 setTimeout() 함수를 사용하면, 주기적으로 loaded 속성을 체크하는 폴링 루프 를 만들 수 있을 것입니다. 하지만 여기는 문제가 있으며, 더 큰 문제는 로드가 실패 하는 경우를 인식하지 못한다는 것입니다! 예를 들어, 해당 URL 에 아무 데이터도 없는 경우에는 문제가 생길 것 입니다.

이를 위해 데이터 소스의 상태를 감시하기 위한 감시자(observer) 인터페이스 라는 것이 있습니다. 아래의 코드는 감시자 인터페이스의 사용법을 보여줍니다:

// RDF/XML 데이터 소스의 로드 과정을 감시할 객체입니다.
var Observer = {
  onBeginLoad: function(aSink)
    {},

  onInterrupt: function(aSink)
    {},

  onResume: function(aSink)
    {},

  onEndLoad: function(aSink)
    { alert("done!"); },

  onError: function(aSink, aStatus, aErrorMsg)
    { alert("error! " + aErrorMsg); }
};
// RDF 서비스를 얻습니다.
var RDF =
  Components
  .classes["@mozilla.org/rdf/rdf-service;1"]
  .getService(Components.interfaces.nsIRDFService);
// 데이터 소스를 얻습니다.
var ds = RDF.GetDataSource("http://www.mozilla.org/some-rdf-file.rdf");
// 이제 로드되었는지 살펴봅니다..
var remote =
  ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);

if (remote.loaded) {
  alert("the datasource was already loaded!");
}
else {
  alert("the datasource wasn't loaded, but it's loading now!");
  // RDF/XML 데이터 소스는 모두 nsIRDFXMLSink 입니다 (Is-a).
  var sink =
    ds.QueryInterface(Components.interfaces.nsIRDFXMLSink);
  // 데이터 소스(= 싱크)에 감시자 인터페이스를 지정합니다.
  sink.addXMLSinkObserver(Observer);
  // 이제 데이터 소스의 로드 상태에 따라 
  // 감시자의 메소드들이 호출(call-back)됩니다.
}

감시자 객체는 removeXMLSinkObserver 메소드가 호출되기 전까지는 계속 RDF/XML 데이터 소스와 연결(attach)되어 있을 것입니다.

데이터 소스 내의 정보는 어떻게 접근할 수 있나요?

nsIRDFDataSource 인터페이스는 데이터 소스 내의 정보에 접근하거나 검사할 수 있는 방법을 제공합니다.

  • boolean HasAssertion(aSource, aProperty, aTarget, aTruthValue).
    이 메소드는 데이터 소스 내에 명시된 튜플이 존재하는지 검사합니다.
  • nsIRDFNode GetTarget(aSource, aProperty, aTruthValue).
  • nsISimpleEnumerator GetTargets(aSource, aProperty, aTruthValue).
  • nsIRDFResource GetSource(aProperty, aTarget, aTruthValue).
  • nsISimpleEnumerator GetSoruces(aProperty, aTarget, aTruthValue).
  • nsISimpleEnumerator ArcLabelsIn(aTarget).
  • nsISimpleEnumerator ArcLabelsOut(aSource).

RDF 컨테이너 내에 포함된 정보에 접근하기 위해서는 RDF 컨테이너 인터페이스를 사용할 수 있습니다.

데이터 소스 내의 정보를 어떻게 변경하나요?

데이터 소스의 변경 사항을 RDF/XML 자원에 다시 저장하려면 어떻게 하죠?

RDF/XML 데이터 소스는 QueryInterface() 메소드를 통해 nsIRDFRemoteDataSource 인터페이스를 얻을 수 있습니다. 이 인터페이스는 Flush() 메소드를 가지고 있는데, 이 메소드는 데이터 소스가 로드될 때 사용된 URL 이 가리키는 데이터 소스에 변경 사항을 다시 기록하려고 시도할 것입니다. 이것은 사용된 프로토콜에 따라 각기 다른 메커니즘을 사용합니다. (즉, file: 로 시작하는 URL 이라면 그저 파일에 기록하고, http: 로 시작하는 URL 이라면 HTTP-POST 요청을 보낼 것입니다.) Flush() 메소드는 오직 데이터 소스의 내용이 변경된 경우에만 기록합니다.

여러 개의 데이터 소스를 하나로 합쳐서 보려면 어떻게 해야 하나요?

내장(built-in) 데이터 소스에 접근하려면 어떻게 하나요?

내장 데이터 소스nsIRDFDataSource 인터페이스를 구현한 로컬에 인스톨 된 컴포넌트를 말합니다. 예를 들면 북마크 서비스와 같은 것이 있습니다. 먼저, 여기를 보고 당신이 내장 데이터 소스에 접근하도록 허용 되었는지를 체크해 보십시오. "인증되지 않은"(untrusted) XUL 와 JS 로 부터 내장 데이터 소스에 접근에 접근하는 것을 차단하는 여러가지 보안 사항이 있습니다.

내장 데이터 소스는 단지 XPCOM 컴포넌트 이기 때문에, 당신은 XPConnect 컴포넌트 관리자를 사용하여 직접 객체를 생성(instantiate)할 수 있습니다.

// 북마크 서비스를 얻기 위해 컴포넌트 관리자를 사용합니다.
var bookmarks =
  Components.
  classes["@mozilla.org/rdf/datasource;1?name=bookmarks"].
  getService(Components.interfaces.nsIRDFDataSource);

// 이제 관련된 작업을 수행합니다..
if (bookmarks.HasAssertion(
     RDF.GetResource("http://home.netscape.com/NC-rdf#BookmarksRoot"),
     RDF.GetResource("http://home.netscape.com/NC-rdf#child"),
     RDF.GetResource("http://home.netscape.com/NC-rdf#PersonalToolbarFolder"),
     true) {
  // ...
}

또다른 방법으로는, 특정 데이터 소스는 "특별한" RDF 와 관련된 ContractID 를 가지므로 nsIRDFSerivceGetDataSource() 메소드를 이용하거나 XUL 템플릿의 datasources 속성을 이용하여 손쉽게 데이터 소스 객체를 생성할 수 있습니다. 이러한 ContractID 는 다음과 같은 형식으로 표현됩니다:

@mozilla.org/rdf/datasource;1?name=name

ContractID 는 GetDataSource() 메소드나 rdf:name 형식의 약어를 사용하여 datasources 속성에 접근할 수 있습니다. 예를 들어, 다음의 XUL 코드는 XUL 템플릿에 북마크 서비스를 데이터 소스로 추가하는 방법을 보여 줍니다.

<tree datasources="rdf:bookmarks">
  ...
</tree>

RDF "컨테이너"를 어떻게 사용하나요?

RDF "컨테이너"(예를 들어, <rdf:Seq>)를 사용하기 위해서는 아래의 ContractID 를 이용하여 nsIRDFContainerUtils 객체를 서비스로 생성해야 합니다:

@mozilla.org/rdf/container-utils;1

이 서비스를 이용하면, IsSeq(), IsBag(), IsAlt() 등의 메소드를 사용하여 특정 객체가 RDF 컨테이너인지 검사할 수 있습니다. 특정 자원이 RDF 컨테이너가 아니라면 MakeSeq(), MakeBag(), MakeAlt() 등의 메소드를 사용하여 해당 자원을 RDF 컨테이너로 만들 수 있습니다. 이 메소드들은 이미 작성된 컨테이너용 연산들을 가지고 있는 nsIRDFContainer 객체를 반환합니다.

또다른 방법으로는, 당신이 사용하는 데이터 소스가 이미 RDF 컨테이너 객체를 가지고 있는 경우, 다음의 ContractID 를 통해 nsIRDFContainer 객체를 생성할 수 있습니다:

@mozilla.org/rdf/container;1

그리고 데이터 소스를 인수로 Init() 메소드를 호출해야 합니다. 이 메소드는 해당 자원이 컨테이너 객체가 아닌 경우에는 실패할 수 있다는 것을 주의하십시오.

XUL 템플릿

XUL 문서의 원소(element) 상에 datsources 속성을 지정함으로써 XUL 템플릿을 생성할 수 있습니다.

XUL 템플릿은 두가지 형식("form")으로 작성할 수 있습니다. 첫번째는 단순 형식("simple form")으로 현재 Mozilla 코드베이스 상에서 가장 일반적으로 쓰이는 형식입니다. 또 하나는 확장 형식("extended form")으로 RDF 그래프에 대해 복잡한 패턴 매칭을 수행할 수 있습니다. XUL:템플릿 가이드 문서를 참조하십시오. (이 문서는 궁극적으로 확장 형식의 템플릿을 설명하려는 목적으로 작성되었기 때문에 매우 복잡하게 구성되어 있습니다. -- 따라서 많은 정보를 표현하기 위해 복잡하게 보일지라도 개념적으로는 더 이해하기 쉬운 방법으로 구성하였습니다 -- 그리고 단순 형식은 확장 형식을 단축해서 사용하는 형태로 설명합니다.)

XUL 템플릿을 사용해서 무엇을 빌드할 수 있나요?

당신은 XUL 템플릿을 사용해서 어떠한 종류의 컨텐츠도 빌드할 수 있습니다. 이를 위해 <rule> 내의 <action> 에 속한 태그(HTML 태그나 임의의 XML 태그도 가능)들을 사용할 수 있습니다.

언제 XUL 템플릿을 사용해야 하나요?

RDF 와 XUL 템플릿을 사용하는 또다른 방법으로는 W3C DOM API 를 이용하여 XUL (혹은 HTML) 컨텐츠 모델을 구성하고 조작하는 방법이 있습니다. 하지만 그렇게 하는 것은 불편할 때가 많습니다:

  1. 데이터에 대한 "뷰"가 여러 개인 경우. 예를 들면, Mozilla mail/news 는 툴바나, 여러 메뉴 내의 "폴더 팬(pane)", 혹은 몇몇 다이얼로그 창에서 폴더 구조를 표시합니다. 이 경우 이러한 <메뉴 버튼>, <메뉴>, <트리> 컨텐츠 모델을 위한 DOM 트리를 JS (혹은 C++) 로 작성하는 것 보다, 각 컨텐츠 모델을 위한 (세가지의) 간략한 룰셋으로 작성할 수 있습니다.
  2. 데이터가 변화하는 경우. 예를 들어 메일이나 뉴스의 사용자는 IMAP 폴더를 추가하거나 삭제할 수 있습니다. (이로 인해 컨텐츠 모델을 작성하는 작업은 매우 복잡해 집니다!) XUL 템플릿 빌더는 룰을 사용하여 사용자에 의한 모든 컨텐츠 모델들의 변화를 자동적으로 유지합니다.

이 기능을 사용하기 위해서는 당신이 필요로 하는 모든 정보는 RDF 데이터 소스 API 를 이용하여 표현되거나, 내장 메모리 데이터 소스를 사용하거나, RDF/XML 을 사용하여 저장하거나, nsIRDFDataSource 를 (아마도 JavaScript 를 이용하여) 직접 구현하여야 합니다.

"datasources=" 이라고 명시한 경우에는 무엇이 로드되나요?

템플릿의 "루트" 원소의 datasources 속성은 로드할 (공백 문자로 구분된) 데이터 소스 URI 들의 목록을 나타냅니다. 여기서 "데이터 소스 URI" 라는 것은 다음의 둘 중 하나가 됩니다:

  • 로컬에 설치된 컴포넌트를 가리키는 축약형 ContractID. 단지rdf:name 라고 명시한다면, 템플릿 로더는 @mozilla.org/rdf/datasource;1?name=name 라는 ContractID 를 이용하여 XPCOM 컴포넌트를 로드하게 됩니다.
  • RDF/XML 파일의 URL. 예를 들면 아래와 같은 것들이 있습니다.
    file:///tmp/foo.rdf
    chrome://mycomponent/content/component-data.rdf
    http://www.mysite.com/generate-rdf.cgi
    ftp://ftp.somewhere.org/toc.rdf
    

    로드 작업은 비동기적으로 수행되며, 템플릿 빌더는 RDF/XML 파일을 받는 즉시 컨텐츠를 생성합니다.

두 경우 모두, 데이터 소스는 nsIRDFServiceGetDataSource() 메소드를 사용하여 로드되며, 이들은 같은 방법으로 로드된 다른 데이터 소스와 마찬가지로 관리됩니다.

XUL의 RDF/XML을 위한 보안 모델은 무엇인가요?

"인증된" URL(현재는 chrome:로 시작하는 모든 URL)로 부터 로드된 XUL은 XUL 템플릿의 datasources 속성에 지정된 어떠한 데이터 소스 URI라도 지정할 수 있습니다.

"인증되지 않은" URL로 부터 로드된 XUL은 XUL 문서가 있던 동일한 (Java에서 말하는 의미의) 코드베이스 에 있는 RDF/XML 문서만을 지정할 수 있습니다. 인증되지 않은 XUL에서 "특별한" (즉, rdf: 로 시작하는) 데이터 소스를 로드할 수는 없습니다.

XUL 템플릿에 어떻게 데이터 소스를 추가하나요?

XUL 템플릿을 생성할 때 datasources 속성을 통해 "암시적으로" 데이터 소스를 명시하는 방법이 가능하지만, XUL이 로드될 때 까지 어떤 데이터 소스를 로드해야 할지 결정할 수 없는 경우도 있을 것입니다. 예를 들어, 당신의 XUL이 onload 핸들러에서 표시할 데이터 소스를 결정하는 경우나 특정한 사용자의 액션에 반응하여 데이터 소스를 추가해야 하는 경우 등이 있습니다.

다음은 이러한 동작을 하는 간단한 예제입니다. 아래와 같은 XUL이 있다고 해 봅시다.

<window xmlns="http://www.mozilla.org/keymaster/gat...re.is.only.xul">
  ...
  <tree id="my-tree" datasources="rdf:null">
    ...
  </tree>
  ...
</window>

이제 어떤 식으로든 (즉, 이러한 방식 중의 하나로) 데이터 소스를 얻었다고 가정할 때, 다음의 코드는 이 데이터 소스를 템플릿에 추가 하는 방법을 보여줍니다. 템플릿은 새로 추가된 데이터 소스의 컨텐츠를 기반으로 자신을 재생성(rebuild)해야 합니다.

var ds = /* 어떤 식으로든 얻었다고 가정합니다! */;
// 'my-tree'에 대한 DOM 원소를 얻습니다.
var tree = document.getElementById('my-tree');
// 거기에 데이터 소스를 추가합니다.
tree.database.AddDataSource(ds);
// 강제 재생성하도록 직접 rebuild() 메소드를 호출합니다.
tree.builder.rebuild();

datasources 속성을 가진 XUL 원소는 자동으로 database 속성과 builder 속성을 가지게 됩니다. database 속성은 템플릿에서 생성된 데이터 소스를 포함하는 nsIRDFCompositeDataSource 객체를 참조합니다.

builder 속성은 템플릿 컨텐츠의 상태를 유지하는 "builder" 인 nsIXULTemplateBuilder 객체를 참조합니다.

참고! rdf:null 데이터 소스: 이것은 특별한 데이터 소스로서 아직은 데이터 소스가 없지만 나중에 추가할 것임을 알려주는 역할을 합니다. 이 데이터 소스를 지정하면 database 속성과 builder 속성이 생기게 되지만 database 속성은 아무 것도 없는 채로 남아있습니다.

DOM API를 이용하여 XUL 템플릿 문서를 다룰 수 있나요?

네, 가능합니다. 당신은 룰을 추가 및 삭제하거나 룰의 컨디션이나 컨텐츠를 변경할 수 있습니다. 사실, W3C DOM API를 이용하여 템플릿에 대한 모든 것들을 변경할 수 있습니다.

한가지 주의할 사항은, 이렇게 변경한 내용이 적용되도록 (XUL 템플릿에 데이터 소스를 추가할 때와 마찬가지로) rebuild() 메소드를 반드시 호출해야 한다는 것입니다.

템플릿에 일반 텍스트를 어떻게 삽입하나요?

템플릿 내에 일반 텍스트(plaintext)를 삽입하기 위해서는 <text> 원소를 이용합니다.

<template>
  <rule>
    <conditions>...</condition>
    <bindings>...</bindings>
    <action>
      <text value="?some-variable" />
    </action>
  </rule>
</template>

위의 템플릿은 여러 개의 텍스트 노드를 가지는(runs?) 컨텐츠 모델을 생성할 것 입니다.

트러블슈팅

필드에서 얻은 트릭과 팁들을 소개합니다.

RDF/XML 파일이 로드되지 않아요

웹 서버로부터 RDF/XML 파일이 로드되지 않는 대부분의 이유는 MIME 타입이 잘못 설정되어 있는 경우입니다. 당신이 사용하는 서버가 RDF/XML 파일을 text/xml(추천) 이나 text/rdf(bogus) 형식으로 전달하는지 확인하십시오.

W3C의 RDF 코어 워킹 그룹은 application/rdf+xml 형식을 등록하였지만 아직 Mozilla 코드는 이를 인식하지 못한다는 것을 명심하십시오. (이에 대한 버그가 보고되어 있나요? -- danbri)

원격지에서 로드되는 XUL과 RDF에 대한 또다른 잠재적인 문제점은 Mozilla의 보안 규칙을 변경해야 한다는 것입니다(아래의 예제를 참조하세요). 만약 MIME 타입이 정확한데도, XUL이 RDF를 로드하지 않는다면 이 문제를 고려해 보아야 합니다.

RDF/XML 파일이 올바른지 검사하기 위해 rdfcatrdfpoll 유틸리티를 사용할 수 있습니다. 이 프로그램들은 Windows에서는 기본으로 설치되어 있으며, Linux에서는 configure --enable-tests 옵션을 주어 설치할 수 있습니다.

  • rdfcat url
    파라미터로 주어진 URL을 통해 RDF/XML 파일을 읽은 후, 콘솔 상에 "cat" 합니다. 이를 이용하여 당신이 작성한 RDF/XML이 Mozilla에서 올바르게 해석되는지 검사할 수 있습니다.
  • rdfpoll url {{ mediawiki.external('interval') }}
    RDF/XML 파일을 가리키는 URL을 파라미터로 취합니다. 그리고 선택적인(optional) poll interval 파라미터는 URL을 갱신(re-load)할 시간을 지정합니다. 각각의 로드 시 마다 RDF/XML 파일의 현재 내용과 이전의 내용과의 차이점을 나타내는 출력을 생성해 냅니다. 이것은 시간마다 새로 생성되는 RDF/XML 파일의 디버깅에 유용하게 사용됩니다.

이 두 프로그램은 로드와 실행 과정이 느립니다(하지만 결국은 실행됩니다). 이 프로그램들은 Mozilla 와 동일하게 XPCOM을 초기화하고 URL을 로드하고 처리하도록 Necko를 실행시킵니다.

AddDataSource 메소드를 호출해도 아무 것도 바뀌지 않아요.

템플릿 빌더는 자신의 database 속성에 대해 AddDataSource 혹은 RemoveDataSource 메소드를 호출해도 자동적으로 내용을 갱신하지 않습니다. 템플릿의 내용을 갱신하기 위해서는 반드시 elt.builder.rebuild() 메소드를 직접 호출해야 합니다.

그 이유는, database 내에 여러 개의 데이터 소스가 추가되는 경우 매번 갱신이 일어나지 않도록 하기 위함입니다.

예제

(실제로 동작하는) 예제를 어디서 찾을 수 있나요?

여기에서 몇가지 예제들을 찾아볼 수 있습니다. 이 중 몇가지는 사인된(signed) 스크립트를 포함하고 있고 HTTP에서 직접 실행시킬 수 있습니다.

(Mozilla의 라이브 RDF 피드(feed) 를 담당하는)duplicates.rdfduplicates.xul 도 살펴보기 바랍니다. 이것들을 실행시키기 위해서는 Mozilla의 보안 모델을 완화시켜야 합니다. 이를 위해 당신의 환경 설정(preference) 파일에 다음의 줄을 추가하십시오. (먼저 Mozilla를 종료시켜야 합니다. 그렇지 않으면 Mozilla가 종료될 때 당신의 환경 설정 파일을 덮어쓰게 될 것입니다.)

user_pref("signed.applets.codebase_principal_support", true);

Mozilla는 duplicates.xul 내의 스크립트에 XPConnect에 접근할 권한을 줄 것인지 물어볼 것입니다. '예'를 선택하십시오.

현재, Mozilla는 권한없이 RDF 인터페이스와 서비스에 접근하는 것을 허용하지 않습니다. 자세한 내용은 122846번 버그를 참조하십시오.

더 추가하고 싶은 예제가 있다면 그 링크를 danbri, mozilla-rdf 혹은 waterson에게 이메일로 보내기 바랍니다!

참고

  1. RDF 와 그에 관련된 기술들에 대해서는 W3C RDF 페이지와 Semantic Web 페이지를 살펴보기 바랍니다.

공헌

  • 2006-09-07 에 김남형이 번역함
  • 2002-07-02 에 danbri가 예제 부분을 추가함
  • 원격 XUL / 보안 정책에 대해 Myk Melez가 조언을 해 줌

저자: Chris Waterson

원본 문서 정보

리비전 소스

<h2 id=".EC.9D.BC.EB.B0.98" name=".EC.9D.BC.EB.B0.98">일반</h2>
<h3 id=".EC.96.B4.EB.94.94.EC.97.90.EC.84.9C.EB.B6.80.ED.84.B0_.EC.8B.9C.EC.9E.91.ED.95.B4.EC.95.BC_.ED.95.98.EB.82.98.EC.9A.94.3F" name=".EC.96.B4.EB.94.94.EC.97.90.EC.84.9C.EB.B6.80.ED.84.B0_.EC.8B.9C.EC.9E.91.ED.95.B4.EC.95.BC_.ED.95.98.EB.82.98.EC.9A.94.3F">어디에서부터 시작해야 하나요?</h3>
<p><a href="ko/RDF">RDF</a> 는 Mozilla 에서 크게 두가지 기능을 제공합니다. 첫번째가, 단순히 작은 데이터 저장 공간을 위한 크로스 플랫폼의 데이터베이스 (cross-platform database for small data stores) 역할이며 두번째가 더 중요한데 RDF 모델이 <a href="ko/XUL/Template_Guide">XUL 템플릿</a>과 함께 사용되어 정보 표현을 위한 추상적인 "API" 를 제공하는 것입니다. <a href="ko/RDF_in_Fifty_Words_or_Less">RDF in Fifty Words or Less</a> 문서는 Mozilla 에서 RDF 가 어떤 작업을 수행하는지를 손쉽게, 고 수준에서 살펴볼 수 있게 해 줍니다. <a href="ko/RDF_Back-end_Architecture_(external)">RDF 백엔드 구조</a> 문서는 Mozilla 의 RDF 구현이 동작하는 방식을 더욱 자세히 설명하며, 거기에 포함된 인터페이스들에 대한 간략한 개요를 살펴볼 수 있습니다.</p>
<h3 id="Open_Directory_.28.22dmoz.22.29_.EC.83.81.EC.9D.98_.EC.96.B4.EB.94.94.EC.97.90.EC.84.9C_.EC.A0.95.EB.B3.B4.EB.A5.BC_.EC.B0.BE.EC.95.84.EC.95.BC_.ED.95.98.EB.82.98.EC.9A.94.3F" name="Open_Directory_.28.22dmoz.22.29_.EC.83.81.EC.9D.98_.EC.96.B4.EB.94.94.EC.97.90.EC.84.9C_.EC.A0.95.EB.B3.B4.EB.A5.BC_.EC.B0.BE.EC.95.84.EC.95.BC_.ED.95.98.EB.82.98.EC.9A.94.3F">Open Directory ("dmoz") 상의 어디에서 정보를 찾아야 하나요?</h3>
<p>불행히도, <em>여기는 아닙니다</em>! 음, 여기는 그저.. Open Directory 에 대한 정보는 <a class="external" href="http://www.dmoz.org/" rel="freelink">http://www.dmoz.org/</a> 를 방문해 보기 바랍니다. Open Directory 의 데이터 셋은 (거대한) RDF/XML 덤프로 이용 가능합니다. 이것은 수천개의 웹 사이트를 <a class="external" href="http://www.dublincore.org/">더블린 코어</a>(Dublin Core)의 메타데이터 어휘와 DMoz 분류법을 혼합하여 분류해 놓은 것 입니다. 더 자세한 정보는 <a class="external" href="http://dmoz.org/rdf.html">DMoz 의 RDF 페이지</a>를 살펴보시고, 거기에 사용된 데이터 형식에 관련된 업데이트 사항은 <a class="external" href="http://groups.yahoo.com/group/odp-rdf-announce/">odp-rdf-announce</a> 페이지를 살펴보기 바랍니다. <a class="external" href="http://chefmoz.org/">ChefMoz</a> 사이트(공동(collaborative) 음식점 가이드) 도 역시 <a class="external" href="http://chefmoz.org/rdf.html">RDF 페이지</a>를 제공합니다.</p>
<p>만약 DMoz 나 ChefMoz 데이터와 관련된 문제점이 발생한다면 해당 프로젝트에 직접 연락하는 것이 좋습니다. 하지만 당신이 그 컨텐츠를 사용하여 어떤 작업을 하고 있다면 (즉, 원격 사이트에서 XUL UI 로 해당 컨텐츠를 로드하는 것처럼) <a class="link-mailto" href="mailto:mozilla-rdf@mozilla.org">mozilla-rdf</a> 와 <a class="link-mailto" href="mailto:www-rdf-interest@w3.org">RDF Interest Group</a> 메일링 리스트에 알리는 것을 잊지 마십시오. 이들은 DMoz 데이터를 삭제하고 재처리하고 저장하는 툴에 대해서도 관심을 가지고 있을 것 입니다. ODP RDF 덤프를 사용하는 사이트에 대한 정보는<a class="external" href="http://dmoz.org/Computers/Internet/Searching/Directories/Open_Directory_Project/Use_of_ODP_Data/">ODP 데이터를 사용하는 사이트들</a> 페이지를 보십시오.</p>
<h3 id=".EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.28datasource.29.EA.B0.80_.EB.AD.90.EC.A3.A0.3F" name=".EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.28datasource.29.EA.B0.80_.EB.AD.90.EC.A3.A0.3F">데이터 소스(datasource)가 뭐죠?</h3>
<p>RDF 는 일반적으로 2가지 관점으로 볼 수 있습니다: 하나는 노드와 호(arc)로 이루어진 그래프로 보는 관점이며 다른 하나는 논리적인 구문들(logical statements)로 이루어진 "수프"(soup) 로 보는 관점이다. 데이터 소스는 특정한 기준으로 그룹지어진 하위 그래프(subgraph) (혹은 다른 관점에서 본다면 구문들의 집합) 입니다. 예를 들면, "브라우저 북마크", "브라우저 전역 방문 기록 (global history)", "IMAP 메일 계정", "NNTP 뉴스 서버", "RDF/XML 파일" 등이 있습니다.</p>
<p>Mozilla 에서는 데이터 소스들은 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFCompositeDataSource.idl">복합 (composite) 데이터 소스</a> 기능을 사용하여 <em>통합</em>(compose) 될 수 있습니다. 이것은 그래프를 오버레이(overlay) 시키는 것이나 구문의 집합들을 병합(merge)하는 것("microtheories")과 비슷합니다. 동일한 RDF <em>자원</em>에 대한 구문은 혼용(intermingle)될 수 있습니다: 예를 들어 특정 웹사이트의 "최근 방문 시간"은 "브라우저 전역 방문 기록" 데이터 소스에서 얻을 수 있고, 해당 웹사이트로 가기 위한 "단축 키워드(shortcut keyword)"는 "브라우저 북마크" 데이터 소스에서 얻을 수 있습니다. 두 데이터 소스는 URL 을 통해 "웹사이트" 를 가리킵니다: 이것이 데이터 소스들이 효율적으로 "병합"될 수 있는 "핵심"(key)이 됩니다.</p>
<p>데이터 소스를 <em>작성</em>하는 방법에 대한 자세한 사항은 <a href="ko/RDF_Datasource_How-To">RDF 데이터 소스 How-To</a> 문서를 참조하기 바랍니다.</p>
<h3 id="Mozilla_.EB.8A.94_.EC.96.B4.EB.96.BB.EA.B2.8C_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.EA.B4.80.EB.A6.AC.ED.95.98.EB.82.98.EC.9A.94.3F" name="Mozilla_.EB.8A.94_.EC.96.B4.EB.96.BB.EA.B2.8C_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.EA.B4.80.EB.A6.AC.ED.95.98.EB.82.98.EC.9A.94.3F">Mozilla 는 어떻게 데이터 소스를 관리하나요?</h3>
<p><a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFService.idl">RDF 서비스</a>는 로드된 모든 데이터 소스의 테이블을 관리합니다. 이 테이블은 데이터 소스의 "URI" -RDF/XML 파일의 URL 이거나 내장된 데이터 소스를 가리키는 <code>rdf:</code> 로 시작하는 "특별한" URI - 를 키로 사용합니다.</p>
<p>데이터 소스는 RDF 서비스의 <code>GetDataSource()</code> 메소드를 통해 로드됩니다. URI 인수(argument)가 XML/RDF 파일의 URL 을 가리키는 경우에는 RDF 서비스는 <em>RDF/XML 데이터 소스</em> 를 생성하고 비동기적으로 이를 구문 분석(parse)합니다. 이 데이터 소스는 자신을 가리키는 마지막 참조가 해제(release)될 때까지 메모리 상에 "캐시"(cache) 됩니다.</p>
<p>만약 URI 인수가 내장 데이터 소스를 가리키는 경우에는, RDF 서비스는 XPCOM <em>컴포넌트 관리자</em> 를 사용하여 "특별한" URI 와 잘 알려진(well-known) 접두어 @mozilla.org/rdf/datasource;1?name=&lt;/code&gt; 를 이용해 <em>ContractID</em> 를 생성한 컴포넌트를 로드합니다.</p>
<p>예를 들어,</p>
<pre class="eval">
rdf:foo
</pre>
<p>인 경우에는 아래와 같은 컴포넌트가 로드됩니다:</p>
<pre class="eval">
@mozilla.org/rdf/datasource;1?name=foo
</pre>
<p>RDF/XML 데이터 소스와 마찬가지로 이러한 방식으로 생성된 데이터 소스도 RDF 서비스에 의해 마지막 참조가 해제될 때까지 메모리 상에 "캐시" 됩니다.</p>
<h3 id="RDF.2FXML_.ED.8C.8C.EC.9D.BC.EC.97.90.EC.84.9C_.EC.96.B4.EB.96.BB.EA.B2.8C_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.EC.83.9D.EC.84.B1.ED.95.98.EB.82.98.EC.9A.94.3F" name="RDF.2FXML_.ED.8C.8C.EC.9D.BC.EC.97.90.EC.84.9C_.EC.96.B4.EB.96.BB.EA.B2.8C_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.EC.83.9D.EC.84.B1.ED.95.98.EB.82.98.EC.9A.94.3F">RDF/XML 파일에서 어떻게 데이터 소스를 생성하나요?</h3>
<p><a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFService.idl">RDF 서비스</a>의 <code>GetDataSource()</code> 메소드를 사용하여 RDF/XML 데이터 소스를 생성할 수 있습니다:</p>
<pre class="eval">
<span class="highlightblue">// RDF 서비스를 얻습니다.</span>
var RDF =
  Components
  .classes["@mozilla.org/rdf/rdf-service;1"]
  .getService(Components.interfaces.nsIRDFService);
<span class="highlightblue">// ...그리고 여기에서 데이터 소스를 얻습니다. 당신의 웹 브라우저가
// 이 데이터 소스를 <b>text/xml</b> (추천) 혹은 <b>text/rdf</b>로 다루는지 확인하십시오!</span>
var ds = RDF.GetDataSource("<a class="external" href="http://www.mozilla.org/some-rdf-file.rdf" rel="freelink">http://www.mozilla.org/some-rdf-file.rdf</a>");
<span class="highlightblue">// <b>ds</b> 는 비동기적으로 로드되므로, 여기에 바로 assert 를 실행한다면
// 올바르게 동작하지 않을 것 입니다.</span>
</pre>
<p>또다른 방법으로는, 아래와 같이 XPCOM 컴포넌트 관리자를 사용하여 직접 생성하는 방법이 있습니다:</p>
<pre class="eval">
<span class="highlightblue">// XPCOM 컴포넌트 관리자를 사용하여 RDF/XML 데이터 소스 생성하기</span>
var ds =
  Components
  .classes["@mozilla.org/rdf/datasource;1?name=xml-datasource"]
  .createInstance(Components.interfaces.nsIRDFDataSource);
<span class="highlightblue">// <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFRemoteDataSource.idl">nsIRDFRemoteDataSource</a> 인터페이스는 데이터 소스를 설정하기 위한 인터페이스들을 가지고 있습니다.</span>
var remote =
   ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
<span class="highlightblue">// 당신의 웹 서버가 이것을 <b>text/xml</b> (추천) 혹은 <b>text/rdf</b>로 전송하는지 확인하십시오!</span>
remote.Init("<a class="external" href="http://www.mozilla.org/some-rdf-file.rdf" rel="freelink">http://www.mozilla.org/some-rdf-file.rdf</a>");
<span class="highlightblue">// 로드합니다! 이것은 비동기적으로 실행된다는 것을 명심하십시오.
// <b>aBlocking</b> 인수를 true 로 설정하면, 동기적으로 실행되게 설정할 수 있습니다.
// 하지만 이렇게 되면 UI 가 멈춰버리기 때문에 일반적으로는 좋지 않은 아이디어입니다!</span>
remote.Refresh(false);
<span class="highlightblue">//  <b>ds</b> 는 비동기적으로 로드되므로, 여기에 바로 assert 를 실행한다면
// 올바르게 동작하지 않을 것 입니다.</span>
</pre>
<p>만약 당신이 RDF/XML 파일을 강제로 동기적으로 로드하고 싶다면 "직접"(manually) 생성할 필요가 있습니다.</p>
<h3 id="RDF.2FXML_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.EC.96.B4.EB.96.BB.EA.B2.8C_.EA.B0.B1.EC.8B.A0.28reload.29.ED.95.98.EB.82.98.EC.9A.94.3F" name="RDF.2FXML_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.EC.96.B4.EB.96.BB.EA.B2.8C_.EA.B0.B1.EC.8B.A0.28reload.29.ED.95.98.EB.82.98.EC.9A.94.3F">RDF/XML 데이터 소스를 어떻게 갱신(reload)하나요?</h3>
<p>RDF/XML 데이터 소스 (혹은 <a class="external" href="http://lxr.mozilla.org/mozilla/source/source/rdf/base/idl/nsIRDFRemoteDataSource.idl"><code>nsIRDFRemoteDataSource</code></a> 를 지원하는 어떠한 데이터 소스일지라도) 는 <code>nsIRDFRemoteDataSource</code> 의 <code>Refresh()</code> 메소드를 사용하여 강제로 갱신할 수 있습니다. <code>Refresh()</code> 메소드는 수행이 동기적("blocking)으로 이루어질지 비동기적("non-blocking")으로 이루어 질지를 나타내는 하나의 인수를 가집니다. 당신은 <em>정말로</em> 그렇게 해야만 할 필요가 없다면 <em>절대</em> 동기적인 수행을 선택하지 않아야 합니다: 동기적으로 수행하도록 한다면 로드가 끝날때까지 모든 UI 가 동작하지 않을 것입니다!</p>
<h3 id="RDF.2FXML_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EA.B0.80_.EB.A1.9C.EB.93.9C.EB.90.98.EC.97.88.EB.8A.94.EC.A7.80_.EC.96.B4.EB.96.BB.EA.B2.8C_.EC.95.8C_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F" name="RDF.2FXML_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EA.B0.80_.EB.A1.9C.EB.93.9C.EB.90.98.EC.97.88.EB.8A.94.EC.A7.80_.EC.96.B4.EB.96.BB.EA.B2.8C_.EC.95.8C_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F">RDF/XML 데이터 소스가 로드되었는지 어떻게 알 수 있나요?</h3>
<p><a class="external" href="http://lxr.mozilla.org/mozilla/source/source/rdf/base/idl/nsIRDFRemoteDataSource.idl"><code>nsIRDFRemoteDataSource</code></a> 인터페이스를 사용하면, <code>loaded</code> 속성의 값으로 데이터 소스가 로드되었는지 즉시 알아볼 수 있습니다:</p>
<pre class="eval">
<span class="highlightblue">// RDF 서비스를 얻습니다</span>
var RDF =
  Components
  .classes["@mozilla.org/rdf/rdf-service;1"]
  .getService(Components.interfaces.nsIRDFService);
<span class="highlightblue">// 데이터 소스를 얻습니다..</span>
var ds = RDF.GetDataSource("<a class="external" href="http://www.mozilla.org/some-rdf-file.rdf" rel="freelink">http://www.mozilla.org/some-rdf-file.rdf</a>");
<span class="highlightblue">// 이제 로드되었는지 살펴봅니다..</span>
var remote =
  ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);

if (remote.loaded) {
  alert("the datasource was already loaded!");
}
else {
  alert("the datasource wasn't loaded, but it's loading now!");
}
</pre>
<p>만약 아직 데이터 소스가 로드되지 <em>않았다고</em> 가정합시다. (비동기적으로 로드됩니다). 위의 API 와 자바스크립트의 <code>setTimeout()</code> 함수를 사용하면, 주기적으로 <code>loaded</code> 속성을 체크하는 <em>폴링 루프</em> 를 만들 수 있을 것입니다. 하지만 여기는 문제가 있으며, 더 큰 문제는 로드가 <em>실패</em> 하는 경우를 인식하지 못한다는 것입니다! 예를 들어, 해당 URL 에 아무 데이터도 없는 경우에는 문제가 생길 것 입니다.</p>
<p>이를 위해 데이터 소스의 상태를 감시하기 위한 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFXMLSink.idl">감시자(observer) 인터페이스</a> 라는 것이 있습니다. 아래의 코드는 감시자 인터페이스의 사용법을 보여줍니다:</p>
<pre class="eval">
<span class="highlightblue">// RDF/XML 데이터 소스의 로드 과정을 감시할 객체입니다.</span>
var Observer = {
  onBeginLoad: function(aSink)
    {},

  onInterrupt: function(aSink)
    {},

  onResume: function(aSink)
    {},

  onEndLoad: function(aSink)
    { alert("done!"); },

  onError: function(aSink, aStatus, aErrorMsg)
    { alert("error! " + aErrorMsg); }
};
<span class="highlightblue">// RDF 서비스를 얻습니다.</span>
var RDF =
  Components
  .classes["@mozilla.org/rdf/rdf-service;1"]
  .getService(Components.interfaces.nsIRDFService);
<span class="highlightblue">// 데이터 소스를 얻습니다.</span>
var ds = RDF.GetDataSource("<a class="external" href="http://www.mozilla.org/some-rdf-file.rdf" rel="freelink">http://www.mozilla.org/some-rdf-file.rdf</a>");
<span class="highlightblue">// 이제 로드되었는지 살펴봅니다..</span>
var remote =
  ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);

if (remote.loaded) {
  alert("the datasource was already loaded!");
}
else {
  alert("the datasource wasn't loaded, but it's loading now!");
  <span class="highlightblue">// RDF/XML 데이터 소스는 모두 <b>nsIRDFXMLSink</b> 입니다 (Is-a).</span>
  var sink =
    ds.QueryInterface(Components.interfaces.nsIRDFXMLSink);
  <span class="highlightblue">// 데이터 소스(= 싱크)에 감시자 인터페이스를 지정합니다.</span>
  sink.addXMLSinkObserver(Observer);
  <span class="highlightblue">// 이제 데이터 소스의 로드 상태에 따라 
  // <b>감시자</b>의 메소드들이 호출(call-back)됩니다.</span>
}
</pre>
<p>감시자 객체는 <code>removeXMLSinkObserver</code> 메소드가 호출되기 전까지는 계속 RDF/XML 데이터 소스와 연결(attach)되어 있을 것입니다.</p>
<h3 id=".EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4_.EB.82.B4.EC.9D.98_.EC.A0.95.EB.B3.B4.EB.8A.94_.EC.96.B4.EB.96.BB.EA.B2.8C_.EC.A0.91.EA.B7.BC.ED.95.A0_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F" name=".EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4_.EB.82.B4.EC.9D.98_.EC.A0.95.EB.B3.B4.EB.8A.94_.EC.96.B4.EB.96.BB.EA.B2.8C_.EC.A0.91.EA.B7.BC.ED.95.A0_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F">데이터 소스 내의 정보는 어떻게 접근할 수 있나요?</h3>
<p><a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFDataSource.idl"><code>nsIRDFDataSource</code></a> 인터페이스는 데이터 소스 내의 정보에 접근하거나 검사할 수 있는 방법을 제공합니다.</p>
<ul>
  <li><code>boolean HasAssertion(aSource, aProperty, aTarget, aTruthValue)</code>.<br />
    이 메소드는 데이터 소스 내에 명시된 튜플이 존재하는지 검사합니다.</li>
  <li><code>nsIRDFNode GetTarget(aSource, aProperty, aTruthValue)</code>.</li>
  <li><code>nsISimpleEnumerator GetTargets(aSource, aProperty, aTruthValue)</code>.</li>
  <li><code>nsIRDFResource GetSource(aProperty, aTarget, aTruthValue)</code>.</li>
  <li><code>nsISimpleEnumerator GetSoruces(aProperty, aTarget, aTruthValue)</code>.</li>
  <li><code>nsISimpleEnumerator ArcLabelsIn(aTarget)</code>.</li>
  <li><code>nsISimpleEnumerator ArcLabelsOut(aSource)</code>.</li>
</ul>
<p>RDF <em>컨테이너</em> 내에 포함된 정보에 접근하기 위해서는 <a href="#How_do_I_manipulate_RDF_.22containers.22.3F">RDF 컨테이너</a> 인터페이스를 사용할 수 있습니다.</p>
<h3 id=".EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4_.EB.82.B4.EC.9D.98_.EC.A0.95.EB.B3.B4.EB.A5.BC_.EC.96.B4.EB.96.BB.EA.B2.8C_.EB.B3.80.EA.B2.BD.ED.95.98.EB.82.98.EC.9A.94.3F" name=".EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4_.EB.82.B4.EC.9D.98_.EC.A0.95.EB.B3.B4.EB.A5.BC_.EC.96.B4.EB.96.BB.EA.B2.8C_.EB.B3.80.EA.B2.BD.ED.95.98.EB.82.98.EC.9A.94.3F">데이터 소스 내의 정보를 어떻게 변경하나요?</h3>
<h3 id=".EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EC.9D.98_.EB.B3.80.EA.B2.BD_.EC.82.AC.ED.95.AD.EC.9D.84_RDF.2FXML_.EC.9E.90.EC.9B.90.EC.97.90_.EB.8B.A4.EC.8B.9C_.EC.A0.80.EC.9E.A5.ED.95.98.EB.A0.A4.EB.A9.B4_.EC.96.B4.EB.96.BB.EA.B2.8C_.ED.95.98.EC.A3.A0.3F" name=".EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EC.9D.98_.EB.B3.80.EA.B2.BD_.EC.82.AC.ED.95.AD.EC.9D.84_RDF.2FXML_.EC.9E.90.EC.9B.90.EC.97.90_.EB.8B.A4.EC.8B.9C_.EC.A0.80.EC.9E.A5.ED.95.98.EB.A0.A4.EB.A9.B4_.EC.96.B4.EB.96.BB.EA.B2.8C_.ED.95.98.EC.A3.A0.3F">데이터 소스의 변경 사항을 RDF/XML 자원에 다시 저장하려면 어떻게 하죠?</h3>
<p>RDF/XML 데이터 소스는 <code>QueryInterface()</code> 메소드를 통해 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFRemoteDataSource.idl"><code>nsIRDFRemoteDataSource</code></a> 인터페이스를 얻을 수 있습니다. 이 인터페이스는 <code>Flush()</code> 메소드를 가지고 있는데, 이 메소드는 데이터 소스가 로드될 때 사용된 URL 이 가리키는 데이터 소스에 변경 사항을 다시 기록하려고 시도할 것입니다. 이것은 사용된 프로토콜에 따라 각기 다른 메커니즘을 사용합니다. (즉, <code>file:</code> 로 시작하는 URL 이라면 그저 파일에 기록하고, <code>http:</code> 로 시작하는 URL 이라면 HTTP-POST 요청을 보낼 것입니다.) <code>Flush()</code> 메소드는 오직 데이터 소스의 내용이 변경된 경우에만 기록합니다.</p>
<h3 id=".EC.97.AC.EB.9F.AC_.EA.B0.9C.EC.9D.98_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.ED.95.98.EB.82.98.EB.A1.9C_.ED.95.A9.EC.B3.90.EC.84.9C_.EB.B3.B4.EB.A0.A4.EB.A9.B4_.EC.96.B4.EB.96.BB.EA.B2.8C_.ED.95.B4.EC.95.BC_.ED.95.98.EB.82.98.EC.9A.94.3F" name=".EC.97.AC.EB.9F.AC_.EA.B0.9C.EC.9D.98_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.ED.95.98.EB.82.98.EB.A1.9C_.ED.95.A9.EC.B3.90.EC.84.9C_.EB.B3.B4.EB.A0.A4.EB.A9.B4_.EC.96.B4.EB.96.BB.EA.B2.8C_.ED.95.B4.EC.95.BC_.ED.95.98.EB.82.98.EC.9A.94.3F">여러 개의 데이터 소스를 하나로 합쳐서 보려면 어떻게 해야 하나요?</h3>
<h3 id=".EB.82.B4.EC.9E.A5.28built-in.29_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EC.97.90_.EC.A0.91.EA.B7.BC.ED.95.98.EB.A0.A4.EB.A9.B4_.EC.96.B4.EB.96.BB.EA.B2.8C_.ED.95.98.EB.82.98.EC.9A.94.3F" name=".EB.82.B4.EC.9E.A5.28built-in.29_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EC.97.90_.EC.A0.91.EA.B7.BC.ED.95.98.EB.A0.A4.EB.A9.B4_.EC.96.B4.EB.96.BB.EA.B2.8C_.ED.95.98.EB.82.98.EC.9A.94.3F">내장(built-in) 데이터 소스에 접근하려면 어떻게 하나요?</h3>
<p><em>내장 데이터 소스</em> 은 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFDataSource.idl">nsIRDFDataSource</a> 인터페이스를 구현한 로컬에 인스톨 된 컴포넌트를 말합니다. 예를 들면 <a class="external" href="http://lxr.mozilla.org/mozilla/source/xpfe/components/bookmarks/src/nsBookmarksService.cpp">북마크 서비스</a>와 같은 것이 있습니다. 먼저, <a href="#What_is_the_security_model_for_RDF.2FXML_in_XUL.3F">여기</a>를 보고 당신이 내장 데이터 소스에 접근하도록 <em>허용</em> 되었는지를 체크해 보십시오. "인증되지 않은"(untrusted) XUL 와 JS 로 부터 내장 데이터 소스에 접근에 접근하는 것을 차단하는 여러가지 보안 사항이 있습니다.</p>
<p>내장 데이터 소스는 단지 XPCOM 컴포넌트 이기 때문에, 당신은 XPConnect 컴포넌트 관리자를 사용하여 직접 객체를 생성(instantiate)할 수 있습니다.</p>
<pre class="eval">
// 북마크 서비스를 얻기 위해 컴포넌트 관리자를 사용합니다.
<span class="highlightgreen">var bookmarks =
  Components.
  classes["@mozilla.org/rdf/datasource;1?name=bookmarks"].
  getService(Components.interfaces.nsIRDFDataSource);</span>

// 이제 관련된 작업을 수행합니다..
if (bookmarks.HasAssertion(
     RDF.GetResource("<a class="external" href="http://home.netscape.com/NC-rdf#BookmarksRoot" rel="freelink">http://home.netscape.com/NC-rdf#BookmarksRoot</a>"),
     RDF.GetResource("<a class="external" href="http://home.netscape.com/NC-rdf#child" rel="freelink">http://home.netscape.com/NC-rdf#child</a>"),
     RDF.GetResource("<a class="external" href="http://home.netscape.com/NC-rdf#PersonalToolbarFolder" rel="freelink">http://home.netscape.com/NC-rdf#PersonalToolbarFolder</a>"),
     true) {
  // ...
}
</pre>
<p>또다른 방법으로는, 특정 데이터 소스는 "특별한" RDF 와 관련된 ContractID 를 가지므로 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFService.idl"><code>nsIRDFSerivce</code></a> 의 <code>GetDataSource()</code> 메소드를 이용하거나 XUL 템플릿의 <code>datasources</code> 속성을 이용하여 손쉽게 데이터 소스 객체를 생성할 수 있습니다. 이러한 ContractID 는 다음과 같은 형식으로 표현됩니다:</p>
<pre class="eval">
@mozilla.org/rdf/datasource;1?name=<i>name</i>
</pre>
<p>ContractID 는 <code>GetDataSource()</code> 메소드나 <code>rdf:<i>name</i></code> 형식의 약어를 사용하여 <code>datasources</code> 속성에 접근할 수 있습니다. 예를 들어, 다음의 XUL 코드는 XUL 템플릿에 북마크 서비스를 데이터 소스로 추가하는 방법을 보여 줍니다.</p>
<pre class="eval">
&lt;tree datasources="rdf:bookmarks"&gt;
  ...
&lt;/tree&gt;
</pre>
<h3 id="RDF_.22.EC.BB.A8.ED.85.8C.EC.9D.B4.EB.84.88.22.EB.A5.BC_.EC.96.B4.EB.96.BB.EA.B2.8C_.EC.82.AC.EC.9A.A9.ED.95.98.EB.82.98.EC.9A.94.3F" name="RDF_.22.EC.BB.A8.ED.85.8C.EC.9D.B4.EB.84.88.22.EB.A5.BC_.EC.96.B4.EB.96.BB.EA.B2.8C_.EC.82.AC.EC.9A.A9.ED.95.98.EB.82.98.EC.9A.94.3F">RDF "컨테이너"를 어떻게 사용하나요?</h3>
<p>RDF "컨테이너"(예를 들어, <code>&lt;rdf:Seq&gt;</code>)를 사용하기 위해서는 아래의 ContractID 를 이용하여 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFContainerUtils.idl"><code>nsIRDFContainerUtils</code></a> 객체를 서비스로 생성해야 합니다:</p>
<pre class="eval">
@mozilla.org/rdf/container-utils;1
</pre>
<p>이 서비스를 이용하면, <code>IsSeq()</code>, <code>IsBag()</code>, <code>IsAlt()</code> 등의 메소드를 사용하여 특정 객체가 RDF 컨테이너인지 검사할 수 있습니다. 특정 자원이 RDF 컨테이너가 아니라면 <code>MakeSeq()</code>, <code>MakeBag()</code>, <code>MakeAlt()</code> 등의 메소드를 사용하여 해당 자원을 RDF 컨테이너로 만들 수 있습니다. 이 메소드들은 이미 작성된 컨테이너용 연산들을 가지고 있는 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFContainer.idl"><code>nsIRDFContainer</code></a> 객체를 반환합니다.</p>
<p>또다른 방법으로는, 당신이 사용하는 데이터 소스가 이미 RDF 컨테이너 객체를 가지고 있는 경우, 다음의 ContractID 를 통해 <code>nsIRDFContainer</code> 객체를 생성할 수 있습니다:</p>
<pre class="eval">
@mozilla.org/rdf/container;1
</pre>
<p>그리고 데이터 소스를 인수로 <code>Init()</code> 메소드를 호출해야 합니다. 이 메소드는 해당 자원이 컨테이너 객체가 아닌 경우에는 실패할 수 있다는 것을 주의하십시오.</p>
<h2 id="XUL_.ED.85.9C.ED.94.8C.EB.A6.BF" name="XUL_.ED.85.9C.ED.94.8C.EB.A6.BF">XUL 템플릿</h2>
<p>XUL 문서의 원소(element) 상에 <code>datsources</code> 속성을 지정함으로써 XUL 템플릿을 생성할 수 있습니다.</p>
<p>XUL 템플릿은 두가지 형식("form")으로 작성할 수 있습니다. 첫번째는 단순 형식("simple form")으로 현재 Mozilla 코드베이스 상에서 가장 일반적으로 쓰이는 형식입니다. 또 하나는 확장 형식("extended form")으로 RDF 그래프에 대해 복잡한 패턴 매칭을 수행할 수 있습니다. <a href="ko/XUL/Template_Guide">XUL:템플릿 가이드</a> 문서를 참조하십시오. (이 문서는 <em>궁극적으로</em> 확장 형식의 템플릿을 설명하려는 목적으로 작성되었기 때문에 매우 복잡하게 구성되어 있습니다. -- 따라서 많은 정보를 표현하기 위해 복잡하게 보일지라도 개념적으로는 더 이해하기 쉬운 방법으로 구성하였습니다 -- 그리고 단순 형식은 확장 형식을 단축해서 사용하는 형태로 설명합니다.)</p>
<h3 id="XUL_.ED.85.9C.ED.94.8C.EB.A6.BF.EC.9D.84_.EC.82.AC.EC.9A.A9.ED.95.B4.EC.84.9C_.EB.AC.B4.EC.97.87.EC.9D.84_.EB.B9.8C.EB.93.9C.ED.95.A0_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F" name="XUL_.ED.85.9C.ED.94.8C.EB.A6.BF.EC.9D.84_.EC.82.AC.EC.9A.A9.ED.95.B4.EC.84.9C_.EB.AC.B4.EC.97.87.EC.9D.84_.EB.B9.8C.EB.93.9C.ED.95.A0_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F">XUL 템플릿을 사용해서 무엇을 빌드할 수 있나요?</h3>
<p>당신은 XUL 템플릿을 사용해서 <em>어떠한</em> 종류의 컨텐츠도 빌드할 수 있습니다. 이를 위해 <code>&lt;rule&gt;</code> 내의 <code>&lt;action&gt;</code> 에 속한 태그(HTML 태그나 임의의 XML 태그도 가능)들을 사용할 수 있습니다.</p>
<h3 id=".EC.96.B8.EC.A0.9C_XUL_.ED.85.9C.ED.94.8C.EB.A6.BF.EC.9D.84_.EC.82.AC.EC.9A.A9.ED.95.B4.EC.95.BC_.ED.95.98.EB.82.98.EC.9A.94.3F" name=".EC.96.B8.EC.A0.9C_XUL_.ED.85.9C.ED.94.8C.EB.A6.BF.EC.9D.84_.EC.82.AC.EC.9A.A9.ED.95.B4.EC.95.BC_.ED.95.98.EB.82.98.EC.9A.94.3F">언제 XUL 템플릿을 사용해야 하나요?</h3>
<p>RDF 와 XUL 템플릿을 사용하는 또다른 방법으로는 <a class="external" href="http://www.w3.org/TR/REC-DOM-Level-1/">W3C DOM API</a> 를 이용하여 XUL (혹은 HTML) 컨텐츠 모델을 구성하고 조작하는 방법이 있습니다. 하지만 그렇게 하는 것은 불편할 때가 많습니다:</p>
<ol>
  <li><em>데이터에 대한 "뷰"가 여러 개인 경우</em>. 예를 들면, Mozilla mail/news 는 툴바나, 여러 메뉴 내의 "폴더 팬(pane)", 혹은 몇몇 다이얼로그 창에서 폴더 구조를 표시합니다. 이 경우 이러한 <code>&lt;메뉴 버튼&gt;</code>, <code>&lt;메뉴&gt;</code>, <code>&lt;트리&gt;</code> 컨텐츠 모델을 위한 DOM 트리를 JS (혹은 C++) 로 작성하는 것 보다, 각 컨텐츠 모델을 위한 (세가지의) 간략한 룰셋으로 작성할 수 있습니다.</li>
  <li><em>데이터가 변화하는 경우</em>. 예를 들어 메일이나 뉴스의 사용자는 IMAP 폴더를 추가하거나 삭제할 수 있습니다. (이로 인해 컨텐츠 모델을 작성하는 작업은 매우 복잡해 집니다!) XUL 템플릿 빌더는 룰을 사용하여 사용자에 의한 <em>모든</em> 컨텐츠 모델들의 변화를 자동적으로 유지합니다.</li>
</ol>
<p>이 기능을 사용하기 위해서는 당신이 필요로 하는 모든 정보는 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFDataSource.idl">RDF 데이터 소스 API</a> 를 이용하여 표현되거나, 내장 <em>메모리 데이터 소스</em>를 사용하거나, RDF/XML 을 사용하여 저장하거나, <code>nsIRDFDataSource</code> 를 (아마도 JavaScript 를 이용하여) 직접 구현하여야 합니다.</p>
<h3 id=".22datasources.3D.22_.EC.9D.B4.EB.9D.BC.EA.B3.A0_.EB.AA.85.EC.8B.9C.ED.95.9C_.EA.B2.BD.EC.9A.B0.EC.97.90.EB.8A.94_.EB.AC.B4.EC.97.87.EC.9D.B4_.EB.A1.9C.EB.93.9C.EB.90.98.EB.82.98.EC.9A.94.3F" name=".22datasources.3D.22_.EC.9D.B4.EB.9D.BC.EA.B3.A0_.EB.AA.85.EC.8B.9C.ED.95.9C_.EA.B2.BD.EC.9A.B0.EC.97.90.EB.8A.94_.EB.AC.B4.EC.97.87.EC.9D.B4_.EB.A1.9C.EB.93.9C.EB.90.98.EB.82.98.EC.9A.94.3F">"datasources=" 이라고 명시한 경우에는 무엇이 로드되나요?</h3>
<p>템플릿의 "루트" 원소의 <code>datasources</code> 속성은 로드할 (공백 문자로 구분된) <em>데이터 소스 URI</em> 들의 목록을 나타냅니다. 여기서 "데이터 소스 URI" 라는 것은 다음의 둘 중 하나가 됩니다:</p>
<ul>
  <li>로컬에 설치된 컴포넌트를 가리키는 축약형 ContractID. 단지<code>rdf:<i>name</i></code> 라고 명시한다면, 템플릿 로더는 <code>@mozilla.org/rdf/datasource;1?name=<i>name</i></code> 라는 ContractID 를 이용하여 XPCOM 컴포넌트를 로드하게 됩니다.</li>
  <li>RDF/XML 파일의 URL. 예를 들면 아래와 같은 것들이 있습니다.
    <pre>
file:///tmp/foo.rdf
chrome://mycomponent/content/component-data.rdf
http://www.mysite.com/generate-rdf.cgi
ftp://ftp.somewhere.org/toc.rdf
</pre>
    <p>로드 작업은 <em>비동기적으로</em> 수행되며, 템플릿 빌더는 RDF/XML 파일을 받는 즉시 컨텐츠를 생성합니다.</p>
  </li>
</ul>
<p>두 경우 모두, 데이터 소스는 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFService.idl"><code>nsIRDFService</code></a> 의 <code>GetDataSource()</code> 메소드를 사용하여 로드되며, 이들은 같은 방법으로 로드된 다른 데이터 소스와 마찬가지로 <a href="#How_does_Mozilla_manage_datasources.3F">관리</a>됩니다.</p>
<h3 id="XUL.EC.9D.98_RDF.2FXML.EC.9D.84_.EC.9C.84.ED.95.9C_.EB.B3.B4.EC.95.88_.EB.AA.A8.EB.8D.B8.EC.9D.80_.EB.AC.B4.EC.97.87.EC.9D.B8.EA.B0.80.EC.9A.94.3F" name="XUL.EC.9D.98_RDF.2FXML.EC.9D.84_.EC.9C.84.ED.95.9C_.EB.B3.B4.EC.95.88_.EB.AA.A8.EB.8D.B8.EC.9D.80_.EB.AC.B4.EC.97.87.EC.9D.B8.EA.B0.80.EC.9A.94.3F">XUL의 RDF/XML을 위한 보안 모델은 무엇인가요?</h3>
<p>"인증된" URL(현재는 <code>chrome:</code>로 시작하는 모든 URL)로 부터 로드된 XUL은 XUL 템플릿의 <code>datasources</code> 속성에 지정된 <em>어떠한</em> 데이터 소스 URI라도 지정할 수 있습니다.</p>
<p>"인증되지 않은" URL로 부터 로드된 XUL은 XUL 문서가 있던 동일한 (Java에서 말하는 의미의) <em>코드베이스</em> 에 있는 RDF/XML 문서만을 지정할 수 있습니다. 인증되지 않은 XUL에서 "특별한" (즉, <code>rdf:</code> 로 시작하는) 데이터 소스를 로드할 수는 없습니다.</p>
<h3 id="XUL_.ED.85.9C.ED.94.8C.EB.A6.BF.EC.97.90_.EC.96.B4.EB.96.BB.EA.B2.8C_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.EC.B6.94.EA.B0.80.ED.95.98.EB.82.98.EC.9A.94.3F" name="XUL_.ED.85.9C.ED.94.8C.EB.A6.BF.EC.97.90_.EC.96.B4.EB.96.BB.EA.B2.8C_.EB.8D.B0.EC.9D.B4.ED.84.B0_.EC.86.8C.EC.8A.A4.EB.A5.BC_.EC.B6.94.EA.B0.80.ED.95.98.EB.82.98.EC.9A.94.3F">XUL 템플릿에 어떻게 데이터 소스를 추가하나요?</h3>
<p>XUL 템플릿을 생성할 때 <code>datasources</code> 속성을 통해 "암시적으로" 데이터 소스를 명시하는 방법이 가능하지만, XUL이 로드될 때 <em>까지</em> 어떤 데이터 소스를 로드해야 할지 결정할 수 없는 경우도 있을 것입니다. 예를 들어, 당신의 XUL이 <code>onload</code> 핸들러에서 표시할 데이터 소스를 결정하는 경우나 특정한 사용자의 액션에 반응하여 데이터 소스를 추가해야 하는 경우 등이 있습니다.</p>
<p>다음은 이러한 동작을 하는 간단한 예제입니다. 아래와 같은 XUL이 있다고 해 봅시다.</p>
<pre class="eval">
&lt;window xmlns="<a class="external" href="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" rel="freelink">http://www.mozilla.org/keymaster/gat...re.is.only.xul</a>"&gt;
  ...
  <span class="highlightgreen">&lt;tree id="my-tree" datasources="rdf:null"&gt;
    ...
  &lt;/tree&gt;</span>
  ...
&lt;/window&gt;
</pre>
<p>이제 어떤 식으로든 (즉, <a href="#How_do_I_create_a_datasource_from_an_RDF.2FXML_file.3F">이러한</a> 방식 중의 하나로) 데이터 소스를 얻었다고 가정할 때, 다음의 코드는 이 데이터 소스를 템플릿에 <em>추가</em> 하는 방법을 보여줍니다. 템플릿은 새로 추가된 데이터 소스의 컨텐츠를 기반으로 자신을 재생성(rebuild)해야 합니다.</p>
<pre class="eval">
var ds = <span class="highlightblue">/* 어떤 식으로든 얻었다고 가정합니다! */</span>;
<span class="highlightblue">// 'my-tree'에 대한 DOM 원소를 얻습니다.</span>
var tree = document.getElementById('my-tree');
<span class="highlightblue">// 거기에 데이터 소스를 추가합니다.</span>
tree.database.AddDataSource(ds);
<span class="highlightblue">// 강제 재생성하도록 직접 rebuild() 메소드를 호출합니다.</span>
tree.builder.rebuild();
</pre>
<p><code>datasources</code> 속성을 가진 XUL 원소는 자동으로 <code>database</code> 속성과 <code>builder</code> 속성을 가지게 됩니다. <code>database</code> 속성은 템플릿에서 생성된 데이터 소스를 포함하는 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIRDFCompositeDataSource.idl"><code>nsIRDFCompositeDataSource</code></a> 객체를 참조합니다.</p>
<p><code>builder</code> 속성은 템플릿 컨텐츠의 상태를 유지하는 "builder" 인 <a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/base/idl/nsIXULTemplateBuilder.idl"><code>nsIXULTemplateBuilder</code></a> 객체를 참조합니다.</p>
<p><b>참고!</b> <code>rdf:null</code> 데이터 소스: 이것은 특별한 데이터 소스로서 아직은 데이터 소스가 없지만 나중에 추가할 것임을 알려주는 역할을 합니다. 이 데이터 소스를 지정하면 <code>database</code> 속성과 <code>builder</code> 속성이 생기게 되지만 <code>database</code> 속성은 아무 것도 없는 채로 남아있습니다.</p>
<h3 id="DOM_API.EB.A5.BC_.EC.9D.B4.EC.9A.A9.ED.95.98.EC.97.AC_XUL_.ED.85.9C.ED.94.8C.EB.A6.BF_.EB.AC.B8.EC.84.9C.EB.A5.BC_.EB.8B.A4.EB.A3.B0_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F" name="DOM_API.EB.A5.BC_.EC.9D.B4.EC.9A.A9.ED.95.98.EC.97.AC_XUL_.ED.85.9C.ED.94.8C.EB.A6.BF_.EB.AC.B8.EC.84.9C.EB.A5.BC_.EB.8B.A4.EB.A3.B0_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F">DOM API를 이용하여 XUL 템플릿 문서를 다룰 수 있나요?</h3>
<p>네, 가능합니다. 당신은 룰을 추가 및 삭제하거나 룰의 컨디션이나 컨텐츠를 변경할 수 있습니다. 사실, <a class="external" href="http://www.w3.org/TR/REC-DOM-Level-1/">W3C DOM API</a>를 이용하여 템플릿에 대한 <em>모든</em> 것들을 변경할 수 있습니다.</p>
<p>한가지 주의할 사항은, 이렇게 변경한 내용이 적용되도록 (XUL 템플릿에 <a href="#How_do_I_add_a_datasource_to_a_XUL_template.3F">데이터 소스를 추가</a>할 때와 마찬가지로) <code>rebuild()</code> 메소드를 반드시 호출해야 한다는 것입니다.</p>
<h3 id=".ED.85.9C.ED.94.8C.EB.A6.BF.EC.97.90_.EC.9D.BC.EB.B0.98_.ED.85.8D.EC.8A.A4.ED.8A.B8.EB.A5.BC_.EC.96.B4.EB.96.BB.EA.B2.8C_.EC.82.BD.EC.9E.85.ED.95.98.EB.82.98.EC.9A.94.3F" name=".ED.85.9C.ED.94.8C.EB.A6.BF.EC.97.90_.EC.9D.BC.EB.B0.98_.ED.85.8D.EC.8A.A4.ED.8A.B8.EB.A5.BC_.EC.96.B4.EB.96.BB.EA.B2.8C_.EC.82.BD.EC.9E.85.ED.95.98.EB.82.98.EC.9A.94.3F">템플릿에 일반 텍스트를 어떻게 삽입하나요?</h3>
<p>템플릿 내에 일반 텍스트(plaintext)를 삽입하기 위해서는 <code>&lt;text&gt;</code> 원소를 이용합니다.</p>
<pre class="eval">
&lt;template&gt;
  &lt;rule&gt;
    &lt;conditions&gt;...&lt;/condition&gt;
    &lt;bindings&gt;...&lt;/bindings&gt;
    &lt;action&gt;
      <span class="highlightgreen">&lt;text value="?some-variable" /&gt;</span>
    &lt;/action&gt;
  &lt;/rule&gt;
&lt;/template&gt;
</pre>
<p>위의 템플릿은 여러 개의 텍스트 노드를 가지는(runs?) 컨텐츠 모델을 생성할 것 입니다.</p>
<h2 id=".ED.8A.B8.EB.9F.AC.EB.B8.94.EC.8A.88.ED.8C.85" name=".ED.8A.B8.EB.9F.AC.EB.B8.94.EC.8A.88.ED.8C.85">트러블슈팅</h2>
<p>필드에서 얻은 트릭과 팁들을 소개합니다.</p>
<h3 id="RDF.2FXML_.ED.8C.8C.EC.9D.BC.EC.9D.B4_.EB.A1.9C.EB.93.9C.EB.90.98.EC.A7.80_.EC.95.8A.EC.95.84.EC.9A.94" name="RDF.2FXML_.ED.8C.8C.EC.9D.BC.EC.9D.B4_.EB.A1.9C.EB.93.9C.EB.90.98.EC.A7.80_.EC.95.8A.EC.95.84.EC.9A.94">RDF/XML 파일이 로드되지 않아요</h3>
<p>웹 서버로부터 RDF/XML 파일이 로드되지 않는 대부분의 이유는 MIME 타입이 잘못 설정되어 있는 경우입니다. 당신이 사용하는 서버가 RDF/XML 파일을 <code>text/xml</code>(추천) 이나 <code>text/rdf</code>(bogus) 형식으로 전달하는지 확인하십시오.</p>
<p>W3C의 RDF 코어 워킹 그룹은 application/rdf+xml 형식을 등록하였지만 아직 Mozilla 코드는 이를 인식하지 못한다는 것을 명심하십시오. (이에 대한 버그가 보고되어 있나요? -- <a class="link-mailto" href="mailto:danbri-mozilla@rdfweb.org">danbri</a>)</p>
<p>원격지에서 로드되는 XUL과 RDF에 대한 또다른 잠재적인 문제점은 Mozilla의 보안 규칙을 변경해야 한다는 것입니다(아래의 예제를 참조하세요). 만약 MIME 타입이 정확한데도, XUL이 RDF를 로드하지 않는다면 이 문제를 고려해 보아야 합니다.</p>
<p>RDF/XML 파일이 올바른지 검사하기 위해 <code>rdfcat</code>와 <code>rdfpoll</code> 유틸리티를 사용할 수 있습니다. 이 프로그램들은 Windows에서는 기본으로 설치되어 있으며, Linux에서는 <code>configure&nbsp;--enable-tests</code> 옵션을 주어 설치할 수 있습니다.</p>
<ul>
  <li><code><a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/tests/rdfcat/rdfcat.cpp">rdfcat</a> <i>url</i></code><br />
    파라미터로 주어진 URL을 통해 RDF/XML 파일을 읽은 후, 콘솔 상에 "cat" 합니다. 이를 이용하여 당신이 작성한 RDF/XML이 Mozilla에서 올바르게 해석되는지 검사할 수 있습니다.</li>
  <li><code><a class="external" href="http://lxr.mozilla.org/mozilla/source/rdf/tests/rdfpoll/rdfpoll.cpp">rdfpoll</a> <i>url</i> {{ mediawiki.external('<i>interval</i>') }}</code><br />
    RDF/XML 파일을 가리키는 URL을 파라미터로 취합니다. 그리고 선택적인(optional) <em>poll interval</em> 파라미터는 URL을 갱신(re-load)할 시간을 지정합니다. 각각의 로드 시 마다 RDF/XML 파일의 현재 내용과 이전의 내용과의 <em>차이점</em>을 나타내는 출력을 생성해 냅니다. 이것은 시간마다 새로 생성되는 RDF/XML 파일의 디버깅에 유용하게 사용됩니다.</li>
</ul>
<p>이 두 프로그램은 로드와 실행 과정이 느립니다(하지만 <em>결국은</em> 실행됩니다). 이 프로그램들은 Mozilla 와 동일하게 XPCOM을 초기화하고 URL을 로드하고 처리하도록 Necko를 실행시킵니다.</p>
<h3 id="AddDataSource_.EB.A9.94.EC.86.8C.EB.93.9C.EB.A5.BC_.ED.98.B8.EC.B6.9C.ED.95.B4.EB.8F.84_.EC.95.84.EB.AC.B4_.EA.B2.83.EB.8F.84_.EB.B0.94.EB.80.8C.EC.A7.80_.EC.95.8A.EC.95.84.EC.9A.94." name="AddDataSource_.EB.A9.94.EC.86.8C.EB.93.9C.EB.A5.BC_.ED.98.B8.EC.B6.9C.ED.95.B4.EB.8F.84_.EC.95.84.EB.AC.B4_.EA.B2.83.EB.8F.84_.EB.B0.94.EB.80.8C.EC.A7.80_.EC.95.8A.EC.95.84.EC.9A.94.">AddDataSource 메소드를 호출해도 아무 것도 바뀌지 않아요.</h3>
<p>템플릿 빌더는 자신의 <code>database</code> 속성에 대해 <code>AddDataSource</code> 혹은 <code>RemoveDataSource</code> 메소드를 호출해도 자동적으로 내용을 갱신하지 <em>않습니다</em>. 템플릿의 내용을 갱신하기 위해서는 반드시 <code><i>elt.</i>builder.rebuild()</code> 메소드를 직접 호출해야 합니다.</p>
<p>그 이유는, <code>database</code> 내에 여러 개의 데이터 소스가 추가되는 경우 매번 갱신이 일어나지 않도록 하기 위함입니다.</p>
<h2 id=".EC.98.88.EC.A0.9C" name=".EC.98.88.EC.A0.9C">예제</h2>
<h3 id=".28.EC.8B.A4.EC.A0.9C.EB.A1.9C_.EB.8F.99.EC.9E.91.ED.95.98.EB.8A.94.29_.EC.98.88.EC.A0.9C.EB.A5.BC_.EC.96.B4.EB.94.94.EC.84.9C_.EC.B0.BE.EC.9D.84_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F" name=".28.EC.8B.A4.EC.A0.9C.EB.A1.9C_.EB.8F.99.EC.9E.91.ED.95.98.EB.8A.94.29_.EC.98.88.EC.A0.9C.EB.A5.BC_.EC.96.B4.EB.94.94.EC.84.9C_.EC.B0.BE.EC.9D.84_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F">(실제로 동작하는) 예제를 어디서 찾을 수 있나요?</h3>
<p><a class="external" href="http://www.mozilla.org/rdf/doc/examples.html">여기</a>에서 몇가지 예제들을 찾아볼 수 있습니다. 이 중 몇가지는 사인된(signed) 스크립트를 포함하고 있고 HTTP에서 직접 실행시킬 수 있습니다.</p>
<p>(Mozilla의 라이브 RDF 피드(feed) 를 담당하는)<a class="link-https" href="https://bugzilla.mozilla.org/data/duplicates.rdf"><code>duplicates.rdf</code></a> 와 <a class="link-https" href="https://bugzilla.mozilla.org/duplicates.xul"><code>duplicates.xul</code></a> 도 살펴보기 바랍니다. 이것들을 실행시키기 위해서는 Mozilla의 <a href="ko/Bypassing_Security_Restrictions_and_Signing_Code">보안 모델</a>을 완화시켜야 합니다. 이를 위해 당신의 환경 설정(preference) 파일에 다음의 줄을 추가하십시오. (먼저 Mozilla를 종료시켜야 합니다. 그렇지 않으면 Mozilla가 종료될 때 당신의 환경 설정 파일을 덮어쓰게 될 것입니다.)</p>
<pre class="eval">
user_pref("signed.applets.codebase_principal_support", true);
</pre>
<p>Mozilla는 <code>duplicates.xul</code> 내의 스크립트에 XPConnect에 접근할 권한을 줄 것인지 물어볼 것입니다. '예'를 선택하십시오.</p>
<p>현재, Mozilla는 권한없이 RDF 인터페이스와 서비스에 접근하는 것을 허용하지 않습니다. 자세한 내용은 <a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=122846">122846</a>번 버그를 참조하십시오.</p>
<p>더 추가하고 싶은 예제가 있다면 그 링크를 <a class="external" href="http://rdfweb.org/people/danbri/">danbri</a>, mozilla-rdf 혹은 waterson에게 이메일로 보내기 바랍니다!</p>
<h2 id=".EC.B0.B8.EA.B3.A0" name=".EC.B0.B8.EA.B3.A0">참고</h2>
<ol>
  <li>RDF 와 그에 관련된 기술들에 대해서는 <a class="external" href="http://www.w3.org/RDF/">W3C RDF</a> 페이지와 <a class="external" href="http://www.w3.org/2001/sw/">Semantic Web</a> 페이지를 살펴보기 바랍니다.</li>
</ol>
<h2 id=".EA.B3.B5.ED.97.8C" name=".EA.B3.B5.ED.97.8C">공헌</h2>
<ul>
  <li>2006-09-07 에 <a href="User:Nam-Hyung_Kim">김남형</a>이 번역함</li>
  <li>2002-07-02 에 <a class="external" href="http://rdfweb.org/people/danbri/">danbri</a>가 예제 부분을 추가함</li>
  <li>원격 XUL / 보안 정책에 대해 Myk Melez가 조언을 해 줌</li>
</ul>
<p>저자: <a class="link-mailto" href="mailto:waterson@netscape.com">Chris Waterson</a></p>
<div class="originaldocinfo">
  <h2 id=".EC.9B.90.EB.B3.B8_.EB.AC.B8.EC.84.9C_.EC.A0.95.EB.B3.B4" name=".EC.9B.90.EB.B3.B8_.EB.AC.B8.EC.84.9C_.EC.A0.95.EB.B3.B4">원본 문서 정보</h2>
  <ul>
    <li>저자: <a class="link-mailto" href="mailto:waterson@netscape.com">Chris Waterson</a></li>
    <li>최종 변경일: 2004-12-22</li>
    <li>저작권 정보: Copyright (C) <a class="link-mailto" href="mailto:waterson@netscape.com">Chris Waterson</a></li>
  </ul>
</div>
Revert to this revision