RUST의 설치, 사용방법을 저번에 알아보았다.
요번시간에는 더욱 깊이 공부를 해볼 예정이다.
RUST라는 언어에 대해서 아는것이 없는 나는 우선 chatGPT에게 물어봤다.

chatgpt가 추천해준 것을 읽던중

괜찮은 실습 프로젝트를 발견하였다.
그래서 요번 시간에는 RUST를 이용하여 CLI TOOL을 만들어볼 것이다.
우선 간단하게 입력한 단어가 뜨게 하는 코드를 작성해볼 것이다.

프로젝트를 만들고
vim을 통해 main.rs을 수정하자.
use clap::Parser;
#[derive(Parser)]
struct Args{
#[arg(short, long)]
message: String,
}
fn main(){
let args = Args::parse;
println!("메시지: {}", args().message);
}
코드를 완성하였다. 이제 저장하고 실행을 해보자
우선 실행하기 전에
use clap::Parser;
같은 경우 라이브러리이므로 다운을 받아야한다.
cargo add clap --features derive
명령어를 입력하고 다운을 받자.
그리고 이제 코드가 정상작동 하는지 실행을 한번 해보자.
cargo run -- --message "<내가 입력하고 싶은 단어>"
위 코드를 cmd에 입력하면

메시지: helloworld
정상 작동하는 것을 볼 수 있다.
이제 제대로 된 CLI TOOL을 개발해 보자
요번에 만들 것은 타이머 기능이다.
공부할때 쓸 수 있도록 집중시간과 그 집중시간이 끝나면 쉬는 시간을 주며 반복을 하는 기능이다.
우선 TOOl을 만들기 위해 폴더를 하나 생성한다.
나는 studytime이라는 폴더를 만들었다.
우선 clap은 필수이므로 clap을 추가한다.
cargo.toml에 가면 clap이 추가가 되어있는지 확인이 가능하다.
다음으로 main.rs를 작성하자
use clap::Parser;
use std::thread::sleep;
use std::time::{Duration, Instant};
#[derive(Parser, Debug)]
헤더 부분이다.
다음으로 공부시간과, 휴식시간을 정하는 코드이다. 우선 공부시간은 25분, 휴식시간은 5분으로 지정하였다.
struct Args {
#[arg(short, long, default_value_t = 25)]
focus: u64,
#[arg(short, long, default_value_t = 5)]
rest: u64,
}
그리고 이제 그 코드를 실행했을때 타이머가 출력되게 해주는 코드를 작성했다.
fn main() {
let args = Args::parse();
println!("🔥 공부 시작: {}분", args.focus);
run_timer(args.focus * 60, "🕖 집중 중...");
println!("💤 쉬는 시간: {}분", args.rest);
run_timer(args.rest * 60, "😴 쉬는 중...");
println!("✅ 1라운드 완료!");
}
남은 시간을 보여주는 코드도 작성하였다.
fn run_timer(seconds: u64, label: &str) {
let _start = Instant::now();
for remaining in (0..seconds).rev() {
print!("\r{} 남은 시간: {:02}:{:02}", label, remaining / 60, remaining % 60);
std::io::Write::flush(&mut std::io::stdout()).unwrap();
sleep(Duration::from_secs(1));
}
println!("\r🔔 시간 종료!");
}
전체 코드이다.
use clap::Parser;
use std::thread::sleep;
use std::time::{Duration, Instant};
#[derive(Parser, Debug)]
struct Args {
#[arg(short, long, default_value_t = 25)]
focus: u64,
#[arg(short, long, default_value_t = 5)]
rest: u64,
}
fn main() {
let args = Args::parse();
println!("🔥 공부 시작: {}분", args.focus);
run_timer(args.focus * 60, "🕖 집중 중...");
println!("💤 쉬는 시간: {}분", args.rest);
run_timer(args.rest * 60, "😴 쉬는 중...");
println!("✅ 1라운드 완료!");
}
fn run_timer(seconds: u64, label: &str) {
let _start = Instant::now();
for remaining in (0..seconds).rev() {
print!("\r{} 남은 시간: {:02}:{:02}", label, remaining / 60, remaining % 60);
std::io::Write::flush(&mut std::io::stdout()).unwrap();
sleep(Duration::from_secs(1));
}
println!("\r🔔 시간 종료!");
}
이제 작동시켜 보자
cmd창에
cargo run -- --focus <원하는 시간> --rest <원하는 시간>
을 입력하면?
테스트를 위해 시간을 1분으로 설정하였다.

초단위로 시간이 흘러가는 것을 볼 수 있다.

공부시간이 끝나면 쉬는 시간이 출력된다.
그리고 쉬는 시간 타이머가 끝나면

완료 되었다는 말과 함께 끝난다.
코드가 정상작동 하는 것을 확인하였다.
다음으로 추가기능을 넣어보자
코드를 추가하고 수정하자.
우선 struct Args에 rounds를 추가하고
struct Args{
#[arg(short, long, default_value_t = 1)]
rounds: u64,
}
그런데 여기서 문제가 있다.
바로 rest와 rounds의 단축옵션이 중복이 된다는 것이다.
그러므로 코드를 이렇게 수정하였다.
struct Args {
#[arg(short, long, default_value_t = 25)]
focus: u64,
#[arg(short, long, default_value_t = 5)]
breaktime: u64, // rest --> breaktime
#[arg(short, long, default_value_t = 1)]
rounds: u64,
}
그리고 메인 코드도 수정과 추가를 하였다.
fn main() {
let args = Args::parse();
for round in 1..=args.rounds { // --> 라운드 반복문
println!("✔️ 라운드 {}/{}", round, args.rounds); // 몇라운드인지 확인하는 출력하는 코드
println!("🔥 집중 시작: {}분", args.focus);
run_timer(args.focus * 60, "⏰ 집중 중...");
if round != args.rounds {
println!("💤 쉬는 시간: {}분", args.breaktime); // rest -> breaktime
run_timer(args.breaktime * 60, "😴 쉬는 중..."); // rest -> breaktime
}
println!("✅ 라운드 {}/{} 완료!\n", round, args.rounds);
}
println!("🎉 모든 라운드를 완료했습니다! 수고하셨어요 👏");
}
이것으로 수정을 끝냈다.
이제 정상작동 하는지 보고 마무리하자
실행 코드는
cargo run -- --focus <시간> --breaktime <시간> --rounds <시간>
이다

라운드를 2로 지정하였고 위와 같이 2라운드후 종료되는 것을 알 수 있다.
이것으로 CLI TOOL개발이 완료 되었다.
다음에는 RUST로 새로운 무언가를 만들어보자.