[Rust] predule.rs로 import를 정리해보자 (번역)

원문
https://justinwoodring.com/blog/tidy-your-rust-imports-with-prelude/

저는 러스트를 사랑합니다.
진지하게, 정말 놀라운 언어죠. 단점도 있지만 충분히 좋습니다.

하지만 저를 미치게 만드는 한 가지는 모든 단일 파일에서 태양 아래의 모든 것을 가져와야 한다는 것입니다.
이런 경험은 해봤을 수도 있고 아닐 수도 있습니다. 저는 Rust에서 웹 API를 구축하기 전까지는 해보지 않았습니다.

예를 들면, 이런거에요.

use crate::models::clubs_md::{
** Club, NewClub, ClubDetails**
}; **
use crate::models::users_md::{
** User, UserDetails, NewUser, Admin

}; **
use crate::models::club_members_md::{
** MembershipStatus, **
** ClubMember, **
** NewClubMember

**}; **
**use crate::Db; **

제 경우에는 비교적 간단한 웹 응용 프로그램을 구축했는데요. 20가지 타입과 이 타입들의 대부분에 접근할 필요가 있는 특정 웹 핸들러가 있었습니다.
그리고 이게 하나의 핸들러 파일이라고 가정하면 괜찮을 수 있지만 핸들러를 여러 파일로 분리하면 불편해보입니다.



C#, Java와는 다르게, 네임스페이스가 기본적으로 존재하지 않습니다.

Java나 C#에서 네임스페이스는, 네임스페이스의 파일에 있는 모든 것이 해당 네임스페이스의 다른 파일에서 접근할 수 있도록 처리됩니다.
이게 C#나 Java에서 mod.rs 파일이 없고 파일의 가시성을 보장하기 위해 use super::other_child::other_function을 사용할 필요도 없는 이유입니다.
결과적으로, 모듈을 가져온다고 그 모든 하위 모듈을 가져올 것이라고 가정할 수가 없죠. 수동으로 모두 가져와야 해서 지저분해질 수도 있고요.



prelude.rs를 어디다 둬요?

프로젝트에서 prelude.rs를 활용하는 매우 다른 두 가지 유용한 방법을 찾았습니다.

소규모 프로젝트의 경우엔 프로젝트에 대한 대부분의 import를 포함하는 간단한 crate 레벨의 prelude.rs가 좋아요.

더 큰 프로젝트의 경우엔 웹 핸들러를 그룹화하고 빌드할 때처럼 crate 서브모듈에 대해 prelude.rs 파일을 작성하는 것이 특히 유용할 수 있습니다.

이 두 가지 아이디어가 결합될 수 있고, 충분히 크고 세분화된 프로젝트에 실용적일 수 있다는 점에 주목할 필요가 있습니다.

예를 들어, 다른 프로젝트에 포함할 수 있도록 여러 개의 re-export 작업을 수행해야 하지만 모든 파일에서 Rust import의 사용 빈도를 숨기려는 라이브러리를 예로 들 수 있습니다.

기존 코드에 이 predule.rs들을 적용하는 과정은 이유나 정확한 구현에 상관없이 꽤 비슷비슷할거에요.

  1. 주어진 파일에서 import를 모두 가져옵니다.

  2. 이러한 import를 'use'가 아닌 'pub use'로 인접한 prelude.rs에 배치합니다.

  3. 모듈 트리에서 prelude이 보이는지 확인하십시오.

  4. 마지막으로, 이러한 모든 import가 필요한 각 파일에서 "use super::prelude::*;"로 바꾸고, prelude이 crate 레벨인 경우에는 "use crate::prelude::*;"로 바꾸세요.



파일 구조 예제

다음은 **use super::prelude::*;**를 사용하는 파일 트리의 예입니다.

다음은 **use crate::prelude::*;**를 사용하는 파일 트리의 예입니다.



결론

하나의 파일에서 정말 방대한 import를 정리해 prelude.rs를 만들어 사용하는건 정말 유용합니다.

이건 개인적으로 제 프로젝트에서 import를 유지하는 것을 더 쉽게 만들었으며, 이 팁이 당신에게도 도움이 되기를 바랍니다! 😁