# 실시간 협업 엔진을 Rust로 직접 만들다 – Conflux 프로젝트 전격 소개

---

# # 서론: “실시간 협업, 어떻게 구현될까?”

우리는 매일 Google Docs, Notion, Figma 같은 실시간 협업 도구를 사용하지만, 그 뒤에 어떤 기술이 숨어 있는지는 거의 알지 못합니다. 특히 **실시간 협업**(real‑time collaboration)이라는 복잡한 개념은 “데이터 동기화”, “충돌 해결”, “낮은 레이턴시” 등 다양한 요소가 얽혀 있어 초보자에게는 벽처럼 느껴지기 쉽습니다.

이번 글에서는 Rust 언어를 활용해 직접 **Conflux**라는 실시간 협업 엔진을 구현한 과정을 단계별로 풀어보겠습니다. 코드를 직접 작성하면서 핵심 원리를 이해하고, 여러분도 손쉽게 비슷한 시스템을 만들 수 있도록 안내합니다.

---

# # 1️⃣ Rust 선택 이유 – 안전성과 성능

## # 1-1. 메모리 안전성

Rust는 컴파일 타임에 메모리 오류를 잡아내는 **소유권(Ownership)** 시스템을 갖추고 있어, 멀티스레드 환경에서도 데이터 레이스를 방지합니다. 실시간 협업 엔진은 다수의 클라이언트가 동시에 접근하므로, 메모리 안전성은 필수 조건입니다.

## # 1-2. Zero‑Cost Abstractions

고성능 네트워킹을 구현할 때 C/C++ 수준의 속도가 필요합니다. Rust는 추상화 비용이 없기 때문에 **낮은 레이턴시**를 유지하면서도 가독성 높은 코드를 작성할 수 있습니다.

## # 1-3. 풍부한 에코시스템

`tokio`, `warp`, `serde` 같은 비동기 런타임과 직렬화 라이브러리가 이미 성숙해 있어, 실시간 통신 프로토콜을 손쉽게 구현할 수 있습니다.

---

# # 2️⃣ 핵심 아키텍처 – OT vs CRDT

실시간 협업에서 가장 큰 난관은 **동시 편집 충돌**을 어떻게 해결하느냐입니다. 두 가지 대표적인 접근법이 있습니다.

| 방식 | 장점 | 단점 |

|------|------|------|

| **OT (Operational Transformation)** | 기존 시스템과 호환성이 높음 | 구현 복잡도 ↑, 서버 부하 |

| **CRDT (Conflict‑free Replicated Data Type)** | 서버 없이도 충돌 없이 병합 가능 | 메모리 사용량 ↑, 설계 난이도 |

Conflux에서는 **CRDT** 기반의 **RGA(Replicated Growable Array)** 를 선택했습니다. 이유는 다음과 같습니다.

* **분산 환경**에서 서버 장애가 발생해도 클라이언트 간 데이터 일관성을 유지할 수 있다.

* **오프라인 편집** 후 재연결 시 자동 병합이 가능해 사용자 경험이 향상된다.

---

# # 3️⃣ 실전 구현 단계

## # 3-1. 프로젝트 초기화

```
bash

cargo new conflux --bin

cd conflux

cargo add tokio warp serde serde_json uuid

```

`tokio`는 비동기 런타임, `warp`는 웹소켓 서버, `serde`는 JSON 직렬화, `uuid`는 고유 식별자 생성에 사용합니다.

## # 3-2. 데이터 모델 정의

```
rust

use uuid::Uuid;

use serde::{Serialize, Deserialize};

# [derive(Debug, Clone, Serialize, Deserialize)]

pub struct Char {

    pub id: Uuid,          // 전역 고유 식별자

    pub value: char,       // 실제 문자

    pub visible: bool,     // 삭제 여부 (tombstone)

}

```

각 문자는 전역 고유 ID와 가시성 플래그를 갖는 구조체이며, 이를 배열 형태로 관리합니다.

## # 3-3. CRDT 연산 구현

```
rust

pub enum Op {

    Insert { after: Uuid, ch: Char },

    Delete { id: Uuid },

}

```

* **Insert**: 기존 문자 뒤에 새 문자를 삽입

* **Delete**: 해당 ID의 `visible`을 `false` 로 전환

연산은 모두 **전파**되어야 하므로, 웹소켓을 통해 모든 클라이언트에 브로드캐스트합니다.

## # 3-4. 웹소켓 서버 구축

```
rust

use warp::Filter;

# [tokio::main]

async fn main() {

    let ws_route = warp::path('ws')

        .and(warp::ws())

        .map(|ws: warp::ws::Ws| {

            ws.on_upgrade(handle_socket)

        });

    warp::serve(ws_route).run(([0,0,0,0], 3030)).await;

}

```

`handle_socket` 함수 안에서 연결된 클라이언트마다 **채널**을 생성하고, 수신된 `Op`를 전체 클라이언트에 전파합니다.

## # 3-5. 클라이언트와 동기화

프론트엔드에서는 `WebSocket` API와 간단한 **React** 컴포넌트를 사용해 텍스트 입력을 감지하고, 위에서 정의한 `Op`를 JSON 형태로 서버에 전송합니다. 서버는 이를 모든 클라이언트에게 다시 전송하고, 각 클라이언트는 로컬 CRDT 상태를 업데이트합니다.

---

# # 4️⃣ 테스트와 배포 – 실전에서 검증하기

1. **단위 테스트**: `cargo test` 로 `insert`, `delete` 연산이 올바르게 병합되는지 확인합니다.

2. **부하 테스트**: `hey` 같은 툴로 동시에 1000개의 웹소켓 연결을 시뮬레이션해 레이턴시와 메모리 사용량을 측정합니다.

3. **Docker 이미지**: `Dockerfile`을 작성해 컨테이너화하고, `kubectl` 로 쿠버네티스 클러스터에 배포하면 스케일링이 용이합니다.

---

# # 결론: 지금 바로 Conflux를 체험해 보세요!

이번 글에서는 **Rust** 로 구현한 실시간 협업 엔진 **Conflux**의 설계와 구현 과정을 살펴보았습니다.

* **실시간 협업**이라는 복잡한 문제를 CRDT 기반으로 깔끔히 해결

* Rust의 안전성과 성능을 활용해 저레벨 네트워킹까지 직접 제어

* 단계별 예제 코드와 배포 팁으로 초보자도 바로 구현 가능

여러분도 오늘 바로 로컬 환경에 Conflux를 설치하고, 간단한 웹 에디터를 만들어 보세요. 직접 손을 움직이며 배우는 것이 가장 빠른 성장 방법입니다.

> **행동 유도**:

> 1️⃣ 이 글을 북마크하고, `cargo new conflux` 로 프로젝트를 시작하세요.

> 2️⃣ GitHub에 포크하고, PR을 통해 기능을 추가해 보세요.

> 3️⃣ 블로그 댓글에 여러분만의 개선 아이디어를 공유해 주세요!

함께 만든 실시간 협업 엔진이 더 큰 프로젝트로 성장하길 기대합니다. 🚀
