유용한 개발 도구 모음
유용한 개발 도구 모음
바로 코딩만 하다 보면, 코드가 지저분해지고 뻔한 실수가 쌓이기 쉬워요. 하지만 Rust 프로젝트는 이런 일을 도와주는 공식 도구들을 기본으로 갖추고 있어서, 우리가 훨씬 편하게 개발할 수 있어요. 이 부록에서는 Rust가 제공하는 쓸 만한 개발 도구 몇 가지를 살펴볼게요. 자동으로 코드를 정리해 주는 포맷터, 경고를 빠르게 고쳐 주는 도구, 린터(linter), 그리고 IDE 연동까지, 차근차근 하나씩 짚어 볼게요.
출처: Rust 공식문서
본문
rustfmt로 코드 자동 정리하기
rustfmt 도구는 커뮤니티에서 합의된 코드 스타일대로 우리 코드를 다시 정리해 줘요. 여러 사람이 함께 협업하는 프로젝트에서 종종 rustfmt를 쓰는 이유가 바로 여기 있어요. "내 스타일 vs 네 스타일" 같은 코드 스타일 논쟁 자체를 없애 주거든요. 모두가 같은 도구로 코드를 정리하면, 그 논쟁은 처음부터 일어나지 않아요.
Rust를 설치하면 rustfmt도 기본으로 함께 설치돼요. 그래서 우리 시스템에는 이미 rustfmt와 cargo-fmt 두 프로그램이 깔려 있을 거예요. 이 두 명령은 각각 rustc와 cargo에 대응되는 관계예요. rustfmt는 더 세밀한 제어가 가능하고, cargo-fmt는 Cargo 프로젝트의 규칙을 이해해서 동작해요. 어떤 Cargo 프로젝트든 다음 명령 하나로 포맷을 맞출 수 있어요.
$ cargo fmt
이 명령을 실행하면 현재 크레이트(crate) 안의 모든 Rust 코드가 다시 정리돼요. 주의할 점이 하나 있는데, 이 도구는 코드 스타일만 바꾸지 코드의 동작은 절대 바꾸지 않아요. rustfmt에 대해 더 자세히 알고 싶다면 공식 문서를 확인해 보세요.
rustfix로 코드 고치기
rustfix 도구도 Rust 설치에 기본으로 포함돼 있는데, 컴파일러가 "이건 이렇게 고치면 돼"라고 명확히 알려주는 경고를 자동으로 고쳐 줘요. 여러분도 아마 컴파일러 경고를 본 적이 있을 거예요. 예를 들어 이런 코드를 생각해 볼게요.
Filename: src/main.rs
fn main() {
let mut x = 42;
println!("{x}");
}
여기서 변수 x를 가변(mutable)으로 선언했는데, 실제로는 아무데서도 값을 바꾸지 않아요. 그래서 Rust가 "이건 가변일 필요가 없다"고 경고를 띄워 줘요.
$ cargo build
Compiling myprogram v0.1.0 (file:///projects/myprogram)
warning: variable does not need to be mutable
--> src/main.rs:2:9
|
2 | let mut x = 0;
| ----^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` on by default
경고가 "mut 키워드를 지우세요"라고 알려 주고 있어요. 이 제안을 손으로 일일이 고치지 않아도, cargo fix 명령으로 rustfix 도구를 실행하면 자동으로 적용할 수 있어요.
$ cargo fix
Checking myprogram v0.1.0 (file:///projects/myprogram)
Fixing src/main.rs (1 fix)
Finished dev [unoptimized + debuginfo] target(s) in 0.59s
다시 src/main.rs를 열어 보면, cargo fix가 코드를 이렇게 바꿔 놓았을 거예요.
Filename: src/main.rs
fn main() {
let x = 42;
println!("{x}");
}
이제 변수 x는 더 이상 가변이 아니고, 경고도 사라졌어요. 그리고 cargo fix는 단순히 경고를 고치는 것뿐 아니라, 코드를 서로 다른 Rust 에디션(edition) 사이에서 전환할 때도 쓸 수 있어요. 에디션에 대한 자세한 내용은 부록 E에서 다룰게요.
Clippy로 린트 더 받기
Clippy 도구는 우리 코드를 분석해서 흔한 실수를 잡아내고 Rust 코드의 품질을 높여 주는 린트(lint) 모음이에요. Clippy 역시 표준 Rust 설치에 포함돼 있어요.
어떤 Cargo 프로젝트든 다음 명령으로 Clippy의 린트를 실행할 수 있어요.
$ cargo clippy
예를 들어, 수학 상수(예: 원주율 파이)를 직접 근사값으로 적는 프로그램을 작성했다고 해 볼게요.
fn main() {
let x = 3.1415;
let r = 8.0;
println!("the area of the circle is {}", x * r * r);
}
이 프로젝트에서 cargo clippy를 실행하면 이런 오류가 나와요.
error: approximate value of `f{32, 64}::consts::PI` found
--> src/main.rs:2:13
|
2 | let x = 3.1415;
| ^^^^^^
|
= note: `#[deny(clippy::approx_constant)]` on by default
= help: consider using the constant directly
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant
이 오류는 "Rust에는 이미 더 정확한 PI 상수가 정의되어 있으니, 그 상수를 쓰는 게 더 정확한 프로그램이 될 거야"라고 알려 주는 거예요. 그러면 우리는 코드를 바꿔서 PI 상수를 쓰면 되겠죠.
이렇게 고친 코드는 Clippy가 아무 오류나 경고를 내지 않을 거예요.
fn main() {
let x = std::f64::consts::PI;
let r = 8.0;
println!("the area of the circle is {}", x * r * r);
}
Clippy에 대해 더 자세히 알고 싶다면 공식 문서를 참고해 주세요.
rust-analyzer로 IDE와 연동하기
IDE 연동을 돕기 위해 Rust 커뮤니티는 rust-analyzer를 사용할 것을 권장해요. 이 도구는 컴파일러 중심의 유틸리티 모음으로, Language Server Protocol을 사용해요. LSP는 IDE와 프로그래밍 언어가 서로 통신하기 위한 규격이에요. rust-analyzer는 여러 클라이언트에서 쓸 수 있는데, 대표적으로 Visual Studio Code용 Rust analyzer 플러그인이 있어요. (LSP의 일반적인 개념은 langserver.org에서 확인할 수 있어요.)
rust-analyzer 프로젝트 홈페이지에서 설치 방법을 확인한 다음, 여러분이 쓰는 IDE에 언어 서버 지원을 설치해 보세요. 그러면 자동 완성(autocompletion), 정의로 이동(jump to definition), 인라인 오류 표시 같은 기능이 IDE에서 바로 동작하게 돼요.
더 알아보기
- 부록 E: 에디션 (Editions) —
cargo fix로 코드를 새 에디션으로 옮기는 방법 - rustfmt 공식 문서
- Clippy 공식 문서
- rust-analyzer 공식 사이트