2024년 Rust를 배우는 방법: Rust 프로그래밍 마스터를 위한 완벽한 초보자 가이드
새롭게 배울 다음 프로그래밍 언어로 Rust를 생각하시나요? 여러분은 코드를 작성한다는 것이 무슨 의미인지 알고 있고, 적어도 하나의 프로그래밍 언어, 아마도 Python이나 JavaScript에 대한 경험이 있을 것입니다. Rust에 대해서는 아마 이곳 저곳에서 들어보셨을 겁니다. 안전성과 높은 성능을 제공하고 다른 프로그래밍 언어(예: C 또는 C++)에서는 피하기 어려운 문제를 해결하는 최신 시스템 프로그래밍 언어라는 평이 일반적입니다. Rust의 인기가 높아지고 있다는 말도 들립니다. Google, Microsoft, Amazon 등 해당 분야의 거대 기업들이 이미 이를 채택하고 있다고 소개하는 블로그 게시물도 종종 볼 수 있습니다. 다양한 산업에서 도입이 계속 증가하고 있다고 소개하는 글도 있습니다. 하지만 Rust가 배우기 쉬운 언어가 아니라는 얘기도 있어 과연 자신이 이 언어를 소화할 수 있을지 걱정되기도 할 겁니다.
위의 설명이 꼭 자신의 이야기같이 들리신다면 이 게시물은 여러분을 위한 것입니다. 이 글을 통해 여러분이 Rust를 접하면서 가질 수 있는 모든 질문에 답해 드리려 합니다. 우선 소프트웨어 개발자가 Rust를 배우면서 이를 다른 경쟁 프로그래밍 언어와 비교하는 것이 유익한 이유에 대해 알아보겠습니다. 그런 다음 가장 중요하게 알아 두어야 할 Rust의 기능과 개념을 설명하겠습니다. Rust는 이러한 기능 덕에 프로그래밍 언어 분야에서 개발된 빛나는 결과물로 자리매김하게 되었습니다. 이를 염두에 두고, 그럼 지금부터 시작 단계에 권장되는 사항과 교육 리소스(책자, 가이드, 튜토리얼 및 교육 과정) 및 가장 효율적인 학습 경로를 제안하겠습니다. Rust를 배우는 동안 이따금 어려움에 직면할 수 있으므로 이를 극복하는 방법에 대해서도 안내해 드리겠습니다. 마지막으로, Rust의 가치가 진정으로 빛나는 소프트웨어 영역을 다루면서 어떻게 접근하면 좋을지에 대해 보여 드리겠습니다.
2024년에 Rust를 배워야 하는 이유는?
개발자 설문조사에 따르면 Rust는 IT 업계에서 가장 많이 사용되는 상위 12개 프로그래밍 언어 중 하나입니다. 조사 데이터에 따르면 소프트웨어 개발자의 10~13%가 Rust를 정기적으로 사용합니다. 코딩을 배우려는 사람만 살펴보면 Rust의 점유율이 11~18%에 이른다는 점은 주목할 부분입니다. 즉, Rust를 배우려는 사람들이 Rust 성장을 강력하게 견인하고 있습니다. 예를 들어, 개발자 에코시스템 설문조사에 따르면 Rust는 지난 6년 동안 꾸준히 성장했으며 그 기세가 꺾일 기미를 보이지 않습니다.
“Likely to adopt”(채택할 가능성이 높음) 열에 주목하세요. 여기에서 두 자릿수를 보이는 언어는 Rust뿐입니다!
Rust에 대한 개발자의 평가도 단연 높습니다. 어떻게 알 수 있을까요? StackOverflow 개발자 설문조사를 보면 놀라운 증거를 확인할 수 있습니다.
- Rust는 개발자 커뮤니티에서 수년간(8년? 9년? 아무도 기억하지 못하겠죠!) 연속으로 가장 촉망받는 언어의 자리를 지키고 있습니다.
- 이미 Rust를 사용하는 사람들은 다른 프로그래밍 언어로 전환할 생각이 없습니다.
저는 Rust 개발자 콘퍼런스에 정기적으로 참석하는 사람이기에 Rust에 대한 이러한 평가가 사실임을 실감할 수 있습니다. Rust 개발자들은 Rust에 대한 애정을 가지고 매우 편안하게 참여할 수 있는 커뮤니티를 만들었습니다.
한편, StackOverflow 설문조사에서는 지난 몇 년 동안 연봉 중앙값이 감소했다고 보고했지만 이러한 추세는 다른 주류 프로그래밍 언어에서도 나타나고 있습니다. 대규모 및 중간 규모 IT 기업에서는 채택률이 증가하고 있는 반면, 수많은 소규모 기업에서는 아직 Rust의 채택이 본격화되지 않았습니다. 이는 추후 구직 시장에서 Rust의 채용 기회가 늘어나 경쟁이 지금보다 덜 치열해질 가능성이 있음을 시사합니다(그 맥락을 알아보려면 이 흥미로운 토론에 참여해 보세요).
언어, 기능 및 에코시스템을 살펴보면 이러한 수치가 어디서 나왔는지 바로 알 수 있습니다. Rust는 메모리 안전성과 성능을 동시에 제공하도록 개발되었습니다. Rust 언어 설계자의 선택에서 독특한 부분은 코드에서 메모리 액세스 오류를 줄여 보안 침해 가능성을 낮추려는 것입니다. 이러한 이점을 얻는 대가로 성능을 포기할 필요는 없습니다. 그렇다면 어떤 대가를 치러야 할까요? 그건 바로 개발자가 Rust 컴파일러에게 코드가 정말 안전하다고 설득하는 데 걸리는 시간일 것입니다. 컴파일러가 동의하면 더 걱정할 일은 없습니다. 메모리 안전성과 성능은 매우 중요합니다. 이 두 가지가 모두 확보되면 소프트웨어 솔루션을 사용하는 사람들(요즘은 모든 사람)에게 훨씬 더 원활한 경험을 제공할 수 있습니다. Rust의 표준 라이브러리, 기타 기본 라이브러리 및 툴링도 개발자 경험을 향상합니다. 예를 들어, Rust에서 고성능 동시 애플리케이션을 개발하는 것은 큰 문제가 아닙니다. 에코시스템이 성숙하고 이러한 작업을 지원할 만큼 견실해졌기 때문입니다.
개발자들은 Rust 지식을 적용할 수 있는 기술 영역과 업계 범위가 넓어진 점도 높이 평가합니다. 이러한 영역으로 최근 Rust 연례 설문조사에서 다음이 확인되었습니다.
- 서버 측 및 기타 백엔드 애플리케이션
- 클라우드 컴퓨팅 애플리케이션, 서비스 및 인프라
- 분산형 시스템
- 컴퓨터 네트워킹
- 컴퓨터 보안
- 임베디드 개발
- 게임 개발
- 웹 프런트엔드(WebAssembly 포함)
- 기타 등등
물론, Rust가 이러한 분야에서 사용되는 유일한 프로그래밍 언어는 아닙니다. 각 분야에는 경쟁자가 있습니다. Rust는 많은 영역을 공유한다는 점에서 C++ 또는 Go와 비교되는 경우가 종종 있지만 메모리 안전 보장, 성능 약속, 툴링과 라이브러리의 제공 여부, 언어의 단순성, 업계 채택 저변 등 다양한 측면에서 차이가 있습니다. 마지막 세 가지 범주에서는 Rust가 뒤처질 수 있지만 성능 면에서는 C++와 동등하며, 메모리 액세스 함정을 피하고 오류 없는 애플리케이션을 훨씬 쉽게 구축할 수 있습니다.
Rust의 핵심 개념 이해
Rust와 그 기능에 대해 개괄적으로 살펴보겠습니다. Rust는 객체 지향 프로그래밍 언어도 아니고 함수형 프로그래밍 언어도 아닙니다. 클래스를 제공하지 않으며 객체 지향 패턴을 직접 지원하지도 않습니다. 함수를 일급 값으로 사용할 수 있지만, 완전한 함수형 언어(예: Haskell 또는 OCaml)에 비해 제한적입니다.
함수, 값 및 타입을 이용한 코드 작성
Rust의 프로그램은 모듈에 결합된 함수 컬렉션으로 구성됩니다. 함수는 값을 조작합니다. 값은 정적으로 타입이 지정되므로 모든 값이나 표현식에는 컴파일링 시에 타입이 할당되어야 합니다. Rust는 기본 및 복합 타입(배열 및 구조체)을 모두 제공하며 표준 라이브러리는 값 컬렉션에 대한 많은 추가 타입도 제공합니다. Rust는 제네릭 타입을 지원하므로 특정 타입을 언급하지 않고 보다 일반적인 정의를 제공할 수 있습니다. Rust는 또한 특정 타입에 대해 구현할 수 있는 메서드(즉, 함수) 컬렉션으로 특성을 제공합니다. 특성을 사용하면 Rust에서 상속 및 다형성을 지원하는 객체 지향 언어와 동일한 수준의 소프트웨어 추상화를 얻을 수 있습니다.
메모리 관리
Rust의 메모리 관리 접근 방식은 다음 원칙을 기반으로 합니다. Rust 컴파일러는 코드에서 메모리가 할당된 정확한 위치, 메모리에 액세스하는 위치와 방법, 그리고 더 이상 필요하지 않은 위치를 알아야 합니다. 이러한 정보를 알면 생성된 코드에 해당 명령을 직접 삽입하여 메모리 액세스를 제어하고 할당된 메모리를 자동으로 해제할 수 있으므로 다른 언어에서 발생할 수 있는 많은 일반적인 문제를 피할 수 있습니다. 이 접근 방식은 더 이상 필요 없는 메모리 조각을 런타임에 감지하고 가비지를 수집하는 자동 메모리 관리(JavaScript, Python, Java 또는 C#의 경우)와는 다릅니다. 결과적으로, Rust는 런타임에 해당 알고리즘을 실행하는 데 필요한 시간을 절약하고 메모리 안전성과 성능을 모두 확보합니다.
메모리 액세스에 대한 정보를 추론할 수 있도록 Rust는 메모리로 수행할 수 있는 작업에 제한을 설정하고 정확성을 보장하는 엄격한 규칙을 정의합니다.
- 모든 메모리 조각은 단일 변수가 소유해야 합니다. Rust의 소유권 모델은 이를 기반으로 합니다.
- 메모리 조각을 변형하려면 배타적 액세스가 필요합니다(단순히 메모리를 읽는 것과는 반대).
- Rust는 메모리 조각에 대한 가변 및 불변 참조의 생성(빌림)을 허용하지만 빌림 검사기를 통해 정확성을 강제합니다(예를 들어, 둘 이상의 가변 참조 금지).
- Rust 컴파일러는 프로그램의 모든 변수에 대해 변수가 생성된 위치에서 삭제되는 위치(더 이상 액세스할 수 없는 위치)까지의 라이프타임을 계산하고 검사합니다.
컴파일러의 요구 사항이 너무 엄격할 수 있습니다. 이는 특히 언어를 배울 때 흔히 좌절을 맛보는 부분일 수 있습니다. 논리적으로는 올바른 코드 조각이지만 Rust 컴파일러가 이를 허용하지 않을 수 있기 때문입니다.
이러한 개념을 조금 더 쉽게 이해하기 위해 다음 Python 프로그램이 Rust로 동일하게 옮겨졌을 때 어떻게 되는지 논의해 보겠습니다.
def print_list(numbers): for number in numbers: print(str(number) + " ", end="") print() def add_one(numbers): numbers.append(1) def main(): numbers = [1, 1, 1] print_list(numbers) add_one(numbers) print_list(numbers) if __name__ == '__main__': main()
여기에 세 개의 요소를 가진 메모리 조각(Python의 목록)이 있습니다. 이를 출력하고, 요소를 하나 더 추가하고, 다시 출력합니다. 여기서는 어떤 타입도 언급하지 않습니다. 어떤 시점에서든 메모리가 할당되고 해제되어야 하지만, Python에는 프로그램의 메모리 관리에 대한 어떤 표시도 필요하지 않습니다. 또한 메모리 액세스 제어에 대해 고려하지 않아도 numbers
목록을 쉽게 전달할 수 있습니다.
이와 동일한 코드를 Rust로 만들면 구문뿐만 아니라 타입과 메모리 관리에 대한 전체적인 접근 방식이 달라집니다.
// 여기서 벡터를 참조로 취합니다(&). // 요소를 변경하는 것은 허용되지 않습니다. // 소유권을 취하지 않고 빌리기만 합니다. fn print_vec(numbers: &Vec) { for number in numbers { print!("{} ", number); } println!() } // 여기서 벡터를 가변 참조로 취합니다(&mut). // 요소와 벡터 자체를 변경하는 것은 허용되지 않습니다. // 여전히 소유권을 취하지 않고 빌리기만 합니다. fn add_one(numbers: &mut Vec) { numbers.push(1) } fn main() { let mut numbers = vec![1,1,1]; // 참조를 전달합니다. print_vec(&numbers); // 가변 참조를 전달합니다. add_one(&mut numbers); // 참조를 다시 전달합니다. print_vec(&numbers); }
이 두 코드 조각을 살펴보고 두 코드의 유사점과 차이점을 직접 찾아보면 많은 도움이 될 겁니다. Rust를 이해하지 못하더라도 이 코드를 보는 것만으로 Rust가 어떤 것인지 대체적인 느낌을 얻을 수 있습니다.
참조를 전달하더라도 numbers 변수는 여전히 할당된 메모리를 소유합니다. Rust는 기본적으로 읽기 전용 메모리 액세스를 사용하므로 쓰기 액세스에 대해 명시적으로 지정해야 합니다. Rust는 또한 두 번째 print_vec
호출에서 마지막 사용 후 메모리가 해제되도록 합니다.
다음은 벡터의 소유권을 취하고 전체 프로그램을 잘못 렌더링하는 add_one 함수의 변형입니다.
fn add_one_incorrect(mut numbers: Vec) { numbers.push(1) }
무엇이 문제일까요? add_one_incorrect
함수를 호출한 후, numbers 변수는 더 이상 메모리를 소유하지 않습니다. 즉, 라이프타임이 끝났으므로 아무것도 출력할 수 없습니다! 아래 스크린샷은 문제가 있음을 보여줍니다.
Rust의 빌림 검사기는 잘못된 버전이 삽입되기 전에는 참조를 전달해도 아무 문제가 없도록 할 수 있었습니다. 하지만 오류가 삽입된 후에는 더 이상 그럴 수 없습니다. 이러한 언어의 동작은 메모리 액세스가 어떻게 엄격히 제어되는지 잘 보여줍니다.
동시성
동시성이란 시스템이 효율성과 성능을 개선하기 위해 여러 작업이나 프로세스를 동시에 또는 겹치는 기간에 실행할 수 있는 능력을 말합니다. 여기에는 여러 프로세서에서의 병렬 실행이나 단일 프로세서에서의 인터리브 실행이 포함될 수 있으며, 이를 통해 시스템은 여러 연산을 동시에 처리하고 여러 작업을 보다 효과적으로 수행할 수 있습니다.
Rust 개발자들은 종종 Rust의 동시성이 거침 없다고 표현하고는 합니다. 이렇게 생각하는 데에는 몇 가지 이유가 있습니다.
- 소유권 모델은 동시 스레드 간의 데이터 공유를 더 강력하게 제어합니다.
- 변경 불가한 데이터 구조를 채택하므로 동시 알고리즘 구현이 간소화되고 스레드 안전성이 향상됩니다.
- Rust에서 사용되는 채널을 통한 메시지 전달은 공유 상태 동시성의 복잡성을 획기적으로 줄여줍니다.
- Rust의 라이프타임 및 메모리 관리 방식은 일반적으로 락, 세마포어 또는 배리어와 같은 동시성 기본 요소를 사용하는 코드를 더 간결하고 안전하게 만듭니다.
- 많은 경우에 Rust의 비동기 프로그래밍 방식은 복잡한 동시성 패턴을 사용하지 않고 간결하고 명확한 코드 작성을 돕습니다.
동시성은 초보자가 Rust에 접근할 때 가장 먼저 배우는 개념은 아니지만, 다른 많은 프로그래밍 언어보다 이해하기가 쉽습니다. 더욱이, Rust에서는 오류 발생이 적은 동시성 코드를 작성할 수 있습니다.
Rust를 시작하는 방법
컴퓨터에 두 가지만 설치하면 Rust를 시작할 수 있습니다.
- Rust 툴체인 – Rust 컴파일러와 기타 유틸리티를 포함하는 도구 모음
- 코드 에디터 또는 IDE(통합 개발 환경)
첫 단계는 간단합니다. rustup.rs로 가서 운영 체제에 따라 제안된 명령어를 실행하거나 설치 프로그램을 다운로드하면 됩니다.
두 번째 단계에서는 선택을 해야 합니다. Rust 지원을 제공하도록 구성된 코드 에디터를 사용하거나(예를 들어, Visual Studio Code는 Rust를 지원하지만 약간의 설정이 필요함) 전용 Rust IDE(Rust를 배우는 모든 사람에게 무료로 제공되는 JetBrains IDE인 RustRover 등)를 사용하는 옵션이 있습니다.
RustRover를 선택하는 경우, 아무것도 구성할 필요가 없습니다. 프로그램을 실행하고, 새 프로젝트를 만들고(시작 화면에서 New Project(새 프로젝트) 버튼 사용) 기본적으로 생성된 Hello, world! 프로그램을 실행하면 됩니다(여백에 있는 녹색 삼각형 아이콘을 사용하여 main 함수 실행).
문제가 발생하면 RustRover의 빠른 시작 가이드를 참조하세요.
정말 간단한 작업이 아니라면 외부 종속성을 추가해야 합니다. Rust 프로젝트에는 패키지 관리자인 Cargo가 필요합니다. Rust에서는 패키지를 크레이트라고 부릅니다. 종속성은 Cargo.toml
파일에 다음과 같이 지정됩니다.
[package] name = "hello" version = "0.1.0" edition = "2021" [dependencies] chrono = "0.4.38"
chrono
크레이트를 종속성에 추가한 후에는 코드에서 해당 크레이트가 제공하는 기능을 사용할 수 있습니다. 예를 들면 다음과 같습니다.
use chrono::{DateTime, Local}; fn main() { println!("Hello, world!"); let local: DateTime = Local::now(); println!("Today is {}", local.format("%A")); }
이 프로그램에서는 현재(현지) 날짜와 시간을 가져와 이를 요일 형식으로 표시한 다음 결과를 출력합니다. 예를 들어, 이 프로그램을 실행하면 다음과 같은 결과가 나옵니다.
Hello, world! Today is Thursday
Rust에서 기본 구문, 데이터 타입, 제어 구조(if 조건문, 루프 등)를 배우면 사용 가능한 크레이트와 그 크레이트가 제공하는 기능에 대해서도 동시에 알게 됩니다. Rust 프로그램을 실행할 수 있게 되면 외부 종속성을 처리할 준비가 된 것입니다. Rust를 배우는 데 도움이 되는 리소스에 대해 알아보겠습니다.
학습 경로 및 리소스
외국어를 배운 적이 있다면 읽기, 쓰기, 듣기, 말하기 등 다양한 기술이 필요하다는 사실을 알고 있을 겁니다. 이러한 능력을 개발하기 위한 활동도 다양합니다. 교사들은 항상 학생들에게 텍스트를 읽고, 영상을 시청하고, 팟캐스트를 듣고, 가능하면 최대한 말하고, 소셜 미디어에 글을 게시하는 등의 활동을 권장합니다. 프로그래밍 언어를 배우는 것도 다르지 않습니다. Rust(또는 다른 프로그래밍 언어)로 코딩하는 방법을 배울 때는 다음과 같이 해보세요.
- 서적, 문서, 블로그 게시물, 릴리스 공지, 및 소셜 미디어 토론 등을 읽습니다(모두 최신 정보와 동향을 따라가는 데 필수적인 자료).
- 기술 동영상 블로거의 영상을 시청합니다.
- 코드 샘플을 살펴봅니다(반드시 이러한 코드를 읽고 수정해 봐야 함!).
- 연습 문제의 코드를 끝까지 작성합니다.
- 실습 튜토리얼을 따릅니다.
- 간단한 프로젝트를 처음부터 개발합니다(매우 중요한 연습으로, 프로젝트 기반 학습은 스스로 코딩하는 능력을 개발하는 데 항상 도움이 됨).
- 오픈 소스 프로젝트에 기여하는 것도 좋습니다(초보자에게 충분히 쉬운 프로젝트도 항상 있으니 물어볼 것!).
프로그래밍 자료를 읽고 코드를 작성하는 노력을 균형적으로 유지해야 한다는 점에 유의하세요. 실제로 코드를 작성하지 않고 프로그래밍 언어를 완벽하게 익힐 수는 없습니다. 이와 동시에 책이나 기타 보충 자료를 읽지 않으면 내부적인 세부 사항을 피상적으로밖에 이해하지 못할 수 있습니다. 복잡한 문제의 경우에는 다른 사람의 도움 없이 해결하기가 매우 어려울 수 있습니다(필수적인 것은 아니지만 전문 개발자가 되는 데 시간이 더 오래 걸릴 수 있음).
코드를 작성할 때는 만들어져 있는 연습 문제를 그대로 따라하는 것뿐만 아니라 자신의(또는 다른 데서 가져온) 아이디어를 바탕으로 간단한 애플리케이션을 개발하는 것도 중요합니다. 연습할 때 알고리즘을 이해하는 데만 초점을 두지 말고 언어의 기능과 라이브러리 기능도 익혀야 합니다. 간단한 애플리케이션을 개발할 때는 목적에 가장 적합한 언어 기능이나 라이브러리를 선택하는 방법을 배우세요. 이는 그 자체로 필수적인 기술입니다.
성공적인 학습의 핵심은 모든 접근 방식을 결합하는 것입니다. 학습에 도움이 될 수 있는 여러 가지 리소스를 모아봤습니다.
Rust 서적
Rust 학습을 위한 좋은 책들이 많이 나와 있습니다.
- The Rust Programming Language는 Rust 학습자를 위한 공식 책자로, 정기적으로 업데이트됩니다. 커뮤니티에서는 The Book이라고 알려져 있습니다. 퀴즈, 시각화, 연습 문제 등 더 많은 학습 콘텐츠가 추가된 다른 버전도 추천합니다. 이 버전은 브라운 대학 연구원인 Will Crichton, Gavin Gray 및 Shriram Krishnamurthi가 공동 개발했습니다. Rust 학습자의 경험을 향상시키기 위한 이 실험에 대해 논의하는 Will Crichton과의 인터뷰도 있습니다.
- Tim McNamara가 쓴 Rust in Action(timClicks라는 이름으로 더 유명함. 어떤 경우든 이 사람의 조언을 따르는 게 좋음).
- Herbert Wolverson이 쓴 Hands-on Rust – 프로젝트 기반 학습을 중요시하는 사람들에게 특히 매력적인 책입니다(다양한 Rust 개념을 소개하는 Herbert의 무료 동영상도 많이 시청할 수 있으므로 강력 추천).
- Jon Gjengset이 쓴 Rust for Rustaceans는 많은 커뮤니티 회원들이 극찬하는 Rust 관련 서적입니다.
- Brenden Matthews이 쓴 Code Like a Pro in Rust
- David MacLeod이 쓴 Learn Rust in a Month of Lunches
- Rust를 몇 개월 배운 후에는 Mara Bos의 Rust Atomics and Locks를 꼭 읽어보세요. Rust 동시성의 세부 개념을 설명하는 훌륭한 책자입니다.
Rust 튜토리얼
실습 위주로 학습하려는 사람들을 위한 튜토리얼과 연습을 포함한 교육 과정도 마련되어 있습니다.
- Comprehensive Rust는 Google에서 내부적으로 개발한 Rust 튜토리얼이지만 누구나 이용할 수 있습니다. 필요한 모든 세부 사항을 빠르게 배우려는 사람들에게 가장 적합한 리소스입니다.
- Rustlings(및 IDE 내 학습 경험을 위한 버전, JetBrains Academy의 Rust 과정)
- 100 exercises to learn Rust – Luca Palmieri(주목해야 할 또 한 명의 Rust 개발자)가 연습 문제를 넣어 개발한 환상적인 과정입니다.
- Eleftheria Batsou는 Rust를 배우는 동안 시도해볼 수 있는 간단한 프로젝트 아이디어 모음을 제공합니다.
Rust 관련 YouTube 채널
YouTube에서 배우는 것을 선호하는 Rust 개발자에게는 다음과 같은 여러 채널을 추천합니다.
- Let’s Get Rusty – 왜 그런지 잘 모르겠지만 이 동영상을 계속해서 보게 됩니다.
- Jeremy Chone은 복잡한 개념을 쉽게 설명하는 재능이 있습니다.
- Chris Biscardi는 무엇보다 Bevy 프레임워크를 이용하여 Rust에서 게임을 개발하는 주제를 다룹니다. 게임 제작은 누구에게나 훌륭한 프로젝트입니다!
- Jon Gjengset – Rust 여정을 시작한 후 처음 몇 년 동안은 그의 심도 있는 기술 스트림을 따라가기가 벅찰 수 있지만, 일찌감치 시청하는 것을 추천합니다!
Rust 커뮤니티
- Reddit의 Rust 커뮤니티는 팔로우해 볼 만한 곳입니다.
- Rust Community Discord server는 초보자가 질문을 할 수 있는 곳입니다.
- This Week in Rust는 Rust 관련 소식을 읽을 수 있는 가장 중요한 커뮤니티 리소스입니다. 저도 빠트리지 않고 매주 읽습니다.
물론, 모두 다 나열할 수는 없지만 훨씬 더 많은 학습 자료들이 있습니다. Rust라는 언어가 끊임없이 진화하고 있어 늘 배워야 한다는 점은 좋은 소식입니다.
일반적으로 겪는 문제와 이를 극복하는 방법
Rust를 배우는 과정에서 어려움이 있을 수 있습니다. 하지만 올바른 전략을 세운다면 이러한 어려움을 극복하고 언어를 완벽하게 익힐 수 있습니다. 도움이 될 수 있는 몇 가지 팁을 알려 드립니다.
- 소유권 모델을 이해하세요. 소유권, 빌림, 라이프타임과 같은 개념을 포함하는 Rust의 소유권 모델은 초보자에게 가장 어려운 측면인 경우가 많습니다. 간단한 예시부터 시작하고 자주 연습하세요. 컴파일러 오류를 해결하는 방법보다는 Rust가 이런 규칙을 적용하는 이유를 이해하는 데 집중하는 것이 좋습니다.
- 빌림 검사기를 사용할 때는 시간을 들이세요. 빌림 검사기는 엄격하고 혼란스러운 컴파일러 오류를 일으킬 수 있어 좌절감을 가져올 수 있습니다. 빌림 검사기 문제가 발생했을 때는 한 걸음 물러나 Rust가 무엇을 방지하려고 하는지 분석해 보세요. 데이터를 참조하거나 복제하는 방법으로 실험해 보세요(하지만 그대로 베끼지는 마세요!). Reddit이나 Rust Community Discord server와 같은 포럼에서 주저하지 말고 도움을 요청하세요. 빌림 검사기가 정확히 무엇인지 이해하면 정말 큰 도움이 됩니다. 예를 들어, Nell Shamrell-Harrington의 이 멋진 설명을 확인해 보세요.
- Rust의 훌륭한 문서를 활용하세요. Rust는 비교적 새로운 언어이므로 일부 자료는 기존 언어에서 제공되는 것만큼 완벽하지는 않을 수 있습니다. 포괄적이고 잘 작성된 것으로 알려진 Rust 문서를 활용하세요. Rust 커뮤니티에서도 Rust by Example 가이드와 같은 유용한 리소스를 제공합니다.
- 간단한 프로젝트부터 시작하세요. Rust가 가진 복잡성으로 인해 처음에는 간단한 프로젝트조차도 어렵게 느껴질 수 있습니다. 기본적인 프로그램부터 구현하고 점차 더 복잡한 프로그램으로 옮겨가세요. 간단한 프로젝트의 예로는 clap을 이용한 명령줄 도구 빌드, 간단한 파일 파서 작성, Rocket과 같은 프레임워크를 이용한 기본적인 웹 서버 제작 등이 있습니다.
- 코드 에디터나 IDE를 익히세요. Rust 코드를 수동으로 작성하면 오류가 발생하기 쉽습니다. 도구에서 코드 완성, 린트 사용, 서식 지정 등을 이용할 수 있습니다.
- Rust 커뮤니티에 참여하세요. 새로운 언어를 배울 때는 고립감을 느낄 수 있습니다. 오픈 소스 프로젝트에 기여하거나, Rust 채팅방에 가입하거나, 포럼에 참여하는 등 Rust 커뮤니티에 참여하세요. Rust 커뮤니티는 신규 사용자를 적극 환영하고 잘 도와주는 것으로 알려져 있습니다.
- 실수를 통해 배우세요. Rust의 컴파일러는 엄격해서 마치 계속 컴파일러와 씨름하는 느낌을 받을 수 있습니다. 컴파일러 오류를 배움의 기회로 삼으세요. Rust의 오류 메시지는 매우 설명적인 경우가 많아 이를 통해 올바른 해결책을 찾아낼 수 있습니다. 시간이 지나면서 이러한 오류 덕분에 더 훌륭하고 안전한 코드를 작성하게 된다는 것을 알게 될 겁니다.
- 인내심을 가지세요. Rust를 사용하면서 낙담하기 쉽습니다. Rust는 안전하고 효율적으로 설계되었기 때문에 복잡한 개념을 익혀야 한다는 점을 기억하세요. 필요할 때는 휴식을 취하고, 주제를 완전히 이해했다고 확신할 때까지 두려워하지 말고 여러 번 반복하세요.
- Rust 러닝 그룹에 참여하세요. 많은 개발자들이 Rust를 배우고 있으므로 그룹에 가입하면 지원과 동기부여를 받을 수 있습니다. 지역 모임 또는 온라인 스터디 그룹을 찾거나, 친구와 파트너를 맺어 함께 배우는 방법도 있습니다.
Rust를 마스터하는 데는 시간이 걸리지만, 그만한 가치가 있습니다. 메모리 안전 보장 및 뛰어난 성능과 같은 Rust의 특징은 이를 시스템 프로그래밍, 웹 개발 등에 적합한 강력한 언어로 만들어줍니다. 포기하지 마세요. Rust가 재미있고 보람 있는 언어라는 사실을 알게 될 겁니다.
Rust로 실제 애플리케이션 구축하기
이제 Rust가 실제 애플리케이션을 구축하는 데 적합한지 간략하게 살펴보겠습니다. 몇 가지 관련 기술 영역에 중점을 둘 텐데, 이러한 영역에서의 사례 연구를 통해 Rust의 강점을 극명하게 드러내고 실용적 적용 가능성을 알아볼 수 있을 겁니다.
웹 개발에서의 Rust
Rust 에코시스템은 백엔드 웹 개발에 완벽합니다. 많은 프레임워크와 라이브러리가 HTTP 요청 라우팅, JSON 및 양식 처리, 템플릿, 데이터베이스 액세스, 인증 및 권한 부여, 로깅 및 추적 등의 일반적인 웹 개발 작업을 프로덕션에 적합한 성능으로 수행합니다. AreWeWebYet? 웹사이트에서 자세한 내용과 유용한 링크를 확인해 보세요. 귀띔해 드리면 저 질문의 답은 ‘예’입니다.
대부분의 Rust용 웹 프레임워크는 시작하기 쉽고 문서도 훌륭합니다. 이는 프레임워크 간의 경쟁 덕분이기도 합니다. 예를 들어, Actix Web 커뮤니티는 훌륭한 최신 예시 컬렉션을 제공합니다. 제 동료인 Khalid Abuhakmeh가 초보자를 위한 튜토리얼을 작성했는데, 여기에는 Rust를 위한 또 다른 웹 프레임워크인 Rocket을 백엔드로 사용하여 간단한 HTML 웹 애플리케이션을 만드는 방법이 설명되어 있습니다. 앞서 언급했던 Luca Palmieri는 웹 백엔드 개발자가 되는 데 도움이 되는 Zero To Production in Rust라는 책을 썼으며, 떠오르는 웹 프레임워크인 Pavex에 관한 책도 쓰고 있습니다. 후자의 프로젝트에서 가장 흥미로운 점은 Luca가 일련의 진행 상황 보고서를 통해 설계 선택에 관해 상세하게 작성하고 있다는 것입니다. 어떤 특정한 방식으로 설계가 이루어지는 이유를 살펴볼 수 있다는 것은 언제나 흥미로운 일입니다. 이 웹 프레임워크 비교에서 Rust 웹 프레임워크가 얼마나 활발하게 개발되고 있는지 알아보세요.
Rust는 웹 프런트엔드에서도 활발히 사용되고 있지만, 아직 프로덕션에 100% 적합하지는 않습니다. 하지만 Rust에서 WebAssembly와 egui 또는 Dioxus와 같은 프레임워크의 활용에 전반적으로 큰 진전이 이루어지고 있는 모습은 인상적입니다.
Rust를 다른 프로그래밍 언어와 통합
Rust가 다른 프로그래밍 언어, 특히 Python과 JavaScript용 도구와 라이브러리를 개발하는 이들이 선택하는 언어가 될 것이라고 Rust 설계자들이 예상했을지 궁금합니다. Rust는 더 나은 성능을 제공할 수 있으며, 다른 언어의 에코시스템 개발자가 배우고 적용하기에 충분히 매력적입니다.
PyO3 프로젝트는 개발자들이 Rust로 네이티브 Python 모듈을 구현하고 Rust 바이너리에서 Python에 액세스할 수 있게 해줍니다. PyO3를 활용하면 Python 개발자를 위한 Python 라이브러리를 Rust로 대단히 효율적으로 구현할 수 있습니다. 이와 유사하게 WebAssembly와 wasm-bindgen을 통해 Rust와 JavaScript를 연결할 수 있습니다.
Astral과 그 설립자 Charlie Marsh는 빛의 속도로 작동하는 Python 도구를 개발하는 것이 가능하다는 사실을 증명했습니다(물론 이것이 마케팅을 노린 것임을 누구나 알고 있지만 결과는 정말 대단했습니다).
Rust로 개발된 JavaScript 런타임인 Deno는 매우 뛰어난 성능을 제공합니다. 이것이 JavaScript 에코시스템의 유일한 예는 아닙니다. Rust로 구현된 엄선된 JavaScript 툴링 컬렉션도 있습니다.
Rust와 다른 프로그래밍 언어 간의 상호 운용성을 구현하는 것도 가능합니다.
Rust를 사용한 시스템 및 임베디드 프로그래밍
Rust는 의심할 여지 없이 시스템 프로그래밍에서 빛을 발합니다. Google과 Microsoft의 발표자들은 Rust를 내부 회사 코드베이스에 도입한 결과, 보안 취약성이 줄어들고, 성능이 향상되며, 소프트웨어 개발 팀의 생산성이 유지되거나 때로는 향상되었다고 증언합니다. Amazon은 AWS에서 Rust 개발을 지원할 뿐만 아니라, 자체 인프라를 구현하는 데 직접 사용합니다. 콘텐츠 전송 네트워크와 기타 네트워킹 인프라를 구축하는 회사인 Cloudflare는 수많은 개별 프로젝트에서 Rust를 활용하고 있으며, 자체 프레임워크를 Rust 에코시스템에 기여하고 있습니다. rust-analyzer 개발을 지원하는 회사인 Ferrous Systems도 매우 중요한 애플리케이션을 위한 인증된 Rust 툴체인인 Ferrocene을 개발합니다. 다른 개발과 함께 이 개발로 Rust를 자동차 및 항공우주 산업에서 사용할 수 있게 되었습니다. 예를 들어, Volvo와 Renault가 차량용 소프트웨어에 Rust를 사용한다는 보고가 있습니다.
결론 및 다음 단계
지금이 Rust 여정을 시작하기에 아주 좋은 시기입니다. Rust는 학습 자료가 풍부하고 초보자 친화적인 커뮤니티를 갖춘 훌륭한 산업용 언어입니다. 고유한 핵심 개념으로 인해 배우기가 다소 어렵기는 하지만, 이를 극복할 방법도 있습니다. 일단 고지에 올라서면 일자리 시장과 다양한 응용 분야에서 활로가 열립니다.
여기서 소개한 학습 경로와 리소스가 여러분의 여정에 도움이 되기를 바랍니다. 미리부터 학습 목표를 세우는 것이 좋습니다. 기여하고 싶은 오픈 소스 프로젝트를 찾거나 일찍부터 프로젝트에 대한 아이디어를 개발해 보세요. 생각보다 빨리 목표에 도달한 자신의 모습에 놀라게 될 겁니다.
용기를 잃지 말고 Rust를 배우는 길을 꾸준히 걸어가세요!
게시물 원문 작성자