[Rust] 메서드 구현부 분리하기
구조체에 메서드를 구현하다보면, 메서드들이 너무 많아져서 번잡해지고 소스코드가 과하게 길어지는 경우가 발생할 수 있다.
거대하고 모놀리하게 뭉쳐있는 코드는 당연히 관리와 유지보수에 좋지 않다.
impl 분할하기
다행스럽게도, Rust는 이런 부분에 있어서 상당히 유연한 구조를 취하고 있다.
impl은 언제 어디서나, 여러번 중복해서 사용할 수 있기 때문이다.
그래서 다음과 같은 코드를 2개 부분으로 분리한다면

다음과 같이 할 수 있다.

파일 분리
근데 저렇게 impl만 쪼개서 뭣하는가? 여전히 한 소스코드에 코드가 몰려있다는 점은 바뀌지 않는다.
impl별로 별도의 소스파일로 분리해보도록 하겠다.
첫번째 구현부를 a 모듈로 만들고

두번재 구현부를 b로 만든다.
오류는 일단 무시하자.
그리고 둘다 원본 구조체 Buldak을 참조할 수 있고, 또 동시에 export가 되도록 해야 한다.
하나의 mod.rs에서 구조체 정의와 impl부를 다 import하게 해준다.
이러면 이제 2번째 단계는 완료된 것이다.
가시성 제어
같은 파일에 있을 때는 괜찮았던 부분이, 파일, 모듈별로 구현부를 쪼개니 문제가 발생했다.

같은 구조체 정의에 있는 bar, foo 구현을 foobar 메서드에서 읽을 수가 없는 것이다.
원래 메서드 정의에 아무것도 붙이지 않을 경우에 붙는 접근제어자는 pub(self)로, 동일 모듈 내에서만 접근이 가능하다. 그래서 같은 소스코드(모듈)에 있을 경우에는 문제가 없었지만 분리가 되니 서로를 찾을 수 없게 된 것이다.
가장 단순한 해결법은 일단 다 pub를 붙이는 것일 것이다.

그럼 오류는 사라진다.
경우에 따라서는 이것만으로도 충분할 수 있지만, 그렇다면 접근제어자가 왜 필요하겠는가?
당연히 경우에 따라서 foo와 bar가 밖으로 노출되지 않아야 할 수도 있다.
그럴 때 내가 사용하는 간단한 방법은 pub(crate)를 사용하는 것이다.
이 접근제어를 사용하면 해당 crate 내에서는 전부 접근이 가능해진다.
일반적으로 접근제어가 필요한 상황이라도, 라이브러리 사용자에게 감추고자 하는 것이지, 라이브러리 구현 내에서 제한을 걸어야 하는 경우가 적다는 점을 감안한 해결책이다.
아니면 pub(super)를 사용할 수도 있다.
이 경우에는 딱 상위 모듈까지만 가시성이 허락된다.
따라서 현재의 상위모듈인 mod.rs에 대해서 접근이 허락되니, 그 모듈에 포함되는 녀석들도 접근이 가능해지는 것이다.
좀 꼼꼼하게 처리를 하고싶다면 이게 좋겠다.