SGML 엔티티

표준 일반 마크업 언어(SGML)에서 **엔티티**(entity)는 고유한 별칭(사용자 지정 이름 등) 또는 SGML 예약어(`#DEFAULT` 등)를 문자열과 연결하는 원시 자료형이다. 엔티티는 SGML 문서의 조직 구조와 정의의 기초가 된다. SGML 사양은 키워드 한정자와 문맥에 따라 구분되는 수많은 **엔티티 유형**을 정의한다. 엔티티 문자열 값은 플레인 텍스트, SGML 태그 및 이전에 정의된 엔티티에 대한 참조로 다양하게 구성될 수 있다. 특정 엔티티 유형은 외부 문서를 호출할 수도 있다. 엔티티는 참조에 의한 호출 방식으로 호출된다.

## 엔티티 유형

엔티티는 일반 또는 파라미터로 분류된다.
* 일반 엔티티는 문서 콘텐츠 내에서만 참조할 수 있다.
* 파라미터 엔티티는 문서 형식 정의(DTD) 내에서만 참조할 수 있다.

엔티티는 또한 파싱 여부에 따라 분류된다.
* 파싱되는 엔티티(parsed entity)는 텍스트를 포함하며, 엔티티가 참조될 때 문서에 통합되어 파싱된다. 파라미터 엔티티는 파싱되는 엔티티만 가능하다.
* 파싱되지 않는 엔티티(unparsed entity)는 모든 종류의 데이터를 포함할 수 있으며, 이를 참조하면 애플리케이션에 해당 엔티티의 존재를 알리기만 한다. 엔티티의 내용은 텍스트이더라도 파싱되지 않는다. 파싱되지 않는 엔티티는 외부 엔티티만 가능하다.

### 내부 및 외부 엔티티
**내부 엔티티**(internal entity)는 리터럴(literal) 문자열이거나, 동일한 문서(예: 문서 형식 선언 또는 하위 문서)에 정의된 마크업과 엔티티로 구성된 파싱된 문자열을 값으로 가진다. 반면, **외부 엔티티**(external entity)는 외부 문서를 호출하는 선언을 가지며, 이에 따라 외부 문서 참조를 해결하기 위해 엔티티 관리자의 개입이 필요하다.

#### 시스템 엔티티
엔티티 선언은 리터럴 값을 가질 수도 있고, SGML 파서가 엔티티의 문자열 참조 대상을 자원 식별자로 처리할 수 있게 하는 선택적인 `SYSTEM` 식별자와, 특정 표현과 독립적으로 엔티티를 식별하는 선택적인 `PUBLIC` 식별자의 조합을 가질 수도 있다. SGML의 부분 집합인 XML에서는 `SYSTEM` 식별자 없이 `PUBLIC` 식별자만 가지는 엔티티 선언은 허용되지 않는다.

#### SGML 문서 엔티티
외부 엔티티가 완전한 SGML 문서를 참조할 때, 호출하는 문서에서는 이를 **SGML 문서 엔티티**라고 부른다. SGML 문서는 SGML 프롤로그(즉, DTD 및 하위 문서)에 정의된 SGML 마크업이 포함된 텍스트 문서다. 완전한 SGML 문서는 문서 인스턴스 자체뿐만 아니라 프롤로그와 선택적으로 SGML 선언(문서의 마크업 구문을 정의하고 문자 인코딩을 선언함)으로 구성된다.

## 구문

엔티티는 문서의 문서 형식 정의(DTD) 내에서 엔티티 선언을 통해 정의된다. 예를 들어:

```dtd
<!ENTITY greeting1 "Hello world">
<!ENTITY greeting2 SYSTEM "file:///hello.txt">
<!ENTITY % greeting3 "¡Hola!">
<!ENTITY greeting4 "%greeting3; means Hello!">
```

이 DTD 마크업은 다음을 선언한다.
* `greeting1`이라는 이름의 내부 일반 엔티티가 존재하며, `Hello world`라는 문자열로 구성된다.
* `greeting2`라는 이름의 외부 일반 엔티티가 존재하며, URI `file:///hello.txt`로 식별되는 자원에서 발견된 텍스트로 구성된다.
* `greeting3`이라는 이름의 내부 파라미터 엔티티가 존재하며, `¡Hola!`라는 문자열로 구성된다.
* `greeting4`라는 이름의 내부 일반 엔티티가 존재하며, `¡Hola! means Hello!`라는 문자열로 구성된다.

엔티티의 이름은 SGML 이름 규칙을 따라야 하며, 엔티티를 참조할 수 있는 위치에는 제한이 있다.

파라미터 엔티티는 엔티티 이름을 `%`와 `;` 사이에 배치하여 참조한다. 파싱되는 일반 엔티티는 엔티티 이름을 "`&amp;`"와 "`;`" 사이에 배치하여 참조한다. 파싱되지 않는 엔티티는 ENTITY 유형으로 선언된 속성값에 엔티티 이름을 배치하여 참조한다.

위 예시의 일반 엔티티들은 문서 내에서 다음과 같이 참조될 수 있다:

```xml
<content>
  <info>'&greeting1;' is a common test string.</info>
  <info>The content of hello.txt is: &greeting2;</info>
  <info>In Spanish, &greeting4;</info>
```

이 문서가 파싱될 때, `hello.txt` 파일에 `Salutations`라는 텍스트가 포함되어 있다고 가정하면, 하위 애플리케이션에는 마치 다음과 같이 작성된 것과 동일하게 보고된다:

```xml
<content>
  <info>'Hello world' is a common test string.</info>
  <info>The content of hello.txt is: Salutations</info>
  <info>In Spanish, ¡Hola! means Hello!</info>
```

기본 엔티티가 정의되어 있지 않은 한, 선언되지 않은 엔티티에 대한 참조는 오류다. 예를 들어:

```dtd
<!ENTITY #DEFAULT "This entity is not defined">
```

추가적인 마크업 구조와 프로세서 옵션은 엔티티의 처리 여부와 방식에 영향을 줄 수 있다. 예를 들어, 프로세서는 선택적으로 외부 엔티티를 무시할 수 있다.

## 문자 엔티티

SGML 및 그 파생 언어들을 위한 표준 엔티티 집합은 기억술적 장치로서 개발되었으며, 입력하기 어렵거나 레거시 문자 인코딩에서 널리 지원되지 않는 문자를 사용해야 할 때 문서 작성을 용이하게 한다. 이러한 각 엔티티는 유니버설 캐릭터 셋의 단 한 개의 문자로 구성된다. 모든 문자는 숫자 문자 참조를 사용하여 참조할 수 있지만, 문자 엔티티 참조를 사용하면 코드 포인트 대신 이름으로 문자를 참조할 수 있다.

예를 들어, HTML 4에는 명시적으로 선언할 필요가 없는 252개의 내장 문자 엔티티가 있는 반면, XML에는 5개가 있다. XHTML은 XML과 동일한 5개를 가지지만, DTD를 명시적으로 사용하는 경우 253개를 가진다(`&amp;apos;`가 HTML 4에 있는 것들 외에 추가된 엔티티임).

## 같이 보기
* 선언형 프로그래밍
* 객체 (컴퓨터 과학)
* XML 및 HTML 문자 엔티티 참조 목록
* XML 외부 엔티티 공격

## 내용주

## 각주
* Goldfarb, Charles F. (Ed.). ISO 8879 Review: WG8 N1855. WG8 and Liaisons, 1996.
* Goldfarb, Charles F., and Yuri Rubinsky (Ed.). The SGML Handbook. Oxford University Press, 1991.

## 외부 링크
* Entity Management in SGML

분류:마크업 언어