POOOLING FOREST
눈으로만 배우는 기술은 없다: Rust 도입을 망설이는 당신에게 - 풀링포레스트 CTO 송찬영이 전하는 Rust 도전기. 책만 읽는 공부에서 벗어나 직접 코드를 짜며 느낀 Ru
Engineering & Tech

눈으로만 배우는 기술은 없다: Rust 도입을 망설이는 당신에게

풀링포레스트 CTO 송찬영이 전하는 Rust 도전기. 책만 읽는 공부에서 벗어나 직접 코드를 짜며 느낀 Rust의 혁명적인 타입 시스템과 에러 처리 철학, 그리고 실전 학습의 중요성을 공유합니다.

송찬영

CTO

안녕하세요. 풀링포레스트 CTO 송찬영입니다.

기술 리더로서 항상 새로운 기술 스택을 검토하고 도입 여부를 결정하지만, 정작 저 스스로가 새로운 언어를 배우는 과정은 늘 험난합니다. 최근 몇 년간 저를 괴롭혔던 화두는 단연 Rust였습니다. 솔직히 고백하자면, 저는 'The Rust Programming Language' 책을 사놓고 4장에서 매번 포기했습니다. 마치 수학 정석의 집합 부분만 새까맣게 손때가 묻은 고등학생처럼 말이죠. 매뉴얼(RTFM)만 열심히 읽고 연습 문제는 건너뛰면서 시험을 잘 볼 수 있다고 믿었던 오만함이 저에게도 있었습니다.

과거 대학 시절과 실무 초기에는 C++이 제 모국어와 다름없었습니다. 특히 미션 크리티컬한 환경에서는 시스템의 결정론적 동작(deterministic)이 무엇보다 중요했기에, 화려한 최신 언어보다는 투박하지만 확실한 C/C++를 선호했습니다. 하지만 메모리 안전성과 병렬 처리에 대한 요구가 커지면서 Rust는 더 이상 외면할 수 없는 흐름이 되었습니다. 그래서 올해는 책을 덮고, 무작정 코드를 '작성'해보기로 결심했습니다.

시작은 rustlings였습니다. 문법을 익히는 데는 좋았지만, 야생의 코드를 짠다는 느낌은 부족했습니다. 그래서 선택한 것이 'Raytracing in One Weekend'의 Rust 포팅과, 리눅스 방화벽인 OpenSnitch의 TUI(Terminal UI)를 만드는 사이드 프로젝트였습니다.

결과물이 눈에 바로 보이는 프로젝트를 시작하자 학습 곡선이 달라졌습니다. 특히 TUI를 만들면서 tokiotonic을 이용해 gRPC 통신을 구현하는 과정은 그야말로 피 튀기는 전쟁이었습니다. 머리로는 이해했다고 생각했던 Borrow Checker(대여 관리자)가 컴파일러 단에서 제 코드를 거부할 때마다, 익숙한 C++이나 Go로 도망치고 싶은 유혹이 굴뚝같았습니다.

하지만 그 고통스러운 과정을 견디고 나니, 왜 시스템 프로그래밍 생태계가 Rust에 열광하는지 뼈저리게 느꼈습니다.

  • 첫째, 데이터를 포함한 Enums(열거형)은 가히 혁명적입니다. 네트워크 프로토콜이나 복잡한 상태 머신을 다룰 때, Rust의 타입 시스템은 개발자가 발등을 찍을(foot-gun) 가능성을 원천 차단해 줍니다.

  • 둘째, 에러 처리 철학입니다. 예외(Exception)를 던지고 숨기는 대신, Result 타입을 통해 명시적으로 에러를 처리하게 강제하는 방식은 시스템의 안정성을 설계 단계에서부터 보장합니다.

물론 아쉬움도 있습니다. C/C++로 작업할 때는 데이터가 스택에 있는지 힙에 있는지, 메모리 정렬(Alignment)이 어떻게 되는지 명확하게 그려졌습니다. 반면 Rust, 특히 tokio 같은 비동기 런타임 위에서는 데이터의 위치가 다소 불투명하게 느껴집니다. 컴파일러의 마법이 이를 최적화해주겠지만, 로우 레벨 최적화에 익숙한 엔지니어에게는 여전히 블랙박스처럼 느껴지는 영역이 존재합니다.

재미있는 점은 이번 프로젝트에서 LLM(AI)의 도움을 최소화했다는 것입니다. Interior Mutability 같은 난해한 개념을 이해하거나 비동기 타임아웃 처리를 구현할 때만 1% 정도 도움을 받았고, 나머지 99%는 직접 부딪혔습니다. AI가 코드를 짜주면 결과는 빠르겠지만, '내 것'이 되는 과정은 생략되기 때문입니다.

이제 막 Rust를 시작하려는 분들, 혹은 도입을 고민하는 팀에게 드리고 싶은 말씀은 하나입니다. 책만 읽지 마세요. 지금 당장 터미널을 열고 컴파일러와 싸우십시오. 조직 차원에서 보면 기존의 레거시(기술 부채)와 혁신 사이에서 고민이 많을 것입니다. Rust 코드가 처음에는 C++보다 읽기 힘들고 흉측해 보일 수 있습니다. 하지만 그 엄격한 제약 사항들이 결국 우리를 더 안전한 코드로 안내하는 가드레일이 되어줄 것입니다.

과정을 신뢰하십시오(Trust the Process). 아니, Rust의 문법을 빌려 말하자면 <T>rust the process라고 해야겠네요. 저도 이제야 겨우 그 과정의 즐거움을 알게 되었습니다. 여러분도 그 즐거움을 놓치지 않으시길 바랍니다.

지금 읽으신 내용, 귀사에 적용해보고 싶으신가요?

상황과 목표를 알려주시면 가능한 옵션과 현실적인 도입 경로를 제안해드립니다.