Rust 시리즈 전체 목차 | 메모리 안전한 시스템 프로그래밍
이 글의 핵심
Rust는 소유권을 이해하기 전과 후의 학습 속도가 크게 다른 언어라, 순서를 지켜 읽는 편이 효율적입니다. 초급·중급·고급으로 나눈 목차와 처음 배우는 사람, 실무 적용이 목적인 사람, C++에서 넘어오는 사람별 추천 경로, 자주 묻는 질문과 공식 학습 자료를 한곳에 모았습니다.
시리즈 소개
Rust는 가비지 컬렉터 없이 메모리 안전성을 보장하는 시스템 프로그래밍 언어입니다. 이 시리즈는 설치와 기본 문법에서 시작해 소유권, 트레이트, 동시성과 비동기, 웹 API와 CLI 도구 제작까지 순서대로 다룹니다.
Rust의 컴파일러는 소유권과 빌림 규칙으로 댕글링 참조, 해제 후 사용, 데이터 레이스를 컴파일 단계에서 막습니다. 다만 메모리 누수는 안전성 위반으로 보지 않으므로, Rc 순환 참조나 std::mem::forget으로 생기는 누수까지 막아 주지는 않습니다. 이런 검사를 대부분 컴파일 타임에 하기 때문에 런타임 비용 없이 안전성을 얻는다는 것이 Rust의 핵심 장점입니다.
전체 목차
입문 (초급)
#01 Rust 시작하기
약 18분 · 초급
- Hello World부터 Cargo 기본 사용법까지
- Rust 설치, 프로젝트 생성, 빌드/실행
- 변수, 불변성, 스칼라/복합 타입 기초
중급
#02 소유권 (Ownership)
약 16분 · 중급
- 소유권, 빌림, 라이프타임
- 스택과 힙, 소유권 이동, 참조와 빌림
- 댕글링 참조 방지, 라이프타임 명시
#03 구조체와 열거형
약 26분 · 중급
- 구조체 정의, 메서드, 연관 함수
- 열거형(Enum), Option, Result
- 패턴 매칭(match), if let, while let
#04 에러 처리
약 23분 · 중급
- Result와 Option으로 에러 표현
- ? 연산자로 에러 전파
- panic! vs Result, unwrap vs expect
- 커스텀 에러 타입 정의
#05 트레이트 (Trait)
약 31분 · 중급
- 트레이트로 공통 행동 정의
- 제네릭과 트레이트 바운드
- 트레이트 객체(dyn Trait), 동적 디스패치
- 연관 타입, 기본 구현
#06 컬렉션
약 17분 · 중급
- Vec: 동적 배열, push, pop, 슬라이싱
- HashMap, HashSet: 키-값 저장, 중복 제거
- iter(), into_iter(), iter_mut() 차이
- 컬렉션에 적용되는 소유권과 빌림 규칙
#10 테스팅
약 26분 · 중급
- cargo test로 단위/통합 테스트
- #[test], #[should_panic], assert! 매크로
- tests/ 디렉터리 구조, 모의 객체
- Criterion으로 벤치마크
#11 CLI 도구 만들기
약 24분 · 중급
- clap으로 커맨드라인 인자 파싱
- 파일 읽기/쓰기, 에러 처리
- stdin/stdout 표준 입출력
- cargo install로 바이너리 배포
고급
#07 동시성 (Concurrency)
약 29분 · 고급
- Thread로 병렬 실행, join(), move 클로저
- Channel로 스레드 간 메시지 전달
- Arc<Mutex
>로 공유 상태 관리 - 데이터 레이스 방지, Send/Sync 트레이트
#08 비동기 프로그래밍
약 18분 · 고급
- async/await 키워드, Future 트레이트
- Tokio 런타임 설정, 태스크 생성
- 비동기 I/O, 타임아웃, select!
- Pin, Unpin, 비동기 트레이트
#09 웹 개발 (Actix-web)
약 25분 · 고급
- Actix-web으로 REST API 구축
- 라우팅, JSON 직렬화 (serde)
- 미들웨어, 에러 핸들링, 상태 관리
- 데이터베이스 연동 (diesel, sqlx)
#12 C++ 개발자를 위한 Rust
약 25분 · 고급
- C++ vs Rust: 메모리 관리 비교
- unique_ptr/shared_ptr → Box/Rc/Arc
- RAII, 이동 의미론, 소유권 대응
- 성능, FFI, 마이그레이션 전략
학습 경로
처음 배우는 경우
#01 시작하기 → #02 소유권 → #03 구조체/열거형 → #04 에러 처리
기본 문법과 소유권 시스템을 익히는 경로입니다. 여기까지 읽고 나면 작은 프로그램을 빌림 검사기와 크게 다투지 않고 작성할 수 있는 토대가 생깁니다.
실무 도구를 만들려는 경우
#05 트레이트 → #06 컬렉션 → #10 테스팅 → #11 CLI 도구
제네릭과 컬렉션을 다루고, 테스트를 갖춘 CLI 도구를 끝까지 만들어 보는 경로입니다.
서버 애플리케이션을 만들려는 경우
스레드와 공유 상태, Tokio 기반 비동기, Actix-web REST API로 이어지는 경로입니다. #05 트레이트를 먼저 읽어 두면 에러 메시지를 해석하기 훨씬 쉽습니다.
C++에서 넘어오는 경우
#12 C++ 비교 → #02 소유권 → #07 동시성 → #08 비동기
C++의 RAII, 이동 의미론, 스마트 포인터와 Rust 개념을 대응시켜 본 뒤 소유권과 동시성으로 넘어가는 경로입니다.
소유권을 먼저 배치한 이유
목차에서 #02 소유권을 입문 바로 다음에 둔 이유는, Rust의 나머지 기능이 모두 소유권 규칙 위에서 설계되었기 때문입니다. 구조체에 참조를 담으려는 순간 라이프타임이 필요하고, 컬렉션을 순회하면서 수정하려고 하면 빌림 규칙에 걸리며, 스레드에 값을 넘길 때는 move 클로저와 Send 트레이트가 등장합니다. 소유권을 건너뛰고 웹 프레임워크 예제부터 따라 하면, 코드는 복사해서 돌아가도 조금만 고치면 컴파일 에러가 쏟아지는 상태가 오래 이어집니다.
반대로 동시성(#07)과 비동기(#08)를 고급으로 분류한 것은 문법이 어려워서가 아니라, 트레이트(#05)와 스마트 포인터 개념을 함께 알아야 에러 메시지를 해석할 수 있기 때문입니다. Arc<Mutex<T>>가 왜 필요한지는 “여러 스레드가 소유권을 나눠 가져야 한다”는 문제를 직접 겪어 봐야 납득이 됩니다.
공부하다가 자주 막히는 지점
Rust를 처음 배울 때 가장 많이 보게 되는 에러는 error[E0382]: borrow of moved value와 error[E0502]: cannot borrow ... as mutable because it is also borrowed as immutable입니다. 첫 번째는 String처럼 힙 데이터를 가진 값을 다른 변수나 함수에 넘긴 뒤 원래 변수를 다시 쓸 때, 두 번째는 벡터 원소의 참조를 들고 있는 상태에서 push를 호출할 때 흔히 납니다. 두 번째 규칙은 C++에서 push_back 이후 기존 참조가 무효화되는 버그를 컴파일 단계에서 막아 주는 장치라, C++ 경험이 있다면 오히려 이유를 빨리 이해할 수 있습니다.
처음 배우는 사람들이 흔히 빠지는 함정은 에러를 없애려고 곳곳에 .clone()을 붙이는 것입니다. 코드는 컴파일되지만 불필요한 복사가 늘고, 무엇보다 소유권 구조를 설계하는 연습을 건너뛰게 됩니다. 에러가 나면 먼저 “이 값의 주인은 누구여야 하는가, 빌려주기만 하면 되는가”를 생각해 보고, 함수 인자를 String 대신 &str로, Vec<T> 대신 &[T]로 받을 수 있는지부터 확인하는 편이 좋습니다.
비동기 편에서는 future cannot be sent between threads safely라는 에러가 대표적인 벽입니다. Tokio의 멀티스레드 런타임은 태스크를 다른 스레드로 옮길 수 있어야 하는데, .await 지점을 넘어 Rc나 std::sync::MutexGuard 같은 Send가 아닌 값을 들고 있으면 이 에러가 납니다. 가드를 .await 전에 스코프로 닫거나 tokio::sync::Mutex를 쓰는 식으로 해결하며, #07·#08에서 이 패턴을 다룹니다.
관련 시리즈
- C++ 시리즈 전체 목차: #0~#55 기초부터 고성능·분산 시스템까지
- C++ 개발자를 위한 Go 2주 학습 시리즈 목차
- Linux 커널 내부 동작: CFS 스케줄러·페이지 캐시·VFS·시스템 콜과 운영 트러블슈팅
자주 묻는 질문
Rust는 어디에 사용하나요?
웹 서버(Actix-web, axum), CLI 도구(ripgrep, bat 같은 도구가 Rust로 작성되었습니다), WebAssembly, 임베디드, 네트워크 서비스 등에 쓰입니다.
C++보다 Rust가 나은가요?
메모리 안전성 측면에서는 Rust가 컴파일러 차원의 보장을 제공하고, 성능은 두 언어 모두 네이티브 코드로 컴파일되어 비슷한 수준을 낼 수 있습니다. 기존 C++ 코드베이스가 크다면 전면 재작성보다 새 모듈부터 FFI로 붙이는 점진적 전환이 현실적입니다.
Rust 학습 시간은 얼마나 걸리나요?
개인차가 크지만, 기본 문법은 금방 익혀도 빌림 검사기와 “싸우지 않게” 되기까지는 보통 몇 주 이상 직접 코드를 써 봐야 합니다. 작은 CLI 도구(#11)를 하나 끝까지 만들어 보는 것이 가장 빠른 방법이고, C++에서 이동 의미론과 스마트 포인터를 써 본 경험이 있으면 소유권 개념을 더 빨리 받아들이는 편입니다.
추천 학습 자료
- The Rust Programming Language: 공식 튜토리얼
- Rust By Example: 예제 중심 학습
- Rustlings: 작은 연습 문제를 고치며 배우는 인터랙티브 과정
- Rust Cookbook: 자주 쓰는 작업별 레시피
첫 글은 Rust 시작하기 (#01)입니다.