노트

OT (연산 변환)

Operational Transformation

CS#algorithm · 연결된 개념 3개

쉽게 말하면

OT는 내가 문서의 3번째 자리에 넣으려던 글자를, 그사이 친구가 앞쪽에 한 글자 넣었다면 4번째 자리로 고쳐서 넣는 방식이에요. 남의 편집에 맞춰 내 편집을 보정하니 모두가 같은 문서를 보게 돼요.

비유가 깨지는 곳 보정 규칙은 편집 종류의 조합마다 따로 짜야 해서 종류가 N개면 대략 N²개가 필요해요. 누가 먼저인지 정할 중앙 서버도 대개 필요해서, 오프라인에서 오래 고친 뒤 합치기엔 CRDT가 더 자연스러워요.

여러 사용자가 같은 문서를 동시에 편집할 때, 다른 사람의 연산이 먼저 적용됐다는 사실에 맞춰 내 연산을 변환(transform)해서 모두가 같은 결과에 이르게 하는 방식. 실시간 협업 편집기에서 오래 쓰여 왔다.

예

문서 ABCD에서 A는 위치 1에 X를, B는 위치 3에 Y를 동시에 넣는다. 서버가 A의 삽입을 먼저 적용하면 AXBCD가 되어 B가 노린 위치가 한 칸 밀린다. 그래서 B의 연산을 insert('Y', 3)에서 insert('Y', 4)로 바꿔 적용한다. 결과는 양쪽 모두 AXBCYD다.

sequenceDiagram
  participant A
  participant S as 서버
  participant B
  Note over A,B: 문서 ABCD
  A->>S: insert('X', 1)
  B->>S: insert('Y', 3)
  Note over S: A를 먼저 적용 → AXBCD
  Note over S: B의 연산을 insert('Y', 4)로 변환해 적용
  S->>A: insert('Y', 4)
  S->>B: insert('X', 1)
  Note over A,B: 양쪽 모두 AXBCYD

특징

  • 대개 중앙 서버가 순서를 정한다: 실무 구현(Google Docs 계열 등)은 어떤 연산이 먼저인지 서버가 결정하고 변환을 수행한다. 서버 없는 OT 알고리즘도 연구됐지만 정확하게 만들기가 훨씬 어렵다
  • 변환 함수가 폭발한다: 연산 종류(삽입·삭제·서식…)의 조합마다 변환 규칙을 짜야 해서 종류가 N개면 대략 N²개의 규칙이 필요하고, 모든 경우에 정확하게 만들기 어렵다
  • 메모리는 효율적이다: 문자마다 ID를 붙이지 않는다
  • 수십 년의 연구와 실무 적용으로 검증된 방식이다

CRDT와 비교

OTCRDT
서버대개 순서를 정할 중앙 서버 필요서버 없이도 병합 가능
충돌 해결연산을 변환해 보정자료구조가 스스로 수렴
비용변환 규칙의 복잡도ID·툼스톤 같은 메타데이터
오프라인약함강함

서버가 중재해야 하므로 오프라인에서 오래 따로 고친 뒤 합치는 로컬 퍼스트에는 CRDT가 더 자연스럽다. 반대로 항상 온라인인 협업 편집기라면 OT도 여전히 좋은 선택이다. 동시 수정 충돌이라는 같은 문제를 데이터베이스에서는 트랜잭션 격리(Transaction Isolation)와 락으로 푼다(ACID).

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 트랜잭셔널 아웃박스 패턴

    DB 변경과 이벤트 발행을 안전하게 함께 처리하는 패턴이다. 실제 데이터 변경과 "이 이벤트를 내보내라"는 기록(outbox 행)을 같은 DB 트랜잭션에 넣고, 별도 워커가 outbox를 읽어 메시지 브로커로 보낸다.

  • 집단 코드 소유

    코드의 주인을 개인으로 두지 않고 팀 전체가 코드베이스 전체를 소유해, 누구나 필요한 곳을 고칠 수 있게 하는 XP 실천법.

  • 리팩터링 기법 카탈로그

    리팩터링 기법을 무엇을 정리하는지에 따라 묶어 본 지도. 기법마다 거의 항상 반대 방향 기법이 짝으로 있어서(추출↔인라인, 올리기↔내리기) 상황에 따라 양쪽으로 오간다. 아래 묶음은 Refactoring.Guru 카탈로그(1판 기반)의 분류를 따랐고, 기법 이름은 2판 기준으로 적었다.

  • 구조와 동작, 옵션의 가치

    켄트 벡이 정리 시점을 판단하려고 꺼내는 경제학 틀. 소프트웨어는 두 가지 가치를 만든다. 오늘 하는 일(동작)과, 내일 새로 할 수 있게 되는 일(옵션)이다. 구조는 동작을 바꾸지 않지만 옵션을 만든다.

  • 데이터베이스 다중화

    같은 데이터를 여러 DB 서버에 복제해 두는 것. 가장 흔한 형태는 원본을 가진 주(Primary) 서버가 쓰기를 받고, 사본을 받는 부(Replica) 서버들이 읽기를 나눠 맡는 구조다.

보기 옵션