이하의 글은 2011년에 쓴 것입니다. 오래된 글인 만큼, 현재의 생각과 전혀 다른 내용도 많이 포함되어 있고, 당시와는 상황이 많이 달라진 점도 있습니다. 또한, 그 당시에 잘못 알려졌던 정보도 포함되어 있을 수 있습니다. 어찌됐든 저는 제 오래된 글이 회자되는 것을 저어합니다. 읽기에 앞서 양해를 부탁드립니다.
엔티티 중복과 동기화
엔티티 중복(entity duplication)을 좋아하지 않는다. 어느 한쪽의 엔티티를 다른 한쪽으로 복제해야 할 때가 있다. 예를 들자면 트윗을 Facebook으로, iPhoto 사진을 Flickr로 복제한다. 문제는 현존하는 거의 대부분의 소프트웨어들이 엔티티 복제를 아주 나이브하게 구현했다는 데에 있다. 구체적으로는, 거의 모든 소프트웨어가 동기화(synchronization)에는 전혀 관심이 없는듯 보인다. 동기화가 되지 않으면 엔티티 복제는 엔티티 중복이 된다.
어떤 것들이 보장되어야 동기화가 된다고 말할 수 있을까?
- 원본 엔티티가 수정되면 복제된 엔티티도 함께 수정되어야 한다.
- 원본 엔티티가 삭제되면 복제된 엔티티도 함께 삭제되어야 한다.
- 복제된 엔티티가 수정되면 원본 엔티티도 함께 수정되어야 한다.1
위와 같은 것들이 보장되면 동기화가 된다고 볼 수 있다. 동기화가 되지 않을 경우 엔티티에 대한 통제가 힘들어진다. 나는 그래서 기술적으로 동기화를 구현하기 매우 힘든 반면 동기화를 구현해서 얻는 이득이 거의 없거나 아예 원본 엔티티가 수정/삭제될 가능성이 없는 경우2가 아니면 동기화를 꼭 구현해야 한다고 생각한다. 아니면 비동기적이라고 하더라도 최소한 eventually-consistent할 필요는 있다고 생각한다.
자, 여기까지는 정리된 생각. 이후로는 요즘 고민하는 내용들.
그렇다면 우리가 사용하고 있는 소프트웨어 중에서 엔티티 동기화를 구현하는 것들이 얼마나 있을까? 얼른 생각이 나지는 않는다. 엔티티 동기화를 구현해두면 사용자는 엔티티가 복제되더라도 그것을 하나의 엔티티로 취급하면 되기 때문에 신경을 쓰지 않게 되는 경우가 많다. 그래서 얼른 생각이 나지 않는 것 같다.
그렇다면 반대로 엔티티 동기화를 구현하지 않는 것들이 얼마나 있을까? 꽤 많이 있는 것 같다.
엔티티 복제는 과연 소프트웨어적으로만 이루어질까? 그렇지 않다. 예를 들어 나는 Google Reader에서 Like를 찍었으면, 그 페이지를 들어가서 Facebook Like 버튼이 있는지 확인해보고 있으면 그것도 클릭해둔다. 그 페이지가 Tumblr 페이지면 거기서도 Like를 찍는다. 손으로 엔티티를 복제하고 있는 것이다. 당연히 손으로 엔티티를 복제했으므로 동기화도 되지 않는다. 자, 이걸 어떻게 동기화해야 할 것인가?