달리는 기차의 엔진을 멈추지 않고 교체하는 법 실무자를 위한 러스트 기반 마이그레이션 가이드
많은 개발 팀이 딜레마에 빠져 있습니다. C/C++ 프로젝트는 메모리 오류로 인한 버그가 끊이질 않고, 파이썬으로 작성한 서버는 트래픽이 몰릴 때마다 성능이 한계에 달합니다. 하지만 수년 넘게 쌓아 거대해진 레거시 코드를 한순간에 버리고 처음부터 다시 개발하는 ‘빅뱅’ 방식은 현실적으로 리스크가 너무 큽니다.
이 책은 바로 그 고민에서 시작합니다. 기존 시스템을 완전히 허물지 않고도, 가장 아픈 부분만을 도려내 러스트로 교체하는 ‘점진적 리팩터링’ 기술을 소개합니다. 달리는 기차의 부품을 하나씩 고성능 부품으로 교체하듯, 여러분의 서비스는 중단 없이 계속 운영되면서도 속도는 더 빨라지고 구조는 더 단단해질 것입니다. 안전하지 않은 C 포인터를 소유권 모델로 감싸고, 느린 파이썬 연산 로직을 러스트 라이브러리로 대체하여 20배 이상의 성능 개선을 꾀하며, 웹 어셈블리(Wasm)를 통해 자바스크립트의 한계를 넘어서는 방법까지, 실무에 적용 가능한 ‘생존 전략’을 만나 보세요.
주요 내용
FFI 완벽 가이드: C 라이브러리와 러스트의 안전한 연결
PyO3 활용: 파이썬 병목 구간을 러스트로 해결하여 성능 개선
웹 어셈블리: 웹 브라우저에서 러스트 코드 실행
실전 전략: 무중단 마이그레이션을 위한 테스트 및 배포 노하우
저자소개
저자
릴리 마라
캘리포니아주 샌프란시스코에 거주하는 소프트웨어 개발자입니다. 2015년부터 러스트로 고성능의 확장 가능한 시스템을 개발해 왔으며, 현재 디스코드에서 일하고 있습니다. 또한 전 세계에서 러스트 소프트웨어 개발을 주제로 강연하며 경험을 공유하고 있습니다.
저자
조엘 홈즈
클라우드 네이티브 애플리케이션 구축에 집중해 온 소프트웨어 개발자입니다. 여러 스타트업에서 새로운 제품과 서비스를 설계, 개발하며 사내에 도움이 되는 도구와 프로세스를 구축하고 품질을 관리했습니다. 현재는 가족과 함께 피츠버그에 거주하며 리그로우에서 클라우드 애플리케이션 개발을 담당하고 있습니다.
역자
전봉규
임베디드와 시스템 개발 분야에서 활동하는 소프트웨어 개발자입니다. 디바이스 드라이버, 영상 스트리밍 서비스와 ATSC 3.0 등 성능 최적화를 요구하는 다양한 시스템을 개발해 왔습니다. GStreamer 기반 애플리케이션을 러스트로 전환했으며, 현재는 LG CNS에서 보안 분야 소프트웨어를 개발하고 있습니다.
목차
CHAPTER 01 러스트로 리팩터링하는 이유 _1.1 리팩터링이란 무엇인가? _1.2 러스트란 무엇인가? _1.3 왜 러스트인가? _1.4 러스트로 리팩터링하는 이유는 무엇인가? _1.5 러스트로 리팩터링하지 않는 경우는 언제인가? _1.6 어떻게 작동하나? _1.7 이 책에서 무엇을 배울까? _1.8 누구를 위한 책인가? _1.9 시작하려면 어떤 도구가 필요한가?
CHAPTER 02 러스트 개요 _2.1 소유권과 대여 _2.2 다른 언어에서의 메모리 관리 _2.3 수명 _2.4 러스트의 문자열 타입 _2.5 열거형과 오류 처리 정리
CHAPTER 03 C FFI와 unsafe 러스트 소개 _3.1 unsafe 러스트 _3.2 C FFI 정리
CHAPTER 04 고급 FFI _4.1 NGINX 소스코드 다운로드 _4.2 NGINX 모듈 생성하기 _4.3 C를 러스트로 링크하기 _4.4 NGINX 요청 읽기 _4.5 calculator 라이브러리 사용하기 _4.6 HTTP 응답 작성하기 정리
CHAPTER 06 동적 언어와 통합하기 _6.1 파이썬에서의 데이터를 처리하기 _6.2 이동 계획 세우기 _6.3 JSON 파싱하기 _6.4 러스트로 파이썬 확장 모듈을 작성하기 _6.5 러스트에서의 벤치마킹 _6.6 빌드 최적화 정리
CHAPTER 07 러스트 통합 테스트 _7.1 러스트로 테스트를 작성하기 _7.2 파이썬을 사용하여 러스트 코드를 테스트하기 정리
CHAPTER 08 러스트를 사용한 비동기 파이썬 _8.1 파이썬으로 망델브로 집합 생성하기 _8.2 스케일링 _8.3 Asyncio _8.4 스레드 _8.5 GIL _8.6 PyO3 정리
CHAPTER 09 자바스크립트 리팩터링을 위한 웹 어셈블리 _9.1 웹 어셈블리란 무엇인가? _9.2 자바스크립트에서 러스트로 이동하기 _9.3 브라우저 내의 러스트 _9.4 리액트 컴포넌트 만들기 _9.5 완전히 러스트로 작성된 웹 컴포넌트 _9.6 자바스크립트 리팩터링을 개정하기 정리
CHAPTER 10 리팩터링을 위한 웹 어셈블리 인터페이스 _10.1 WASI 유니버설 런타임 _10.2 브라우저에서 머신으로 _10.3 Wasm 라이브러리 _10.4 Wasm 사용하기 _10.5 Wasm에 대해 더 알아보기 _10.6 Wasm 메모리 _10.7 단지 시작일 뿐 정리
출판사리뷰
마이크로소프트, "2030년까지 모든 C/C++ 코드를 러스트로 교체하겠다." 무모한 '재작성'이 아닌, 현명한 '점진적 리팩터링' 전략
최근 마이크로소프트(MS)는 과감한 선언을 내놓았습니다. "1명의 엔지니어가 1달에 100만 줄의 코드를 변환"한다는 목표 아래, AI와 알고리즘을 결합하여 C/C++로 작성한 거대한 코드베이스를 러스트로 현대화하겠다는 야심 찬 계획을 밝혔습니다. 러스트는 단순한 유행을 넘어 리눅스 커널 채택, MS의 전면 도입 등 시스템 프로그래밍의 새로운 표준으로 자리 잡고 있습니다. 메모리 안전성과 C/C++에 버금가는 성능을 동시에 제공하는 러스트의 강점은 명확합니다. 하지만 현업 개발자에게는 현실적인 고민이 남습니다. ‘이미 파이썬, C, 자바스크립트로 짜인 수만 줄의 레거시 코드는 어떻게 할 것인가?’
이러한 난제 앞에서 이 책은 시스템 전체를 폐기하는 무모한 재작성 대신, 점진적 리팩터링이라는 현명한 해법을 제안합니다. C/C++, 파이썬 등 다양한 언어로 작성된 기존 시스템의 기능을 유지하면서 성능이나 안정성이 중요한 부분부터 러스트로 대체해 나가는 전략을 소개합니다. 러스트가 메모리 관리와 병렬 처리를 하는 방법을 실습을 통해 배워 보세요.
대상 독자
기존 애플리케이션의 성능, 메모리 안전성, 유지 보수성을 개선할 방법을 찾고 있는 숙련된 프로그래머
러스트를 배우고 싶거나, 기존 코드를 러스트로 전환하는 실용적인 예제와 전략을 익히고 싶은 개발자
다른 언어로 작성된 기존 애플리케이션에 자신의 러스트 지식을 적용하여 성능이나 안전성을 향상하려는 러스트 프로그래머
C언어를 위주로 개발하는 임베디드 개발자 입장에서 20년 이상 진행해 오면서 느끼는 점을 개선할 방안으로 러스트 ( rust ) 언어로 보고 있었다. 그래서 조금씩 러스트 에 대해서 궁금함을 해결하고자 했다.
이번 한빛미디어에서 제공하는 전자책 (WEB 브라우저 기반) 을 토대로 내용을 검토하였다.
C언어의 단점 을 완벽하게 보안하면서 성능 유지가 가능하다는 것이 가장 큰 장점일 듯 하다.
여기서 이야기하는 갈아타기 ( Refactoring ) 는 단순하게 구현하는 프로그래밍 언어를 변경한다는 의미보다는 성능 향상을 시키고 유지관리를 용이하게 하는 등 다양한 관점에서 코드를 개선하는 작업을 의미한다.
이는 재작성 ( Rewriting ) 과 엄연히 다르다는 것을 먼저 상기 시켜야 할 듯 합니다. (저는 처음에 이 용어로 생각을 하고 해당 도서를 선택했습니다.)
단순하게 재작성을 하자는 게 아니라 코드의 일부를 조금씩 rust로 변경하면서 오류를 유발하는 코드를 신속히 감지하고 수정하면서 점진적으로 프로젝트 전체를 개선해 나가는 취지로 받아들여진다.
책에 앞부분에서 rust의 장점을 극단적으로 보여주는 내용이 있습니다.
csv 문자열에서 값의 합계를 구하는 내용 (파이썬 / 러스트 코드 를 제공)
단순하게 코드를 보아서는 큰 변화를 못 느끼지만, 취급하는 데이터양이 많아질 경우에 동작 시간과 메모리 사용량을 비교한 내용을 보여줍니다. (당연한 결과이겠지만)
100만 개의 줄과 100개의 열로 구성된 동일한 파일을 이용한 결과
나는 임베디드 시스템 개발자로 거의 대부분의 코드를 C언어를 이용하고 있는데, 대량의 코드를 작성하는 경우, 우연히 발생한 오류에 대한 문제점 파악 및 모호한 상황에서 해결책을 찾지 못하는 경우가 많다. 이 때는 프로그래밍언어의 결함(?) 특히 메모리에 무결성을 보장하지 못한다는 단점 때문에 항상 고민을 하게 된다.
러스트가 이런 메모리 안전성을 러스트 컴파일러에 맡기기 때문에 개발자에게는 해당 문제에 대한 부담을 덜어줄 수 있다고 한다.
나는 그래서 유지 보수성이 용이하다는 장점도 있지만 메모리 안전성에 대해서 큰 관심을 가지고 있다.
Rust 문법이 약했던 나에게는 2장에서 소개한 러스트 개요 부분이 Rust 문법을 이애하는 장이 되었으며, 중요 시 하는 부분이 코드의 수명을 파악하면서 어떤 코드가 좀 더 안전한 코드가 되는지를 소개하고 있다. 다만, Rust 를 처음 접하는 저에게는 해당 코드를 따라할 수 있는 환경 구축 내용이 없어서 많은 아쉬움이 남습니다.
(Rust 기초를 위한 별도 도서가 필요한 수준!)
후반으로 가면 HTTP 응용 예제에 대해서 python / javascript 등으로 구현한 코드를 러스트로 갈아타기 하는 내용을 다루고 있으며, 이는 WEB 개발자라는 좀 더 전문 분야에 해당하는 것으로 조금은 실습에 참여하기가 어려웠다.
얼마 전 C/C++을 Rust로 전환하겠다는 기사를 계기로 『러스트로 갈아타기』를 읽게 됐다. 제목만 보면 전면적인 리라이트를 떠올리기 쉽지만, 이 책은 오히려 그 반대에 가깝다. 이미 운영 중인 시스템을 전제로, 병목 구간부터 분리하고 FFI로 공존시키며 점진적으로 전환하는 전략을 다룬다.
리팩터링을 본격적으로 경험해본 적은 없지만, 이 책을 통해 “전부 교체”와 “현상 유지” 사이에 또 다른 선택지가 있다는 것을 배웠다. 경계를 나누고 위험을 계산하며 작은 단위로 옮겨가는 사고방식은 비단 Rust뿐 아니라 어떤 기술 스택에도 적용할 수 있을 것 같다.
솔직히 Rust는 여전히 어렵다. 소유권, 메모리 안정성, FFI, unsafe 같은 개념은 익숙하지 않았고, 이해하는 데도 시간이 필요했다. 그럼에도 도표와 구조도를 활용한 설명 덕분에 추상적인 개념을 따라가는 데 도움이 되었다.
Rust를 배우기 위한 입문서라기보다는, 이미 존재하는 시스템을 어떻게 안전하게 전환할 것인가를 고민하는 개발자에게 더 어울리는 책이다. 당장 마이그레이션을 계획하고 있지 않더라도, 미래의 의사결정을 준비하는 관점에서는 충분히 의미 있는 독서였다.
소위 RIIR(Rewrite It In Rust) 이라는 밈이 있다. 말 그대로 모든 것을 러스트로 다시 재작성하라는 얘기다. 러스트가 메모리 안전성면에서 뛰어나니 다시 재작성하고 싶기는 한데, 러스트 기본 문법을 모르니 어떻게 시작해야할지 막막했다. 그런 와중에 이 책이 엄청나게 도움됐다. 저자 말대로 이 책은 기존 시스템을 분해하고 다시 작성하는 데 초점을 맞춘 언어를 활용해, 그런 상황에서 유용한 여러 패턴을 제공하는 것이다. 따라서 RIIR에 관심있는 프로그래머에게 딱 어울리는 책이다. 다른 언어와 비교하여 설명해야 하기 때문에 처음에 러스트 문법에 대해 다루기는 하지만 기본적으로 이미 러스트 언어를 조금 알고 있다고 가정하고 진행된다. 애시당초 어떤 언어로 작성된 프로젝트를 러스트로 전환하려는 시도를 하려는 것부터 초보가 아니기 때문에 당연한 가정이다.
대상 독자 및 책 난이도
이 책은 러스트가 아닌 다른 언어로 애플리케이션을 다년간 개발한 경험이 있고 애플리케이션의 성능, 안전성, 유지 보수성을 개선할 방법을 찾고 있는 프로그래머를 대상으로 한다. 다른 언어라고는 했지만 주로 C/C++과 파이썬 언어를 중심으로 다룬다. 따라서 각 언어에 대한 기본적인 문법 설명은 없다고 보면 된다. 구조체(struct), 변수 선언이 어떻고, 함수는 어떻게 해야되는지 등등에 대한 설명이 없다는 의미다. 숙련된 프로그래머라면 대략적인 구조만 보고 문법이 비슷하니 대강 파악할 수 있을 것이다. 따라서 단순히 러스트를 익히고 싶은 주니어급 보단 어느 정도 개발 경험이 있는 시니어급 프로그래머가 대상 독자다.
Rust에서 소유권 개념을 시각화하여 설명
위 이미지는 책에서 알려준 러스트의 소유권 개념을 시각화한 이미지다. 코드로 설명하는 것보다 훨씬 더 이해하기 쉽다. 이를 확실하게 이해하기 위해선 러스트 기본 문법을 하나도 몰라도 오른쪽에 적힌 코드가 대충 어떤 일을 하는지 알 수는 있어야 한다.
다루는 내용과 범위
크게 3파트로 나뉜다. 러스트에 대한 설명으로 1~2장을 시작하지만 이 부분은 건너뛴다.
3~4장에서 C/C++과 같은 정적 타입 언어를, 6~8장에서 파이썬과 같은 동적 타입 언어를, 9~10장에서 웹어셈블리를 통한 고급 러스트 활용법을 다룬다. 러스트 언어가 주력으로 밀고있는 특징은 메모리 안전성과 성능이다. 따라서 C/C++보다 메모리 안전성이 뛰어나니 이를 변환하는 방법, 파이썬보다 성능이 뛰어나니 이를 변환하는 방법으로 나뉜 것이다. 이를 위해 FFI와 PyO3를 사용한다.
러스트 코드를 기존 애플리케이션에 통합되는 두 가지 주요 기술을 소개한다.
프로그램에서 러스트 함수를 직접 호출하기(C FFI / PyO3 크레이트 활용)
네트워크를 통한 러스트 서비스 통신
실습 환경은 리눅스 운영체제를 구동하는 컴퓨터 또는 가상머신으로 진행되는데, 윈도우나 맥에서 진행해도 상관없다.
게다가 전체적인 구조도 역시 그림으로 설명해주기 때문에 이해하기 편하다.
결론
RIIR 생각이 있지만 러스트에 대해 아는 것이 없다면 이 책을 적극 추천한다. 단순히 러스트 기본 서적을 보고 다시 작성하는 것보다 이 책을 통해 러스트 기본 개념을 익히고 어떻게 리팩토링 하면 되는지 알면 훨씬 더 수월하다. 다만 아쉬운 점은 C/C++에서 러스트로 갈아타는 이유가 메모리 안전성 때문이라고 하지만 이에 대한 내용이 조금 부족하다. 예를 들어 C/C++에서는 이런 코드를 작성하면 메모리 누수가 날 수 있지만 이걸 러스트로 바꾸면 바로 알 수 있다! 하는 부분은 없다. 단순히 C/C++ 코드를 러스트로 갈아탈 때 어떤 점을 주의해야 하는지에 초점을 맞추고 있다. 책에서 중점적으로 다루는 내용은 러스트로 전환하는 방법이기 때문에 이 이상 깊게 들어갈 필요는 없긴 하다. 어쨌든 정리하자면 러스트로 전환을 고민하는 프로그래머들보다는 러스트로 전환을 결정한 프로그래머들에게 꼭 필요한 책이다.
솔직히 말하면 러스트를 써본 적이 없다. 주력 스택은 TypeScript/React이고, 평소에 메모리 관리나 컴파일러 같은 키워드는 나와 거리가 멀다고 생각했다. 그런데 요즘 프론트엔드 생태계를 보면 러스트가 자꾸 눈에 들어온다. Next.js에 내장된 SWC, Webpack을 대체하려는 Turbopack, 그리고 Go로 만들어진 esbuild까지. 내가 매일 쓰는 도구들의 내부가 슬슬 "자바스크립트가 아닌 언어"로 바뀌고 있었다.
그래서 궁금했다. 러스트가 대체 뭐길래, 기존에 잘 돌아가던 JS 도구들을 굳이 다른 언어로 다시 만드는 걸까? "러스트로 갈아타기"라는 제목이 그 질문에 대한 답을 줄 것 같았다.
리팩터링이라는 접근법
책을 펼치고 처음 느낀 건, 이 책이 "러스트를 배우자"가 아니라 "기존 코드를 러스트로 조금씩 바꿔보자"에서 출발한다는 점이었다. 1장부터 리팩터링과 재작성(rewriting)의 차이를 꽤 분명하게 나눈다.
재작성은 시스템 전체를 처음부터 다시 만드는 것이고, 리팩터링은 가장 개선이 필요한 부분만 찾아 최소한의 코드를 교체하는 것이다. 책은 후자를 권하는데, 전체를 한 번에 바꾸면 뭐가 문제인지 찾기 어렵고 기존 코드에 쌓인 수년간의 프로덕션 경험까지 잃게 되기 때문이다.
실제로 Discord는 Go로 작성된 서비스 중 지연 시간이 문제였던 부분만 러스트로 교체해 성능을 크게 개선한 사례가 있다. 이 책도 같은 맥락에서 "성능이 필요한 함수 하나만 러스트로 빼자"는 방식을 제안한다. 이 전제 덕분에 러스트를 처음 접하는 개발자도 부담 없이 읽을 수 있었다.
소유권과 대여
2장에서 러스트의 핵심인 소유권(ownership)과 대여(borrowing)를 다룬다. JS 개발자로서 이 부분이 가장 낯설었다.
자바스크립트에서는 변수를 함수에 넘기면 참조가 전달될 뿐, 원래 변수는 아무 영향 없이 계속 쓸 수 있다. 그런데 러스트에서는 값을 함수에 넘기면 소유권 자체가 이동한다. 원래 변수는 더 이상 그 값을 쓸 수 없다.
자바스크립트에서는 볼 수 없는 에러다. JS의 가비지 컬렉터는 "아무도 안 쓰는 것 같으면 알아서 치워줌" 방식이라 개발자가 메모리를 신경 쓸 일이 없다. 반면 러스트는 가비지 컬렉터 없이 컴파일러가 소유권 규칙으로 메모리 안전성을 보장하기 때문에, 잘못된 코드는 실행 자체가 되지 않는다.
C 언어도 개발자가 메모리를 직접 관리하지만 실수해도 컴파일은 통과되고, 문제는 런타임에 가서야 터진다. 반면 러스트는 컴파일 단계에서 소유권 규칙 위반을 잡아내기 때문에 애초에 잘못된 코드가 실행되지 않는다. C가 1972년에 만들어져 이런 검증 개념 자체가 없었던 반면, 러스트는 2015년에 등장하면서 그동안 축적된 경험을 바탕으로 소유권 시스템을 언어 설계 단계에서 녹여냈다.
이 책에서 수명 그래프(lifetime graph)를 시각화해 보여주어 이해가 쉬웠다. 값이 언제 생성되고, 언제 유효하며, 언제 소멸하는지를 그래프로 보여주었다. 소유권이나 대여 같은 추상적인 개념을 글로만 보게 되면 머리에 잘 들어오지 않는데, 수명 그래프 덕분에 "art1이 여기서 생성되고, admire_art에 소유권이 넘어가고, 함수가 끝나면서 메모리가 해제되는구나"를 시각적으로 따라갈 수 있었다.
또 한 가지 흥미로운 건 mut 키워드다. JS에서는 const를 써야 불변이고 let이 기본적으로 가변인데, 러스트는 반대로 기본이 불변이고 mut를 명시적으로 붙여야 변경할 수 있다. "변경은 의도적으로 하라"는 언어 설계 철학이 느껴졌다. TypeScript의 readonly와 방향성은 비슷하지만, 러스트는 이걸 언어 전체에 걸쳐 강제한다는 점에서 훨씬 강력하다.
프론트엔드와 WebAssembly
9장이 프론트엔드 개발자로서 가장 흥미로웠다. 러스트로 작성한 코드를 WebAssembly(WASM)로 컴파일해서 브라우저에서 실행하는 방법을 다룬다.
책에서는 세 가지 접근법을 보여준다.
스크립트: 웹 페이지에서 WASM 함수를 직접 호출하는 가장 단순한 방식
모듈: 러스트 WASM을 npm 패키지처럼 React 프로젝트에 import해서 사용하는 방식
컴포넌트: Yew라는 프레임워크로 UI까지 전부 러스트로 작성하는 방식
이 중 두 번째, 모듈 방식이 가장 써볼 만하다고 느꼈다. Vite + React 프로젝트를 생성하고, 데이터 처리 같은 무거운 로직만 러스트로 작성해서 WASM 모듈로 가져오는 구조다. UI는 React(JSX)로 그대로 유지하고, 연산 함수만 러스트로 대체하는 것이다. 전부 갈아엎는 게 아니라 부분적으로 교체한다는 점에서, 1장에서 이야기한 리팩터링의 철학이 그대로 적용된다.
Yew 프레임워크도 인상적이었다. React와 비슷한 컴포넌트 기반 프레임워크인데, 상태 관리 방식이 React의 useReducer 패턴과 놀라울 정도로 닮아있다. State, Action, update(reducer), view(render)의 구조가 거의 동일하다. 프레임워크가 달라도 UI 상태 관리 패턴은 결국 같은 방향으로 수렴한다는 걸 확인할 수 있었다.
총평
이 책의 가장 큰 미덕은 "전부 바꾸지 말고, 필요한 부분만 러스트로 교체하라"는 점진적 접근법에 있다. 이미 다른 언어로 일하고 있는 개발자가 러스트를 시작하기에 부담이 적고, C FFI, 파이썬(PyO3), 자바스크립트(WASM)까지 다양한 통합 시나리오를 구체적인 예제로 다룬다는 점도 좋았다. 앞서 언급한 수명 그래프처럼 추상적인 개념을 시각적으로 풀어내는 방식도 인상적이었다.
다만 예제가 주로 C와 파이썬 중심이라, 9장의 WASM 파트가 있긴 하지만 전체 분량에서 차지하는 비중은 크지 않다. 웹 생태계에서 러스트가 어떻게 작용하는지 맛볼 수 있다는 점에서 좋았지만, 이 책의 범위상 어쩔 수 없다 하더라도 좀 더 깊이 다뤄줬으면 하는 아쉬움이 있었다. 2장에서 소유권과 대여를 다루면서 스택/힙, 메모리 할당 같은 저수준 개념이 바로 등장하는 것도 가비지 컬렉션 언어만 써온 개발자에게는 가파르게 느껴질 수 있는데, 책에서도 "주로 C/C++ 경험이 있는 독자를 대상으로 한다"고 안내하고 있으니 해당 부분은 넘어가도 된다.
누구에게 추천하는가
C나 파이썬 기반 프로젝트에서 성능 병목이 있거나, 메모리 안전성이 필요한 부분을 개선하고 싶은 개발자에게 가장 적합하다.
프론트엔드 개발자라면 9장의 WASM 파트를 중심으로 읽는 것을 추천한다. 러스트를 처음 접하더라도 1-2장에서 소유권과 대여의 기본 개념을 잡고, 9장에서 "내 React 프로젝트에 러스트를 어떻게 끼워 넣을 수 있는지"를 확인할 수 있다. 당장 러스트를 실무에 쓰지 않더라도, 내가 매일 사용하는 SWC나 Turbopack 같은 도구가 왜 러스트로 만들어졌는지 이해하는 데 도움이 된다.
러스트를 전혀 모르는 상태에서 읽어도 따라갈 수 있었지만, 편하게 읽히는 책은 아니다. 소유권 같은 개념은 JS에서는 접할 일이 없는 영역이라 낯설게 느껴질 수밖에 없다. 그래도 그 낯섦 자체가 시야를 넓혀주는 경험이었다.
불과 2년전, 내가 러스트를 처음 배울 때만 하더라도 자바, 자바스크립트, 파이썬과 같은 다른 언어에 비해 러스트를 다루는 도서가 국내에 많이 없었는데, 요즘은 1~2 달에 한권씩 러스트 신간 소식이 들려온다.
러스트 관련 신간 소식을 들으면 목차를 살펴보는 편인데, 입문서, 초급자에 관한 도서는 많이 있지만 중고급 내용을 다루는 도서가 많이 없다는 것을 느꼈다. 문법 이외에 좀 더 심화 내용을 중점으로 다루는 도서를 찾고 있었는데, 그런 의미에서 이 도서가 그 고민을 조금 해소해주었다.
러스트로 갈아타기는 C, 파이썬, 자바스크립트 언어를 사용하다가 성능, 속도의 한계에 부딪혀 러스트로 갈아타기 위한 사람들을 위한 도서이다. 이 도서의 핵심은 FFI(Foreign Function Interface)이다. 국내에 출판된 책 중, 문법을 설명하다가 그냥 FFI를 언급하는 것 말고, 탄탄한 실습물과 함께 FFI를 다루는 도서는 없었던 것 같은데 이 도서에서는 C로 작성된 NGINX를 Rust로 갈아끼워 보면서 고급 FFI에 대해 집중적으로 다룬다.
러스트가 아무리 좋은 언어라지만 회사에서 그냥 다짜고짜 '백악관에서 C/C++ 사용을 금지했대요', '요즘 MZ는 Go, Rust 쓴다더라'를 들먹이며 이미 잘 돌아가고 있는 코드를 러스트로 바꾸는 것은 쉽지 않다.
?
대신 러스트로 변경했을 때 얻는 이점들을 눈으로 보이는 성능, 속도 등 정확한 지표를 들고 간다면 그래도 어깨 펴고 말할 수 있을 것 같다. 6장에서는 여러 케이스에 대한 벤치마크를 두고 비교하는 방법을 다루고 있다.
이 도서에서 마음에 들었던 부분은 unsafe 코드에 대해 다루고, target/debug 디렉터리에 대해 설명한다는 점이다. 이 글의 목적이 unsafe나 target/debug 디렉터리를 설명하는 글이 아니라 서평이니 이에 대한 자세한 설명은 책을 참고하면 되고, 간단하게 설명만 해보자면, unsafe 코드는 컴파일러에게 "이 영역은 개발자인 내가 전적으로 책임질게 너는 신경 쓰지 마"라고 이야기 하는 코드이고, target/debug는 cargo build 명령어를 통해 생성되는 빌드 결과물이다.
C 프로그램을 컴파일 하고 Rust로 링킹하는 과정, FFI를 다루는 과정에서 자연스레 unsafe와 target/debug를 설명하는 부분이 마음에 들었다.
cargo build로 자동 생성된 target 디렉터리
이런 분들에게 추천합니다.
러스트 문법을 배웠고, C, Python, JavaScript 중 하나에 경험이 있는 분.
FFI에 대해 더 깊이 파고들고 싶은 분.
이런 분들에게는 권하지 않습니다.
아직 러스트 입문자이신 분.
1, 2 장에서 borrow check, lifetime 등 기본적인 내용에 대해 다루기는 하지만 전반적인 문법에 대해 설명하는 도서가 아니기 때문에 러스트에 완전히 경험이 없는 분들은 이 도서 이전에 다른 기본서를 먼저 읽는 것을 권합니다.
코드 작성이 귀찮으신 분.
대부분의 프로그래밍 언어 관련 도서가 그렇듯 도서 예제들을 직접 따라치지 않고서는 실력이 늘지 않습니다. 이 도서에서는 꽤 많은 양의 실습 코드를 포함하고 있습니다.
번외로 C에서 Rust로 갈아타는 부분을 읽다가 2025 Rust Conf의 한 발표 내용이 떠올랐다.
이 도서에서 C에서 Rust로 갈아타는 방법에 대해 배운 뒤, 현업에서는 실제로 어떨지 궁금증이 생길 수 있다. 아래 영상에서 현업, 리얼 월드에서 러스트로 환승시 마주하는 문제는 무엇인지 엿볼 수 있다.
제목처럼 단순히 Rust가 빠르고 안전하다를 외치는 책이 아니라, 기존 시스템을 유지하면서 점진적으로 Rust를 도입하는 전략을 단계적으로 제시한다는 점이 가장 큰 차별점이다.
이 책의 강점은 이상적인 아키텍처 설계가 아니라, 현업에서 실제로 가능한 리팩터링 시나리오를 보여준다는 점이다.
C/C++ 기반 코드, 성능 병목이 존재하는 서비스, 테스트가 부족한 레거시 환경 등 우리가 흔히 마주하는 상황을 전제로한다.
FFI 연동, 모듈 단위 치환, 성능 비교, 안정성 검증까지 구체적인 흐름을 설명한다.
단순한 문법 안내서가 아니라, 어디서부터 손대야하는가에 대한 전략서에 가까운 것 같다.
4년차 프론트엔드 개발자인 내 입장에서는 특히 좋았던 부분은 두가지다.
첫째, 안정성과 성능을 동시에 확보하는 사고방식
개발을 하다보면 성능 최적화는 주로 렌더링, 번들사이즈, 네트워크 레벨에서 고민한다. 하지만 Rust의 소유권 모델과 메모리 안정성 개념은 런타임에서 잡는 에러를 컴파일 타임에 제거한다는 사고전환을 요구한다. 이는 React 상태관리나 서버 상태 캐싱 전략을 고민할 때도 충분히 응용 가능한 사고 구조다.
둘째, 점진적 마이그레이션
우리는 종종 Next.js로 갈아탈까 ? TS로 전환할까? 같은 고민을 하는데, 이 책은 대규모 전환에서 중요한것은 기술 선택이 아니라 리스크 관리와 경계 설정임을 강조한다.
이는 프론트엔드에서 마이크로 프론트엔드 도입이나 모노레포 전환을 고민할 때도 동일하게 적용된다.
또한, 이 책은 Rust의 장점을 단순히 성능 수치로만 설명하지 않는다.
동시성 모델, 에러 처리 방식, 테스트 전략까지 포함해 왜 유지보수성이 올라가는지를 설득력 있게 보여준다.
성능 최적화에 관심이 있거나, WebAssembly와 Rust를 연계해보고 싶은 프론트엔드 개발자라면 특히 큰 인사이트를 얻을 수 있다.
최근 프론트엔드에서도 WASM 기반 라이브러리 활용이 늘어나는 만큼, Rust에 대한 이해는 더 이상 백엔드 개발자만의 영역이 아니다.
아쉬운 점을 꼽자면, Rust 자체에 대한 기초 이해가 전혀 없는 상태라면 다소 난이도가 있을 수 있다.
하지만 기본 문법을 알고 있는 개발자라면, 이 책은 언제, 어떻게 써야 하는가에 대한 해답을 준다.
결론적으로 러스트로 갈아타기는 Rust 입문서가 아니다.
대신 레거시 시스템을 현실적으로 개선하려는 개발자를 위한 전략서다. 프론트엔드 개발자라 하더라도, 시스템 설계 관점과 성능에 대한 시야를 넓히고 싶다면 충분히 읽어볼 가치가 있다.
기술을 ‘배우는’ 책이라기보다, 기술을 ‘도입하는 방법’을 배우는 책이라는 점에서 2026년 현재 시점에 매우 시의적절한 한 권이라고 생각한다.
이 책을 읽고 나서 가장 먼저 든 생각은 이 책이 "Rust 문법서"라기보다 "레거시 시스템을 망가뜨리지 않고 바꾸는 방법론"에 가깝다는 점이었다.
점진적 리팩터링 철학이 분명하다
초반부는 리팩터링과 재작성의 차이를 계속 대비한다. 핵심 메시지는 단순하다. 큰 재작성 한 번보다 작은 변경을 빠르게 배포하고, 테스트와 모니터링으로 검증하면서 교체하라는 것이다. 이 관점이 마음에 들었던 이유는, 책이 "Rust가 빠르다"를 반복하는 데서 끝나지 않고 "운영 중 서비스에서 어떻게 위험을 줄일지"를 함께 다루기 때문이다.
2장은 소유권/대여/수명이라는 Rust 핵심 개념을 시각화해서 설명한다. 실제로 본문에 E0382, E0502, E0106 같은 대표 에러가 계속 등장하는데, 그냥 문법 암기보다 "왜 컴파일러가 막는지"를 납득하게 만들어 준다. 특히 수명 그래프를 시각적으로 곁들여 설명하는 구간은 Rust를 처음 진지하게 공부할 때 꽤 도움이 된다고 생각한다.
중반부는 C FFI, NGINX 예제가 강력하다
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를 처음 실무에 도입할 때 참고하기 좋을 것 같다고 느꼈다.
후반부는 Python, 테스트, WASM까지 이어진다
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 -> 러스트 순서로 이 분야에 대해 관심 있게 보고 있는데 다시 한 번 읽어보면서 열심히 공부를 해야겠다고 느꼈다.