러스트

Rust 실전 강좌 #7 릴리스 최적화와 크로스 컴파일: 작고 빠른 바이너리를 어디서나
4 분 소요

Rust 실전 강좌 #7 릴리스 최적화와 크로스 컴파일: 작고 빠른 바이너리를 어디서나

배포 준비의 전반부입니다. [profile.release]로 조이는 최적화(lto, codegen-units, strip)와 각 옵션의 대가, panic = "abort"를 함부로 켜면 안 되는 이유, 바이너리 크기가 줄어드는 과정, 그리고 rustup target으로 하는 크로스 컴파일 — 특히 glibc 의존을 없애 오래된 서버에서도 도는 musl 정적 링크 빌드와 링커 문제를 도커로 우회하는 cross 도구까지 다루겠습니다.

Rust 실전 강좌 #6 테스트: 파서 단위 테스트에서 CLI 통합 테스트까지
4 분 소요

Rust 실전 강좌 #6 테스트: 파서 단위 테스트에서 CLI 통합 테스트까지

loglens에 안전망을 두릅니다. 같은 파일 안에 두는 #[cfg(test)] 단위 테스트(파서의 정상·경계·실패 케이스), tests/ 디렉터리의 통합 테스트, assert_cmd와 predicates로 빌드된 바이너리를 실제로 실행해 출력과 종료 코드를 검증하는 CLI 테스트, tempfile로 만드는 임시 로그 파일, 그리고 cargo test가 테스트를 병렬 실행한다는 사실이 갖는 함의까지 다루겠습니다.

Rust 실전 강좌 #5 rayon 병렬화: 데이터 레이스 없는 map-reduce
4 분 소요

Rust 실전 강좌 #5 rayon 병렬화: 데이터 레이스 없는 map-reduce

집계를 여러 코어에 나눕니다. 병렬화가 이득인 조건(CPU 바운드)과 스트리밍에서 통째 읽기로 전략을 바꾸는 이유, rayon의 par_lines와 fold·reduce로 만드는 스레드별 부분 집계와 병합, Mutex로 하나의 HashMap을 공유하면 느려지는 이유(락 경합), 그리고 공유 가변 상태 실수를 컴파일러가 잡아내는 장면까지 다루겠습니다.

Rust 실전 강좌 #4 이터레이터 실전: 집계와 top-N, 그리고 release 빌드의 차이
4 분 소요

Rust 실전 강좌 #4 이터레이터 실전: 집계와 top-N, 그리고 release 빌드의 차이

파서 위에 분석을 올립니다. 파싱 실패를 세면서 성공만 흘려보내는 집계 구조, HashMap entry로 만드는 상태 코드 분포, 정렬로 뽑는 top-N, 커맨드 두 개(stats·top)의 완성, 그리고 Instant로 직접 재 보는 debug와 release 빌드의 성능 차이(왜 수십 배가 나는지, 왜 release가 기본값이 아닌지)까지 다루겠습니다.

Rust 실전 강좌 #3 파일 IO와 파싱: BufReader로 읽고, 로그 한 줄을 구조체로
4 분 소요

Rust 실전 강좌 #3 파일 IO와 파싱: BufReader로 읽고, 로그 한 줄을 구조체로

대용량 파일을 다루는 두 가지 기본기를 세웁니다. 전체를 메모리에 올리는 read_to_string과 줄 단위로 흘리는 BufReader의 선택 기준, 시스템 콜과 버퍼링의 관계, 액세스 로그 한 줄을 LogEntry 구조체로 바꾸는 파서(따옴표 처리, 상태 코드 변환, 2편 ParseError의 실전 투입), 그리고 serde로 JSON Lines 로그까지 받는 확장을 다루겠습니다.

Rust 실전 강좌 #2 에러 설계: anyhow와 thiserror, 죽는 방법을 설계한다
5 분 소요

Rust 실전 강좌 #2 에러 설계: anyhow와 thiserror, 죽는 방법을 설계한다

CLI 도구에서 에러 메시지는 사용자 인터페이스의 일부입니다. 애플리케이션 계층의 기본값인 anyhow(main이 anyhow::Result를 반환, context로 맥락 쌓기)와 라이브러리 계층의 thiserror(호출자가 종류로 분기할 수 있는 구체 에러 타입)의 역할 분담, 두 크레이트를 고르는 판단 기준, 그리고 종료 코드까지 loglens의 에러 경로를 설계하겠습니다.

