Rust 첫 프로젝트: CLI 도구를 만들며 배운 소유권 개념
배경
팀에서 사용하는 간단한 파일 파싱 CLI 도구가 있었다. Node.js로 작성되어 있었는데, 배포 시 node_modules를 함께 포함해야 하는 불편함이 있었다. Rust를 학습할 겸 이 도구를 재작성해보기로 했다.
소유권 개념과의 첫 만남
첫 컴파일부터 에러의 연속이었다. 가장 당황스러웠던 것이 소유권(Ownership) 개념이다.
fn main() {
let content = read_file("input.txt");
process_data(content);
save_result(content); // error: value borrowed here after move
}
content를 process_data에 넘긴 순간 소유권이 이동해서, 다시 사용할 수 없다는 에러였다. JavaScript에서는 전혀 고민할 필요 없던 부분이다.
해결 방법
참조자(Reference)를 사용하면 소유권을 빌려올 수 있다.
fn process_data(content: &String) -> ProcessedData {
// content를 읽기만 함
}
fn main() {
let content = read_file("input.txt");
let result = process_data(&content);
save_result(&content); // OK
}
&를 붙여 참조로 전달하면 소유권은 그대로 유지된다. 가변 참조가 필요하면 &mut를 사용한다.
배운 점
- 소유권 시스템이 메모리 안전성을 컴파일 타임에 보장한다
- 처음엔 불편하지만, 런타임 에러를 사전에 방지하는 강력한 장치다
cargo build --release로 빌드한 바이너리는 20MB 정도로, 단일 실행 파일이라 배포가 편하다
아직 라이프타임(Lifetime) 개념은 제대로 이해하지 못했다. 좀 더 복잡한 프로젝트를 진행하며 익혀야겠다.