모듈과 크레이트: 효율적인 코드 구조화
학습 목표: Rust의 모듈 시스템을 C#의 네임스페이스 및 어셈블리와 비교하며 이해합니다. 파일 단위로 코드를 분리하는 법, 가시성(
pub) 제어 규칙, 그리고 여러 프로젝트를 관리하는 워크스페이스(Workspace) 개념을 마스터합니다.
1. 모듈(Module) vs 네임스페이스(Namespace)
C#의 네임스페이스가 단순히 이름을 논리적으로 묶는 것이라면, Rust의 모듈은 가시성과 파일 구조가 결합된 실체입니다.
| 비교 항목 | C# 네임스페이스 | Rust 모듈 (mod) |
|---|---|---|
| 선언 방식 | namespace MyApp.Models | mod models; (파일이나 블록으로 정의) |
| 가시성 기본값 | internal (어셈블리 내 공개) | private (모듈 내에서만 접근 가능) |
| 파일 연결 | 파일 경로와 네임스페이스가 무관함 | 파일 시스템 구조가 곧 모듈 구조임 |
| 사용 선언 | using MyApp.Models; | use crate::models::User; |
2. 가시성 제어: 누가 내 코드를 볼 수 있는가?
Rust는 "기본은 비공개(Private), 필요한 것만 공개(Public)" 원칙을 철저히 지킵니다.
pub: 어디서든 접근 가능 (C#의public)pub(crate): 현재 크레이트(어셈블리) 내에서만 접근 가능 (C#의internal)pub(super): 부모 모듈에서만 접근 가능- (기본값, 키워드 없음): 현재 모듈과 그 자식 모듈에서만 접근 가능
3. 크레이트(Crate)와 워크스페이스(Workspace)
- 크레이트: Rust의 컴파일 단위입니다. .NET의 **어셈블리(.dll, .exe)**에 대응합니다.
- 바이너리 크레이트: 실행 가능한 프로그램 (
main.rs) - 라이브러리 크레이트: 다른 곳에서 가져다 쓰는 코드 (
lib.rs)
- 바이너리 크레이트: 실행 가능한 프로그램 (
- 워크스페이스: 여러 크레이트를 하나로 묶어 관리하는 단위입니다. C#의 **솔루션(.sln)**과 유사합니다.
4. 모듈 구성 방식 (현대적인 스타일)
최신 Rust(2018 에디션 이후)에서는 mod.rs 없이도 폴더 명과 동일한 .rs 파일을 통해 깔끔하게 모듈을 구성할 수 있습니다.
src/
├── main.rs # 크레이트 루트
├── auth.rs # mod auth (auth/ 디렉토리의 진입점)
└── auth/
├── login.rs # mod auth::login
└── logout.rs # mod auth::logout
💡 실무 팁: pub use로 깔끔한 API 만들기
모듈 구조가 깊어지면 사용자가 임포트하기 번거로울 수 있습니다. 이때 pub use를 사용하여 내부 깊숙이 있는 타입을 상위 모듈로 재노출(Re-export) 시키면, 사용자는 복잡한 내부 경로를 몰라도 편리하게 기능을 쓸 수 있습니다.