메타데이터는 관리되는 모듈에 정의되어 있는 것들(클래스와 클래스 맴버, 구조체등)의 목록과 기초적인 정보를 저장해 놓은 일종의 데이터 테이블이라고 생각하면 된다. 따라서 이 테이블만 확인하면 해당 모듈에서 어느 타입들이 정의되어 있는지 쉽게 확인 가능하다. 또한 메타데이터는 모듈에서 정의한 타입들 외에도 모듈에 참조되어서 사용된 타입들의 리스트 역시 저장하고 있다. 메타데이터는 기존의 Type Library와 IDL(Interface Definition Language)파일과 같은 기술들의 진보된 형태라고 할 수 있으며 이전 기술보다 완성도나 활용도가 훨씬 높다. 또한 기존 Type Library와 IDL파일과는 달리 메타데이터는 항상 소스가 컴파일된 형태인 IL과 동일한 파일에 있게 된다. 닷넷의 실행 파일(exe, dll) 혹은 닷넷 어셈블리라고 불리는 것에는 항상 IL코드와 메타데이터가 같이 존재한다(언어 컴파일러가 어셈블리를 생성할 때 IL과 메타데이터를 항상 같이 생성하기 때문에 메타데이터를 IL로 부터 따로 분리하는 것은 불가능하다). 따라서 IL코드와 이를 설명해주는 메타데이터는 서로 버전이 다를 수 없으며 항상 같은 버전으로 동기화 되어있다.

메타데이터의 주요 사용 용도
 컴파일러가 컴파일 수행시 기존의 해더 혹은 라이브러리 파일 같은 것이 없어도 컴파일 가능하게 해준다. 이미 정의된 모든 타입과 참조된 타입의 정보가 실행 파일에 자세하게 기록되어 있으므로 컴파일러는 이러한 정보를 관리되는 모듈에서 정확하게 읽을 수 있다.
 Visual Studio와 같은 개발 툴에서 메타데이터는 개발 생산성을 높이는데 이용될 수 있다. 개발자가 코드를 작성할 때 메타데이터 정보를 읽고서 메서드, 속성, 이벤트, 멤버등의 정보를 미리 보여줄 수 있다. 그 대표적인 예가 Visual Studio의 인텔리전스기능이다.
 CLR의 코드 검증 기능은 메타데이터의 정보를 통해 해당 실행 파일이 안전하게 실행될 수 있는지 확인할 수 있다.
 메타데이터는 객체의 상태를 보존할 수 있도록 Serialize혹은 Deserialize를 가능하게 해준다. 객체의 상태를 메모리 블록에 serialize한 후 원격 PC에 전송하고 다시 deserialize하여 결과적으로 객체의 상태를 원격 PC에 전송 가능하게 할 수 있는 것도 메타데이터가 있기 때문에 가능한 것이다.
 메타데이터는 가비지 수집기가 객체의 수명 상태를 조사하여 수집 대상을 확인하는데 도움을 준다. 예를 들어 가비지 수집기는 런타임 시 객체의 타입을 메타데이터를 통해서 정확하게 알 수 있다. 또한 이를 통해서 해당 객체가 포함하고 있는 맴버들의 리스트를 확인할 수 있고, 이들 중 어느 멤버가 다른 객체에 의해서 참조되고 있는지도 확인이 가능하다.

+ Recent posts