Rust 실전 강좌 #1 프로젝트 설계와 clap: 서브커맨드 CLI의 뼈대 잡기
4 분 소요

Rust 실전 강좌 #1 프로젝트 설계와 clap: 서브커맨드 CLI의 뼈대 잡기

기초 강좌에서 배운 문법으로 실제 도구를 만드는 실전 8편을 시작합니다. 만들 것은 액세스 로그 분석 CLI인 loglens입니다. 왜 CLI 도구가 Rust의 대표 무대인지(단일 바이너리, 시작 속도), clap의 derive 방식으로 서브커맨드(stats, top, errors)를 열거형 하나로 선언하는 법, 자동 생성되는 --help, 그리고 8편 전체의 설계 지도까지 다루겠습니다.

Rust 기초 강좌 #9 수명과 모듈: lifetime 표기가 필요한 순간, 모듈과 크레이트까지
5 분 소요

Rust 기초 강좌 #9 수명과 모듈: lifetime 표기가 필요한 순간, 모듈과 크레이트까지

기초 강좌의 마지막 편입니다. 4편의 댕글링 참조 차단이 어떻게 작동했는지를 수명(lifetime)으로 설명하고, missing lifetime specifier 에러가 나는 순간과 수명 매개변수 표기의 진짜 의미(수명을 늘리는 것이 아니라 관계를 선언하는 것), 대부분 표기가 생략되는 이유를 다룹니다. 이어서 mod와 pub으로 코드를 나누는 모듈 시스템, crates.io에서 외부 크레이트를 쓰는 법, 그리고 강좌 이후의 학습 경로까지 정리하겠습니다.

Rust 기초 강좌 #8 트레이트와 제네릭: 상속 없이 공통 동작을 정의하는 법
4 분 소요

Rust 기초 강좌 #8 트레이트와 제네릭: 상속 없이 공통 동작을 정의하는 법

지금까지 미뤄 온 개념을 회수하는 편입니다. 공통 동작을 정의하는 트레이트(trait)와 기본 구현, 타입을 일반화하는 제네릭과 트레이트 바운드, derive가 자동 생성하는 표준 트레이트(Debug·Clone·Copy·PartialEq), 제네릭이 런타임 비용 없이 컴파일되는 단형화, 그리고 Box<dyn Error>의 dyn이 뜻하는 동적 디스패치까지 다루겠습니다.

Rust 기초 강좌 #7 컬렉션과 이터레이터: Vec·String·HashMap과 for문을 대체하는 체인
4 분 소요

Rust 기초 강좌 #7 컬렉션과 이터레이터: Vec·String·HashMap과 for문을 대체하는 체인

실무 코드의 몸통인 세 컬렉션을 다룹니다. 가변 길이 배열 Vec과 인덱스 대신 get을 쓰는 이유, 왜 String은 인덱스로 접근할 수 없는지(UTF-8과 바이트·문자의 차이), HashMap과 entry API, 그리고 for 반복문을 map·filter·collect 체인으로 바꾸는 이터레이터 스타일과 지연 평가까지 다루겠습니다.

Rust 기초 강좌 #6 에러 처리: Result와 ? 연산자, panic·unwrap 사용 기준
5 분 소요

Rust 기초 강좌 #6 에러 처리: Result와 ? 연산자, panic·unwrap 사용 기준

예외(exception)가 없는 Rust의 에러 처리를 다룹니다. 실패 가능성을 반환 타입에 드러내는 Result, match 중첩을 한 글자로 줄이는 ? 연산자와 에러 전파, main이 Result를 반환하는 실용 형태, 그리고 unwrap·expect·panic을 언제 써도 되고 언제 쓰면 안 되는지의 판단 기준까지 다루겠습니다.

Rust 기초 강좌 #5 구조체와 열거형: match와 Option, null이 없는 언어의 설계
4 분 소요

Rust 기초 강좌 #5 구조체와 열거형: match와 Option, null이 없는 언어의 설계

데이터를 구조화하는 두 축인 구조체(struct)와 열거형(enum)을 다룹니다. impl 블록으로 메서드를 붙이는 법, variant마다 다른 데이터를 담는 Rust 열거형의 표현력, 모든 경우를 검사했는지 컴파일러가 강제하는 match, 그리고 null 대신 "값이 없을 수 있음"을 타입으로 드러내는 Option까지, Rust 코드의 뼈대가 되는 도구들을 다루겠습니다.