07. 작성 시기 최적화
- Composer
- Composition에 새로운 노드를 삽입하는 행위를 위임받음
- 이 경우, Composer가 변경사항이 방출될 때 변경 목록에 추가하는 대신 곧바로 슬롯 테이블에 변경 사항을 작성
- 나머지 경우에는 변경 목록에 기록되고 잠시 지연 (아직 적용할 시점이 아니기 때문)
<aside>
💡
Composer#createNode 시점에는 변경 사항을 변경 목록에 추가 대신 곧바로 슬롯 테이블에 작성한다. 나머지 경우에는 변경 목록에 기록하고 지연된다.
</aside>
08. 쓰기 및 읽기 그룹
-
Composer가 삽입하는 모든 정보들은 데이터, 노드, 그룹 형태로 작성하며, 단순화를 위해 궁극적으로
“그룹” 형태로 저장
- Composition 완료 시,
composition.applyChanges()를 호출하여 트리를 구체화 및 위 정보(변경 사항)들을 슬롯 테이블에 기록
- 각 “그룹”들은 차별화를 위해 서로 다른 그룹 필드를 가짐
-
Composer는 그룹을 “start”, “end”함
- 쓰고 있는 경우 : 슬롯 테이블에서 “그룹 생성(startXXGroup)”, “그룹 제거(endXXGroup)”
- 읽고 있는 경우 : SlotReader에게 읽기를 시작하거나 종료하기 위해 포인터를 그룹 외부로 이동하라는 요청
-
그룹 시작
- 삽입 중인 경우
- 보류 중인 작업이 있는 경우
- 변경 사항을 적용할 때 모두 기록
- 이미 테이블에 그룹이 존재하는 경우 → 재사용
- 다른 위치에 있는 경우
- 테이블에 없고 새 그룹인 경우
- 삽입 모드로 이동
- 그룹과 모든 하위 항목들을 다른 SlotTable에 기록 → 예약되어 변경 목록에 기록
- 값 삽입하지 않고 보류 중인 작업도 없는 경우
-
그룹 제거
- 해당 그룹과 해당하는 모든 슬롯을 테이블에서 제거하는 것
- Composer는 SlotReader를 적절하게 재배치
- 해당 그룹의 모든 노드를 Applier에서 제거
- 모든 변경 사항을 동시에 일괄적으로 반영하기 위해 예약
- 제거 될 예정인 그룹에 대한 모든 보류 중인 Invalidation 폐기
-
그룹 재사용
- 새 노드를 만들 필요 없고, 이미 존재하는 경우 재사용 가능
- Applier에 의해 해당 노드로 이동하라는 작업은 기록하지만, 생성이나 초기화 작업은 생략
-
모든 업데이트에 대한 동작은 Change로 기록됨
<aside>
💡
</aside>
09. 값 기억하기