프로그래밍Rust 백엔드 개발자

Rust에서 모듈 시스템(modules)과 가시성(pub, pub(crate), private)이 작동하는 방식을 설명하십시오. 대규모 프로젝트를 어떻게 조직하고 이름 충돌을 피할 수 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변

Rust의 모듈 시스템은 mod 키워드를 중심으로 구성됩니다. 모듈은 코드의 논리적 분할을 파일과 네임스페이스로 허용합니다. 주요 사항:

  • 기본적으로 모든 것이 현재 모듈 내에서 비공개(private)입니다.
  • pub는 모듈 트리 전체에 대해 요소를 공개합니다.
  • pub(crate)는 전체 crate(즉, 라이브러리/프로젝트)에서 사용할 수 있습니다.
  • 이름 충돌은 네임스페이스를 사용하여 해결됩니다: 명시적 임포트(use mod_name::item)와 별칭들.

대규모 프로젝트의 경우, 공개 인터페이스를 lib.rs 또는 main.rs를 통해서만 설명하고 나머지는 비공개로 유지하는 모듈 트리를 사용하는 것이 좋습니다:

mod network; mod storage; pub use network::api;

함정 질문

구조체가 pub으로 선언되었다면 다른 crate에서 접근할 수 있습니까?

답변: 아니오, 구조체를 pub으로 표시하는 것만으로는 충분하지 않습니다. 외부 crate에 공개된 모듈에서 선언되어야 하고 (pub mod), 구조체의 필드도 public이어야 직접 접근할 수 있습니다.

예:

mod foo { pub struct Bar; } // Bar는 foo가 private이므로 crate 외부에서 볼 수 없습니다.

이 주제에 대한 세부 사항을 알지 못해 발생한 실제 오류 사례


이야기

복잡한 모듈 구조를 가진 프로젝트에서 실수로 구조체를 pub으로 선언했지만 모듈을 pub으로 수출하지 않았습니다. 나중에 다른 crate에서 구조체를 사용하려고 했을 때, 타입의 접근 불가능성에 관한 오류가 발생했습니다.

이야기

큰 라이브러리에서 서로 다른 모듈이 동일한 이름을 수출했습니다(예: types 및 errors). use *를 무분별하게 사용할 때 컴파일 단계에서 이름 충돌이 발생했습니다. 해결책은 별칭을 추가하고 필요한 요소만 임포트하는 것이었습니다.

이야기

많은 초보자가 구조체를 pub으로 만들지만 필드를 private로 남겨두어 모듈 외부에서 초기화할 수 없게 됩니다. 결과적으로 다른 모듈의 함수가 구조체를 직접 생성할 수 없어 오류가 발생하고, 필드나 생성자를 공개로 수정할 때까지 오류가 발생했습니다.