D - 유용한 개발 도구
rustfmt·cargo fix·Clippy·rust-analyzer를 연결해 코드 형식·린트 수정·IDE 분석을 일관되게 자동화합니다.
러스트 학습이 깊어질수록 문법 지식만큼 도구 활용 능력이 생산성을 좌우합니다.
rustfmt, cargo fix, 린터, IDE 통합 도구는 반복 실수를 줄이고 코드 품질을 일정하게 유지하는 데 핵심 역할을 합니다.
이 부록은 단순 설치 안내가 아니라, 어떤 문제를 어떤 도구로 해결하는지가 빠르게 떠오르도록 정리한 실전 참고 자료입니다.
본문 학습 중 반복되는 작업이 많아질수록 이 절의 가치가 더 크게 느껴질 것입니다.
도구를 팀 표준으로 맞추면 코드 리뷰에서 스타일 논쟁을 줄이고 본질적인 로직 검토에 더 집중할 수 있습니다.
또한 자동화 도구는 학습 초기에 실수 패턴을 빠르게 피드백해 주기 때문에 입문자에게도 효과가 큽니다.
이 절을 참고해 자신의 개발 루틴에 맞는 최소 도구 세트를 먼저 고정하는 것을 권장합니다.
도구 체인이 안정되면 학습과 실무 모두에서 반복 작업의 피로가 크게 줄어듭니다.
아래 표는 증상을 보고 가장 먼저 실행할 도구를 고르는 출발점입니다. 소스를 직접 바꾸는 명령과 읽기 전용 검사를 구분하고, 자동 수정 뒤에는 diff와 테스트를 다시 확인합니다.
Rust · developer tools · semantic matrix
증상을 먼저 이름 붙이면 첫 도구가 선명해진다
탐색·검사·생성·자동 수정을 같은 작업으로 보지 않습니다. 소스를 바꾸는 명령은 깨끗한 작업 트리에서 실행하고, 생성과 검사는 대상 범위를 명시해 반복 가능하게 만듭니다.
| 지금의 문제 | 먼저 쓸 도구 | 무엇이 바뀌나 | 범위와 확인점 |
|---|---|---|---|
| 작성 중 탐색·즉시 진단 | rust-analyzer |
기본 분석은 읽기 전용이며, 선택한 code action은 소스를 바꿀 수 있습니다. | 편집기 LSP 피드백입니다. 실제 컴파일과 테스트의 통과를 대신하지 않습니다. |
| 타입·borrow·컴파일 오류 | cargo check |
소스는 그대로이고 target/에 메타데이터와 캐시가 생깁니다. |
기본 선택의 패키지·lib·bin과 의존성을 검사합니다. 테스트 등은 --all-targets로 넓힙니다. |
| 포맷 적용·CI 확인 | cargo fmt |
기본 실행은 소스를 고치고, -- --check는 차이만 보고합니다. |
워크스페이스 전체 검사는 cargo fmt --all -- --check로 고정합니다. |
| 컴파일러의 명확한 수정 제안 | cargo fix |
자동 적용 가능한 rustc 제안으로 소스를 바꿉니다. | VCS와 깨끗한 작업 트리가 기본 안전장치입니다. 선택된 package의 모든 Cargo target을 기본 검사하지만, 활성 feature·현재 플랫폼 cfg의 코드만 다룹니다. |
| 관용구·가독성·실수 가능성 | cargo clippy |
기본은 진단만 하고, --fix를 선택하면 일부 소스를 바꿉니다. |
기본 clippy::all에서 시작해 -A·-W·-D로 프로젝트 정책을 정합니다. |
| 동작과 문서 예제 검증 | cargo test |
소스 대신 test 프로필 산출물을 만들고 테스트를 실행합니다. | 단위·통합·라이브러리 doctest가 기본 범위이며 예제 대상도 컴파일합니다. |
| 공개 API 문서 렌더링 | cargo doc --no-deps |
target/doc/에 rustdoc HTML을 만듭니다. |
문서를 생성할 뿐 doctest는 실행하지 않습니다. 예제 검증은 cargo test --doc입니다. |
rust-analyzer · 탐색과 즉시 진단
LSP 기반 분석은 편집 피드백입니다. code action은 소스를 바꿀 수 있고 컴파일·테스트를 대체하지 않습니다.
cargo check · 빠른 컴파일 확인
최종 코드 생성 없이 기본 lib·bin과 의존성을 검사합니다. 테스트 대상까지 보려면 --all-targets를 씁니다.
cargo fmt · 포맷
기본 실행은 파일을 바꾸고, cargo fmt --all -- --check는 워크스페이스의 차이만 검사합니다.
cargo fix · rustc 제안 적용
선택된 package의 모든 Cargo target을 기본 검사하지만 활성 feature·현재 플랫폼 cfg의 코드만 고칩니다. 깨끗한 VCS 작업 트리에서 diff와 테스트를 확인합니다.
cargo clippy · lint
기본 lint를 진단하고 수준을 정책화합니다. --fix는 일부 소스를 바꾸며 --all-targets를 포함합니다.
cargo test · 동작과 doctest
단위·통합·문서 테스트를 컴파일해 실행하고 예제 대상의 컴파일도 확인합니다.
cargo doc · API HTML
target/doc/을 생성하지만 doctest는 실행하지 않습니다. 문서 예제만 검증하려면 cargo test --doc을 씁니다.
소스를 바꾸는 경계
fmt, fix, clippy --fix, editor code action은 diff가 생깁니다. 복구 지점 없이 자동 수정을 시작하지 않습니다.
CI의 최소 읽기 전용 축
fmt --check, clippy -- -D warnings, test, doc을 분리하면 실패가 형식, lint, 동작, 문서 중 어디인지 바로 드러납니다.
한 도구가 모든 문제를 해결하지 않습니다. 각 명령의 쓰기 여부, 선택 target과 산출물을 알고 연결해야 자동화가 안전해집니다.
부록 D - 유용한 개발 도구
이 부록에서는 러스트 프로젝트가 제공하는 유용한 개발 도구에 대해 알아보겠습니다.
자동 포맷팅, 경고 수정을 적용하는 빠른 방법, 린터(linter), IDE와의 통합 등을 살펴보겠습니다.
rustfmt로 자동 포맷팅하기
rustfmt 도구는 커뮤니티 코드 스타일에 따라 여러분의 코드를 다시 포맷합니다.
많은 협업 프로젝트는 rustfmt를 사용하여 러스트를 작성할 때 사용할 스타일에 대한 논쟁을 방지합니다.
모든 사람이 이 도구를 사용하여 코드를 포맷합니다.
rustfmt 도구를 설치하려면 다음을 입력하세요.
$ rustup component add rustfmt이 명령은 rustc와 cargo처럼 rustfmt와 cargo-fmt를 제공합니다.
어떤 Cargo 프로젝트를 포맷하려면, 다음을 입력하세요.
$ cargo fmt이 명령을 실행하면 Cargo가 찾은 바이너리와 라이브러리 대상을 다시 포맷합니다. 워크스페이스 전체를 명시하려면 --all을 함께 사용합니다.
이 명령은 코드의 의미를 변경하지 않고 코드 스타일만 변경합니다.
CI나 코드 리뷰 전에는 파일을 바꾸지 않고 포맷 차이만 검사할 수 있습니다. 차이가 있으면 0이 아닌 종료 코드와 diff를 내므로 자동 검사에 적합합니다.
$ cargo fmt --all -- --checkrustfmt에 대한 자세한 내용은 문서를 참고하세요.
cargo fix로 컴파일러 제안 적용하기
cargo fix는 내부에서 cargo check를 실행하고, rustc가 자동 적용해도 된다고 분류한 제안을 소스에 반영합니다. 모든 경고를 고치는 명령은 아니며, 활성화한 feature와 현재 target의 cfg에 포함되어 실제로 검사된 코드만 다룹니다.
컴파일러 경고를 이미 본 적이 있을 것입니다.
예를 들어, 다음 코드를 살펴보겠습니다.
fn do_something() {}
fn main() {
for i in 0..100 {
do_something();
}
}여기서는 do_something 함수를 100번 호출하지만, for 루프의 본문에서 i 변수를 사용하지 않습니다.
러스트는 이것에 대해 경고합니다.
$ cargo build
Compiling myprogram v0.1.0 (file:///projects/myprogram)
warning: unused variable: `i`
--> src/main.rs:4:9
|
4 | for i in 0..100 {
| ^ help: consider using `_i` instead
|
= note: #[warn(unused_variables)] on by default
Finished dev [unoptimized + debuginfo] target(s) in 0.50s이 경고는 대신에 _i라는 이름을 사용하라고 제안합니다.
밑줄은 이 변수를 사용하지 않을 것이라는 의도를 나타냅니다.
cargo fix 명령을 실행하면 rustfix를 통해 이 제안을 자동으로 적용할 수 있습니다. 기본적으로 VCS가 감지되고 작업 트리가 안전한 상태인지 확인하므로, 먼저 변경을 커밋하거나 별도로 보관해 되돌릴 지점을 만듭니다.
$ cargo fix
Checking myprogram v0.1.0 (file:///projects/myprogram)
Fixing src/main.rs (1 fix)
Finished dev [unoptimized + debuginfo] target(s) in 0.59ssrc/main.rs를 다시 살펴보면, cargo fix가 코드를 변경했음을 알 수
있습니다.
fn do_something() {}
fn main() {
for _i in 0..100 {
do_something();
}
}for 루프 변수가 이제 _i라는 이름이 되었고, 경고는 더 이상 나타나지 않습니다.
자동 수정 뒤에는 반드시 diff를 읽고 cargo test를 실행합니다. --allow-no-vcs, --allow-dirty, --allow-staged는 안전 검사를 우회하므로 변경을 잃지 않을 이유와 복구 수단이 있을 때만 사용합니다.
또한 cargo fix --edition으로 다음 러스트 에디션을 위한 코드 변경을 적용할 수 있습니다. 이 명령은 Cargo.toml의 edition 값을 바꾸지 않으므로, 코드 수정을 확인한 뒤 매니페스트를 직접 갱신하고 테스트해야 합니다. 선택 feature나 플랫폼별 코드가 있다면 --all-features와 필요한 --target 조합으로 별도 실행합니다.
에디션은 부록 E에서 다룹니다.
Clippy로 더 많은 린트 사용하기
Clippy 도구는 코드를 분석하여 일반적인 실수를 잡고 러스트 코드를 개선할 수 있도록 하는 린트(lint) 모음입니다.
Clippy를 설치하려면 다음을 입력하세요.
$ rustup component add clippyClippy의 린트를 어떤 Cargo 프로젝트에 실행하려면 다음을 입력하세요.
$ cargo clippy예를 들어 다음과 같이 수학적 상수(예: pi)의 근사치를 사용하는 프로그램을 작성했다고 가정해보겠습니다.
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 상수가 정의되어 있으며, 프로그램이 이 상수를 대신 사용하도록 수정하면 더 정확해진다는 것을 알려줍니다.
Clippy는 기본적으로 clippy::all 그룹을 실행하고, 각 lint의 수준과 프로젝트 설정에 따라 허용·경고·오류로 보고합니다. CI에서 경고까지 실패로 처리하려면 다음처럼 명시할 수 있습니다.
$ cargo clippy -- -D warningsclippy::pedantic은 선택적으로 활성화하는 의견이 강한 그룹이고, clippy::restriction 전체를 한꺼번에 켜는 것은 서로 충돌하는 lint가 있어 권장되지 않습니다. 필요한 규칙만 고르고, 의도와 맞지 않는 lint는 근거를 남겨 allow할 수 있습니다.
그러면 여러분이 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에 대한 더 많은 정보를 보려면 Clippy 문서를 참조하세요.
일부 제안은 cargo clippy --fix로 적용할 수 있습니다. 이 옵션은 --all-targets를 포함하지만 모든 제안이 자동 수정되는 것은 아니며 소스를 바꾸므로, cargo fix와 마찬가지로 깨끗한 작업 트리에서 diff와 테스트를 확인합니다.
rust-analyzer를 사용한 IDE 통합
러스트 커뮤니티는 IDE 통합을 돕기 위해 rust-analyzer를 추천합니다.
이 도구는 러스트 코드를 의미적으로 분석하고 언어 서버 프로토콜(Language Server Protocol)로 편집기와 통신하는 언어 서버입니다. 컴파일과 테스트를 대신하는 도구가 아니라, 작성 중 타입 정보·진단·탐색 피드백을 짧게 돌려주는 도구입니다.
Visual Studio Code의 Rust analyzer 플러그인과 같은 다른 클라이언트에서도 rust-analyzer를 사용할 수 있습니다.
먼저 편집기 확장 문서를 따르세요. 확장이 서버 바이너리를 관리하지 않는 환경에서는 PATH에 공식 바이너리를 두거나 rustup으로 현재 툴체인용 구성 요소를 설치할 수 있습니다.
$ rustup component add rust-analyzer여러분의 IDE는 자동 완성, 정의로 이동, 인라인 오류 등과 같은 기능을 얻게 될 것입니다.
API 문서와 문서 테스트 구분하기
cargo doc은 rustdoc을 사용해 로컬 패키지와 기본적으로 그 의존성의 API 문서를 target/doc에 생성합니다. 의존성 문서를 생략하고 바로 열려면 다음처럼 실행할 수 있습니다.
$ cargo doc --no-deps --open이 명령은 문서를 렌더링할 뿐 문서 예제를 테스트하지 않습니다. 라이브러리 문서 주석의 코드 예제를 컴파일하고 실행하려면 기본 cargo test 흐름을 사용하거나 문서 테스트만 선택합니다.
$ cargo test --doc문서 테스트는 rustdoc이 코드 블록을 추출해 테스트 실행 파일로 만들며, 일반 cargo test에도 기본적으로 포함됩니다.
개발 도구는 한 번 실행하고 끝내는 목록보다 편집으로 되돌아오는 피드백 루프로 묶을 때 효과가 큽니다. 빠른 검사, 포맷 확인, lint, 테스트와 문서를 차례로 확인하고 발견한 내용을 다시 작은 코드 변경으로 반영합니다.
Rust · quality workflow · feedback loop
도구의 출력은 다음의 더 작은 편집으로 돌아온다
여섯 단계는 일회성 체크리스트가 아니라 반복 루프입니다. 각 통과와 실패가 같은 코드베이스에 작은 diff와 명시적 정책으로 축적되고, 문서 확인 뒤 다시 편집으로 돌아갑니다.
rust-analyzer로 편집타입 정보, 정의 이동과 인라인 진단으로 다음의 작은 변경을 만듭니다.
cargo check최종 코드 생성 전 타입·borrow·컴파일 오류를 빠르게 확인합니다.
cargo fmt --all -- --check파일을 바꾸지 않고 워크스페이스의 포맷 차이를 검사합니다.
cargo clippy -- -D warnings프로젝트가 선택한 lint 정책을 실패 조건으로 확인합니다.
cargo test단위·통합·문서 테스트를 실행해 동작과 예제를 검증합니다.
cargo doc --no-deps렌더링된 공개 API를 읽고 발견한 문제를 1단계 편집으로 되돌립니다.
자동 수정은 별도 단계
fmt, fix, clippy --fix는 읽기 전용 루프의 실패 원인을 이해한 뒤 복구 가능한 작업 트리에서 실행합니다.
문서 생성과 테스트
cargo doc은 HTML을 만들고, cargo test 또는 cargo test --doc이 doctest를 실행합니다.
한 번에 작게
각 실패를 한꺼번에 덮지 말고 작은 diff로 고친 뒤 같은 명령을 재실행해야 원인과 결과가 연결됩니다.
실선은 시계 방향의 개발 순서, 점선은 각 단계가 중앙 코드베이스에 남기는 피드백입니다. 마지막 문서 확인은 첫 편집으로 돌아갑니다.