Rust 입문 시작 - 소유권 개념 이해하기

왜 Rust인가

최근 마이크로서비스 중 일부 API의 응답 속도 이슈로 병목 지점을 분석하던 중, CPU 집약적인 데이터 처리 로직이 문제였다. Node.js로는 한계가 있어 보였고, Go와 Rust를 비교하다 Rust의 메모리 안정성 보장이 매력적으로 느껴져 학습을 시작했다.

소유권의 기본 규칙

Rust의 핵심은 소유권 시스템이다. GC 없이 컴파일 타임에 메모리 안정성을 보장한다.

fn main() {
    let s1 = String::from("hello");
    let s2 = s1; // s1의 소유권이 s2로 이동
    
    // println!("{}", s1); // 컴파일 에러
    println!("{}", s2); // 정상
}

처음엔 이 개념이 너무 낯설었다. JavaScript에서는 변수 할당이 자유롭게 이루어지는데, Rust는 한 값에 대한 소유자가 명확히 하나만 존재한다.

참조와 빌림

소유권을 이전하지 않고 값을 사용하려면 참조를 쓴다.

fn calculate_length(s: &String) -> usize {
    s.len()
}

fn main() {
    let s1 = String::from("hello");
    let len = calculate_length(&s1);
    println!("{}, {}", s1, len); // s1 여전히 사용 가능
}

& 기호로 참조를 빌려주고, 함수 종료 후에도 원래 변수를 사용할 수 있다. 가변 참조(&mut)는 동시에 하나만 존재할 수 있어 데이터 레이스를 컴파일 타임에 방지한다.

소감

아직 학습 초기라 생산성은 떨어지지만, 컴파일러가 메모리 버그를 미리 잡아주는 경험은 신선하다. 당장 프로덕션에 적용하긴 어렵지만, 성능 크리티컬한 부분에 점진적으로 도입해볼 계획이다.