
Rust--: 안전벨트 없는 슈퍼카를 운전해본다는 것
Rust의 대여 검사기(Borrow Checker)를 제거한 Rust-- 프로젝트를 통해, 개발에서의 제약과 안전장치가 왜 중요한지 풀링포레스트 CTO 송찬영이 전합니다.
송찬영
CTO

안녕하세요. 풀링포레스트 CTO 송찬영입니다.
최근 깃허브 트렌드를 살펴보다가 등골이 오싹해지면서도 흥미로운 프로젝트 하나를 발견했습니다. 이름하여 Rust-- (Rust minus minus). 이름에서 알 수 있듯이, Rust 컴파일러의 핵심이자 수많은 입문자를 좌절하게 만드는 'Borrow Checker(대여 검사기)'를 비활성화한 포크 버전입니다.
Rust를 다루는 개발자라면 누구나 한 번쯤 컴파일러와 씨름하며 "아니, 이게 왜 안 돼?"라고 외쳐본 경험이 있을 겁니다. Rust--는 바로 그 불만을 기술적으로 해결(?)해버린 프로젝트입니다.
이 컴파일러를 사용하면 우리가 금기시했던 코드들이 마법처럼 작동합니다.
예를 들어, 소유권이 이동된(Move) 변수를 다시 사용해도 에러가 나지 않습니다.
가변 참조자(&mut)를 동시에 여러 개 만들어도 컴파일러는 침묵합니다.
심지어 루프 안에서 소유권을 밖으로 던져도 아무런 제지를 하지 않죠.
솔직히 고백하자면, Rust--의 예제 코드를 보며 묘한 해방감을 느꼈습니다. "그래, 코딩은 원래 이렇게 자유로운 거였지"라는 생각이 스치더군요. 하지만 이내 그 자유가 얼마나 위험한 것인지 깨닫는 데는 그리 오랜 시간이 걸리지 않았습니다.
개발자로서 우리는 종종 '제약'을 '장애물'로 인식하곤 합니다.
"이 기능을 빨리 배포해야 하는데 테스트 코드가 발목을 잡네."
"로직은 완벽한데 린트(Lint) 규칙이 너무 까다로워."
"Rust 컴파일러가 너무 보수적이야."
하지만 Rust--가 보여주는 세상은 제약이 사라진 유토피아가 아닙니다. 그것은 메모리 누수, 데이터 레이스(Data Race), 그리고 런타임에 불현듯 찾아올 세그멘테이션 폴트(Segmentation Fault)가 도사리는 디스토피아에 가깝습니다. Borrow Checker가 없는 Rust는 사실상 '문법만 세련된 C++'이나 다름없으니까요.
풀링포레스트에서도 초기에는 속도를 위해 프로세스를 간소화하자는 목소리가 컸습니다. "PR 리뷰를 꼭 2명이나 해야 하나요?", "배포 전 스테이징 테스트가 꼭 필요한가요?" 같은 질문들이었죠. 한때는 저 역시 유연함이라는 명목하에 몇 가지 안전장치를 푼 적이 있었습니다. 그리고 그 결과는 뼈아팠습니다. 사소한 핫픽스가 메인 결제 로직을 망가뜨렸고, 우리는 주말을 반납해야 했습니다.
그때 깨달았습니다. 컴파일러의 에러 메시지, 동료의 까다로운 코드 리뷰, 귀찮은 CI/CD 파이프라인은 우리를 괴롭히기 위한 것이 아닙니다. 그것은 시속 300km로 달리는 슈퍼카에 장착된 브레이크이자 안전벨트입니다. 안전장치가 있기에 우리는 두려움 없이 가속 페달을 밟을 수 있는 것입니다.
Rust-- 프로젝트는 역설적으로 '왜 Rust가 위대한 언어인가'를 증명합니다. 컴파일 타임에 우리의 실수를 잡아주는 그 깐깐한 선생님 덕분에, 우리는 프로덕션 환경에서 발 뻗고 잘 수 있는 것이죠.
물론 학습용으로 Rust--를 돌려보는 것은 아주 좋은 경험이 될 것입니다. Borrow Checker가 막아주던 에러들이 실제로 어떤 런타임 문제를 일으키는지 눈으로 확인해 본다면, 빨간 에러 메시지가 오히려 고맙게 느껴질 테니까요.
오늘도 컴파일 에러와 싸우고 계신가요? 그것은 여러분이 느려서가 아닙니다. 더 견고한 시스템을 만들기 위해 시스템이 여러분을 돕고 있는 중입니다. 그 제약 속에서 성장하는 즐거움을 느끼시길 바랍니다.


