부록 D: 유용한 개발 도구
이 부록에서는 러스트 프로젝트가 제공하는 유용한 개발 도구 몇 가지를 살펴봅니다. 자동 포매팅, 경고 수정 사항을 빠르게 적용하는 방법, 린터, IDE 통합을 다룰 것입니다.
rustfmt 로 자동 포매팅하기
rustfmt 도구는 커뮤니티 코드 스타일에 맞게 코드를 다시 포맷합니다. 많은 협업
프로젝트가 러스트 코드를 작성할 때 어떤 스타일을 쓸지 논쟁하지 않기 위해 rustfmt
를 사용합니다. 모두가 이 도구로 코드를 포맷하면 되기 때문입니다.
러스트 설치에는 기본적으로 rustfmt 가 포함되어 있으므로, 시스템에는 이미
rustfmt 와 cargo-fmt 프로그램이 있어야 합니다. 이 둘의 관계는 rustc 와 cargo
에 비슷합니다. rustfmt 는 더 세밀한 제어를 제공하고, cargo-fmt 는 Cargo를
사용하는 프로젝트의 관례를 이해합니다. 어떤 Cargo 프로젝트든 포맷하려면 다음을
입력하세요.
$ cargo fmt
이 명령을 실행하면 현재 크레이트의 모든 러스트 코드가 다시 포맷됩니다. 코드는
의미적으로는 바뀌지 않고 스타일만 바뀌어야 합니다. rustfmt 에 대한 자세한 내용은
공식 문서 를 참고하세요.
rustfix 로 코드 고치기
rustfix 도구도 러스트 설치에 포함되어 있으며, 문제를 고치는 방법이 분명한 컴파일러
경고를 자동으로 수정해 줍니다. 이미 컴파일러 경고를 본 적이 있을 것입니다. 예를 들어
다음 코드를 생각해 봅시다.
Filename: src/main.rs
fn main() {
let mut x = 42;
println!("{x}");
}
여기서는 변수 x 를 가변으로 정의했지만, 실제로는 한 번도 변경하지 않습니다.
러스트는 이에 대해 경고를 보여 줍니다.
$ 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 키워드를 제거하라고 제안합니다. rustfix 도구를 사용하면 cargo fix
명령으로 이 제안을 자동 적용할 수 있습니다.
$ 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 명령은 서로 다른 러스트 에디션 사이로 코드를 전환할 때도 사용할 수
있습니다. 에디션은 부록 E 에서 다룹니다.
Clippy로 더 많은 린트 보기
Clippy 도구는 코드를 분석하는 린트 모음입니다. 흔한 실수를 잡고 러스트 코드를 개선하는 데 도움을 줍니다. Clippy 역시 표준 러스트 설치에 포함되어 있습니다.
어떤 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
이 오류는 러스트가 이미 더 정확한 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-analyzer
사용을 권장합니다. 이 도구는 Language Server Protocol 을
사용하는 컴파일러 중심 유틸리티 모음입니다. Language Server Protocol 은 IDE 와
프로그래밍 언어가 서로 통신하기 위한 명세입니다. 예를 들어 Visual Studio Code용
Rust analyzer 플러그인 같은 다양한 클라이언트가 rust-analyzer 를 사용할
수 있습니다.
설치 방법은 rust-analyzer 프로젝트의 홈페이지
를 참고하고, 사용하는 IDE에 맞는 언어 서버 지원도 함께 설치하세요. 그러면 IDE에서
자동 완성, 정의로 이동, 인라인 오류 표시 같은 기능을 사용할 수 있게 됩니다.