Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

모듈과 크레이트: 효율적인 코드 구조화

학습 목표: Rust의 모듈 시스템을 C#의 네임스페이스 및 어셈블리와 비교하며 이해합니다. 파일 단위로 코드를 분리하는 법, 가시성(pub) 제어 규칙, 그리고 여러 프로젝트를 관리하는 워크스페이스(Workspace) 개념을 마스터합니다.


1. 모듈(Module) vs 네임스페이스(Namespace)

C#의 네임스페이스가 단순히 이름을 논리적으로 묶는 것이라면, Rust의 모듈은 가시성과 파일 구조가 결합된 실체입니다.

비교 항목C# 네임스페이스Rust 모듈 (mod)
선언 방식namespace MyApp.Modelsmod 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) 시키면, 사용자는 복잡한 내부 경로를 몰라도 편리하게 기능을 쓸 수 있습니다.