Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

부록 D: 유용한 개발 도구

이 부록에서는 러스트 프로젝트가 제공하는 유용한 개발 도구 몇 가지를 살펴봅니다. 자동 포매팅, 경고 수정 사항을 빠르게 적용하는 방법, 린터, IDE 통합을 다룰 것입니다.

rustfmt 로 자동 포매팅하기

rustfmt 도구는 커뮤니티 코드 스타일에 맞게 코드를 다시 포맷합니다. 많은 협업 프로젝트가 러스트 코드를 작성할 때 어떤 스타일을 쓸지 논쟁하지 않기 위해 rustfmt 를 사용합니다. 모두가 이 도구로 코드를 포맷하면 되기 때문입니다.

러스트 설치에는 기본적으로 rustfmt 가 포함되어 있으므로, 시스템에는 이미 rustfmtcargo-fmt 프로그램이 있어야 합니다. 이 둘의 관계는 rustccargo 에 비슷합니다. 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

예를 들어, 다음 프로그램처럼 원주율 같은 수학 상수의 근삿값을 직접 사용했다고 해봅시다.

Filename: src/main.rs
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 에서 어떠한 오류나 경고도 내지 않습니다.

Filename: src/main.rs
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에서 자동 완성, 정의로 이동, 인라인 오류 표시 같은 기능을 사용할 수 있게 됩니다.