---
title: 레이어드 데이터
tags: [concept, SDF]
sources: [SDF-ch2-dsl, SDF-ch3-generic-procedures, SDF-ch6-layering, SDF-ch7-propagation]
updated: 2026-04-30
---

# 레이어드 데이터

## 한 줄 정의

데이터와 프로시저를 여러 독립적인 계층으로 구성하여, 기본 계산 코드를 전혀 수정하지 않고 단위·의존성·출처 등의 메타데이터를 병렬로 처리할 수 있는 구조.

## 핵심 내용

### 레이어링의 직관

프로그램에는 두 종류의 코드가 있다:
- **주요 계산**: 실제 값을 만들어내는 핵심 로직 (`F = G*m1*m2/r²`)
- **메타데이터 처리**: 단위 검사, 출처 추적, 오차 전파, 로깅, 단언(assertion)

일반적인 방식은 메타데이터 처리 코드를 주요 계산 코드에 섞어 넣는다. 이러면 코드가 복잡해지고, 새 메타데이터(예: 오차 범위 추가)를 더하려면 기존 코드를 수정해야 한다.

레이어링은 이 두 관심사를 완전히 분리한다:

> "The processing of the underlying data is not affected by the metadata, and the code for processing the underlying data does not even know about or reference the metadata. However, the metadata is processed by its own procedures, effectively in parallel with the data."

### 레이어드 데이텀의 구조

각 데이터 항목이 여러 계층의 정보를 담은 레이어드 데이텀이다:

```scheme
(define G
  (layered-datum 6.67408e-11
    unit-layer   (unit 'meter 3 'kilogram -1 'second -2)
    support-layer (support-set 'CODATA-2018)))
```

여기서 `6.67408e-11`은 기본 레이어의 값이고, `unit-layer`와 `support-layer`는 메타데이터 레이어다. 기본 계층의 수치 연산은 단위나 출처를 전혀 모른다.

계산 결과:
```scheme
(pp (F M-earth M-Moon a-moon))
; (base-layer 1.9805035857209e20)
; (unit-layer (unit kilogram 1 meter 1 second -2))
; (support-layer (support-set Wieczorek-2006 NASA-2006 ...))
```

기본 레이어는 수치를, 단위 레이어는 자동으로 전파된 단위를, 지원 레이어는 사용된 모든 데이터 소스의 합집합을 보여준다.

### 레이어드 프로시저

데이터가 레이어드이면, 그것을 처리하는 프로시저도 레이어드여야 한다. 레이어드 프로시저는 각 레이어를 독립적으로 처리하는 향상된 프로시저다.

기본 레이어 프로시저(`*`)는 `number × number → number`를 계산한다.  
레이어드 `*`는 `layered-datum × layered-datum → layered-datum`을 계산하되, 각 레이어를 해당 레이어의 연산으로 처리한다:
- 기본 레이어: 일반 수치 곱셈
- 단위 레이어: 지수를 더함 (`m³ × kg = m³·kg`)
- 지원 레이어: 소스 집합의 합집합

### 제네릭 프로시저와의 관계

레이어링은 제네릭 프로시저 위에 구축된다:

> "The decoration of a value is a generalization of the tagging used to support extensible generic operations."

Ch2에서 아리티를 해시 테이블로 함수에 첨부하는 것이 레이어링의 씨앗이다. Ch3의 추상 술어에서 타입 태그를 객체에 붙이는 것이 중간 단계다. Ch6의 레이어드 데이텀은 이 개념의 완전한 일반화다.

각 레이어를 별도의 제네릭 프로시저로 처리하면, 새 레이어는 새 제네릭 핸들러 세트로 표현된다. 기본 레이어의 코드는 전혀 모른다.

### 레이어가 될 수 있는 것들

SDF Ch6이 제시하는 레이어 후보들:
- 수치 정밀도 선언
- 타입 정보 (컴파일러용)
- 단언(assertions) / 사전조건 / 사후조건
- 대안 구현 제안 (퇴화성 지원)
- 의존성 / 출처 추적
- 로깅 / 프로파일링
- 오차 범위

이 목록에서 중요한 점: 이것들 대부분은 전통적으로 코드에 직접 삽입되거나(예: 계약 프로그래밍의 assert), AOP로 처리하려 시도된다. 레이어링은 더 구조적인 방법이다.

### AOP와의 비교

AOP(관점 지향 프로그래밍, Aspect-Oriented Programming)도 "횡단 관심사(cross-cutting concerns)"를 분리하려는 시도다. 차이:

- AOP는 포인트컷(pointcut)이라는 별도 메커니즘으로 코드 삽입 위치를 지정. 코드와 관점이 별개 위치에 있어 이해하기 어렵다.
- 레이어링은 데이터 자체가 레이어 정보를 담고, 프로시저가 이를 투명하게 처리. 새 레이어는 새 데이터 타입과 새 핸들러로 자연스럽게 추가된다.

### 의존성 레이어와 Ch7과의 연결

Ch6의 지원(support) 레이어는 Ch7에서 전파 시스템의 의존성 추적으로 발전한다. 각 전파된 값이 어떤 전제(premise)에서 파생됐는지를 추적하면:
- 모순 발생 시 원인 전제를 특정할 수 있음
- 의존성 지향 백트래킹이 가능해짐: 관련 없는 탐색 공간을 재방문하지 않음

레이어링이 없으면 이런 정교한 백트래킹은 구현하기 매우 어렵다.

## SDF에서의 등장

- [[SDF-ch2-dsl]]: 아리티를 함수에 첨부하는 것이 레이어링의 씨앗
- [[SDF-ch3-generic-procedures]]: 타입 태그와 추상 술어가 레이어링의 중간 단계
- [[SDF-ch6-layering]]: 핵심 챕터. 레이어드 데이텀, 레이어드 프로시저, 단위 레이어, 의존성 레이어. AOP와의 비교
- [[SDF-ch7-propagation]]: 의존성 레이어를 전파 시스템에 통합하여 의존성 지향 백트래킹 구현

## 실천 시 주의점

**레이어 간 독립성 보장**: 기본 레이어의 코드가 다른 레이어의 존재를 모르도록 해야 한다. 기본 코드가 레이어를 인식하기 시작하면 레이어링의 핵심 이점(분리)이 사라진다.

**레이어 수의 관리**: 레이어가 너무 많아지면 각 연산에서 처리해야 하는 계층이 늘어난다. 실제로 필요한 레이어만 추가하고, 사용하지 않는 레이어는 제거하는 정책이 필요하다.

**레이어 값의 일관성**: 여러 레이어가 동일한 계산의 다른 측면을 처리하므로, 레이어들이 서로 일관된 결과를 내야 한다. 특히 단위 레이어가 오류를 감지할 때 기본 레이어도 올바른 값인지 확인해야 한다.

**성능 비용**: 모든 연산에서 모든 레이어를 처리하면 기본 계산의 여러 배 시간이 소요될 수 있다. 성능이 중요한 코드에서는 레이어 처리를 선택적으로 비활성화하는 메커니즘이 필요하다.

## 관련 개념

- [[additive-programming]] — 새 레이어 추가가 기존 코드 수정 없이 기능을 확장하는 가산적 방법
- [[generic-procedures]] — 레이어드 프로시저의 기술적 기반
- [[partial-information]] — 의존성 레이어가 부분 정보의 출처 추적을 담당
- [[propagation]] — 의존성 레이어가 전파 시스템의 핵심 재료
- [[degeneracy]] — 레이어로 대안 구현을 시스템에 명시적으로 등록 가능
