DOP 원리 3
데이터는 불변이다
다중 버전 시스템 데이터와 구조적 공유
DOP에서 데이터는 불변이다. 때문에 데이터의 변경이 생기면 새로운 버전이 생성된다. 이런 방식으로 데이터를 관리하면 모든 데이터 변경 작업은 아래의 과정을 거치게 된다. 연산 단계에서는 조회와 같은 방식으로 범용 함수를 활용해 변경이 반영된 형태의 차기 버전을 만든다. 이후 반영 단계에서는 산출된 차기 버전을 참조하도록 시스템에 반영한다.
- 연산 단계: 시스템 데이터의 차기 버전을 산출한다.
- 반영 단계: 연산된 시스템 데이터의 차기 버전을 참조하도록 이동시킨다.
DOP에서 선택한 방식이 가지는 몇 가지 장점을 나열하자면 아래와 같다. 이 방식은 Git이 commit 이력을 관리하여 버전 이력을 추적하는 방식과 굉장히 유사하다.
- 연산 / 반영을 구분하여 상태를 가지는 부분을 최소로 줄일 수 있다.
- 반영 단계의 구현은 모든 변경 작업에 공통적으로 쓰일 수 있다.
- 이전 버전 이력을 추적할 수 있다.
하지만 모든 변경에 시스템의 새로운 버전이 생성되는 건 여러 측면에서 비효율적이다. 때문에 DOP에서는 구조적 공유를 활용한다. 즉, 변경되지 않은 부분은 여러 버전에서 공유하고, 변경된 부분만 새로운 객체로 변경을 가하는 것이다. 여기서 조심해야하는 점은 여러 버전에서 동일한 객체를 공유하기 때문에 잘못된 데이터 변경으로 여러 버전의 데이터가 변경될 수 있다. 이런 문제를 방지하기 위해서는 데이터 변경 지점을 잘 관리해야 한다. 조금 더 철저하게 관리할 수 있는 방법으로는 영속 자료구조를 지원하는 라이브러리를 활용하는 방법이 있다.
(클로저 언어에서는 기본 자료 구조가 불변이라고 한다.)
데이터 반영 단계와 이전 상태 복원
class System {
addMember(member) {
let previous = SystemState.get();
let next = Library.addMember(previous, member);
SystemState.commit(previous, next);
}
}
class SystemState {
previousSystemData;
systemData;
get() {
return this.SystemData;
}
commit(previous, next) {
let systemDataBeforeUpdate = this.systemData;
if (!SystemValidity.validate(previous, next)) {
thorw "유효하지 않은 시스템 데이터로 변경하려고 해요.";
}
this.systemData = next;
this.previousSystemData = systemDataBeforeUpdate;
}
undoLastMutation() {
this.systemData = this.previousSystemData;
}
}
연산 단계에서 차기 버전의 데이터를 산출했다면 반영 단계에서는 이 데이터를 시스템에서 바라보도록 수정이 필요하다. 위 코드를 보면 addMember에서 commit 메서드를 통해 산출된 차기 버전의 데이터를 시스템에 반영한다. 반영 단계의 코드는 모든 변경에 공통적으로 관여하기에 시스템 데이터의 유효성을 중앙에서 확인할 수 있게 해준다.
시스템 데이터를 버전을 기준으로 관리하면 이전 버전으로 복구도 어렵지 않다. 위 코드에서는 이전 이력을 저장해두고 1번의 버전 복원이 가능하도록 구성했다. 모든 버전을 관리하기 위해서는 추가 작업들이 필요하겠지만 DOP의 상태 관리 전략이 어떻게 이전 상태 복원이 가능하도록 만드는지 기본 개념을 확인할 수 있다.
내 생각
의문은 계속 생기고 뒤에서 이 의문을 풀어줄 거란 마음에 뒷 내용이 계속 궁금해진다. 데이터를 이렇게 관리하면 DB 스키마는 어떻게 나오는 거지? 이 방식대로라면 모든 데이터를 메모리에 올리고 작업을 하는 건가? 지금까지 봐온 개발 방식과 많은 부분이 달라서 뒷 내용이 계속 궁금해진다.
'도서 > 기술' 카테고리의 다른 글
[책] 데이터 지향 프로그래밍 - 6장 단위 테스트 (2) | 2024.12.14 |
---|---|
[책] 데이터 지향 프로그래밍 - 5장 기본 동시성 제어 (1) | 2024.12.08 |
[책] 데이터 지향 프로그래밍 - 3장 기본 데이터 조작 (4) | 2024.11.30 |
[책] 데이터 지향 프로그래밍 - 2장 코드와 데이터 분리 (2) | 2024.11.24 |
[책] 데이터 지향 프로그래밍 - 1장 객체지향 프로그래밍의 복잡성 (0) | 2024.11.23 |