tbea***
2026-03-01

달리는 기차의 엔진을 멈추지 않고 교체하는 법. 실무자를 위한 러스트 기반 마이그레이션 가이드
이 책을 읽고 나서 가장 먼저 든 생각은 이 책이 "Rust 문법서"라기보다 "레거시 시스템을 망가뜨리지 않고 바꾸는 방법론"에 가깝다는 점이었다.
초반부는 리팩터링과 재작성의 차이를 계속 대비한다. 핵심 메시지는 단순하다. 큰 재작성 한 번보다 작은 변경을 빠르게 배포하고, 테스트와 모니터링으로 검증하면서 교체하라는 것이다. 이 관점이 마음에 들었던 이유는, 책이 "Rust가 빠르다"를 반복하는 데서 끝나지 않고 "운영 중 서비스에서 어떻게 위험을 줄일지"를 함께 다루기 때문이다.
2장은 소유권/대여/수명이라는 Rust 핵심 개념을 시각화해서 설명한다. 실제로 본문에 E0382, E0502, E0106 같은 대표 에러가 계속 등장하는데, 그냥 문법 암기보다 "왜 컴파일러가 막는지"를 납득하게 만들어 준다. 특히 수명 그래프를 시각적으로 곁들여 설명하는 구간은 Rust를 처음 진지하게 공부할 때 꽤 도움이 된다고 생각한다.
3~4장은 실무 전환 관점에서 가장 인상적이었다. unsafe를 피상적으로 소개하는 게 아니라, C 포인터를 받아 CStr::from_ptr로 처리하고 extern "C" 경계를 어떻게 잡아야 하는지 단계적으로 보여준다. 계산기 예제로 시작해서 NGINX 모듈로 확장하는 흐름도 좋았다.
4장에서는 ngx_http_calculator_handler, read_body_handler, request_body_as_str<'a> 같은 함수 단위까지 파고든다. bindgen을 이용해 NGINX C API 바인딩을 생성하고, cargo build 결과물을 NGINX 모듈과 연결해 curl -X POST ... /calculate로 검증하는 과정이 구체적이다. "이론적으로 가능" 수준이 아니라 실제 통합 문제를 어떻게 풀어가는지 보여줘서, FFI를 처음 실무에 도입할 때 참고하기 좋을 것 같다고 느꼈다.
5장은 상대적으로 차분하지만 중요하다. 모듈/경로/가시성 정리가 없으면 리팩터링 결과물이 금방 다시 복잡해지는데, 그 지점을 잘 짚어준다. 공개 범위(pub)를 어떻게 열고 닫아야 하는지, 라이브러리 구조를 어떻게 잡아야 하는지 실전 감각으로 설명한다.
6~8장은 개인적으로 가장 재미있게 읽은 부분이다. PyO3 + maturin develop로 Python 확장 모듈을 붙이고, criterion + cargo bench로 벤치마크를 돌리고, cargo test와 pytest를 함께 쓰는 식으로 "성능+검증" 루프를 만든다. 또 Python::with_gil을 중심으로 GIL 제약을 다루고, async/스레드 확장 전략으로 이어지는 흐름이 자연스럽다.
9~10장은 JavaScript 리팩터링과 WASM/WASI로 확장된다. wasm-pack build --target web 기반 브라우저 통합, Yew 컴포넌트 예제, 그리고 WASI/런타임(WasmEdge) 관점까지 연결한다. 덕분에 "C/Python 연동"에서 끝나지 않고 "런타임 경계를 넘는 리팩터링"까지 시야를 넓혀준다.
장점은 분명하다. "어디를 먼저 Rust로 바꿀지" 판단 기준을 제시하고, 바꾸는 과정에서 테스트와 배포 전략까지 같이 다룬다. 즉, 코드 몇 줄 빠르게 만드는 법이 아니라 팀 단위 전환 전략에 가깝다고 느꼈다.
한계도 있다. Rust 완전 입문자가 바로 따라가기는 쉽지는 않을 것 같다. 3장 이후 unsafe/FFI, 6장 이후 PyO3 툴체인, 9~10장 WASM/WASI는 배경지식이 없으면 속도가 확 떨어진다. 그래서 이 책은 "Rust 처음 배우기"보다는 "기존 시스템을 단계적으로 개선하기"가 목표인 개발자에게 더 잘 맞는다고 생각한다.
너무 재밌게 읽으면서도 평소 내가 공부하던 분야는 아니라 조금 어려웠다. 작년 pyodide에 기여하기 시작할 때부터 FFI, WASM -> 러스트 순서로 이 분야에 대해 관심 있게 보고 있는데 다시 한 번 읽어보면서 열심히 공부를 해야겠다고 느꼈다.