rust

데이터베이스 작업은 모든 애플리케이션의 핵심이지만, 동시에 수많은 버그의 온상이기도 합니다. SQL 쿼리 문자열에 오타가 나서 런타임 에러가 발생하거나, 데이터베이스 연결 관리에 골머리를 앓아본 경험은 개발자라면 누구나 있을 것입니다.하지만 만약, 이런 종류의 버그를 프로그램 실행 전, 컴파일하는 시점에 모두 잡아낼 수 있다면 어떨까요? Rust의 강력한 타입 시스템과 비동기 생태계 위에서 이 꿈 같은 이야기를 현실로 만든 라이브-러리가 있습니다. 바로 SQLx입니다. SQLx, ORM이 아닙니다!가장 먼저 짚고 넘어가야 할 점은, SQLx는 흔히 생각하는 ORM(Object-Relational Mapper)이 아니라는 것입니다. ORM은 데이터베이스 테이블을 코드 속 객체(Object)로 추상화하여 S..
🧪 러스트 자동화 테스트 완전 정복Rust는 안정성과 안전성을 중시하는 언어인 만큼, 테스트 시스템도 강력하고 잘 설계되어 있습니다.이 글에서는 기본적인 테스트 작성 방법부터, mock, 파라미터화, 통합 테스트 구성까지 실무에 유용한 내용을 한 번에 정리해드릴게요!1️⃣ 유닛 테스트 시작하기Rust에서 **단위 테스트(Unit Test)**는 일반적으로 테스트 대상이 되는 함수와 같은 파일의 하단에 작성합니다. 이때 테스트 코드를 실제 코드와 명확하게 구분하고, 빌드 시에는 포함되지 않도록 하기 위해 #[cfg(test)] 속성과 내부 모듈 mod tests를 함께 사용합니다.// src/lib.rs pub fn add(a: i32, b: i32) -> i32 { a + b } #[cfg(test)..
"유연함"과 "안전함"을 동시에 잡는 방법 러스트는 안전하고 빠른 시스템 프로그래밍 언어입니다. 그런데 그만큼 문법이 낯설고 빡세죠. 특히 제네릭(generics), 트레이트(traits), 수명(lifetimes)은 러스트 초보가 한 번쯤은 멘붕 오는 3대장입니다.하지만 이 셋은 사실 서로 밀접하게 연결되어 있고, 조금만 개념을 잡으면 코딩이 훨씬 자유로워져요. 이 글에서는 세 가지를 자연스럽게 이어지는 흐름으로 설명하면서, 언제 어떤 상황에서 써야 할지도 함께 알려드릴게요.1️⃣ 제네릭: 여러 타입에 대응하는 유연한 코드📌 제네릭이란?제네릭은 함수나 구조체, 열거형을 "특정 타입에 고정하지 않고", 여러 타입에 대해 재사용할 수 있게 합니다. 가장 흔한 예는 아래처럼 largest 함수를 만들 때:..
🦀 러스트 에러 처리, 어렵지 않아요 – 실무를 위한 친절한 가이드Rust를 쓰다 보면 꼭 만나게 되는 벽이 하나 있어요. 바로 에러 처리입니다."왜 이렇게까지 철저하게 에러를 다뤄야 하지?" 싶다가도, 이 개념이 잡히고 나면 Rust의 안정성과 신뢰성이 어디서 나오는지 절로 고개가 끄덕여지죠.이 글에서는 Rust의 에러 처리 방식을 하나씩 차근차근 설명드릴게요. 실무에도 바로 쓸 수 있는 예시와 팁도 함께요.🤔 에러에도 두 종류가 있다고?Rust는 에러를 크게 두 가지로 나눠서 처리해요:회복 가능한 에러는 Result로 처리해요. 예를 들어 파일을 열었는데 존재하지 않는다면, 이건 예상 가능한 실패잖아요.반면, 회복 불가능한 에러는 panic!으로 처리돼요. 예를 들어 배열의 100번째 요소를 꺼내..
🧺 Rust 기본 컬렉션 완전 정복 – Vec, String, HashMapRust에서 가장 널리 쓰이는 세 가지 컬렉션,Vec, String, HashMap는기초이자 실전에서도 계속 마주하게 되는 핵심 도구입니다.이번 글에서는 이 컬렉션들이 어떻게 동작하는지,언제 어떤 상황에서 쓰는지, 그리고 실제 코드에서는 어떻게 활용하는지조금 더 깊이 있게 다뤄보겠습니다.1️⃣ Vec – 순서 있는, 빠르고 안전한 배열✅ 어떤 컬렉션인가요?Vec는 동일한 타입의 값을 순서대로 저장하는 가변 배열입니다.크기를 미리 알 수 없거나, 중간에 값을 추가/삭제해야 하는 경우 유용합니다.내부적으로는 힙(heap)에 연속된 메모리 공간을 할당합니다.C++의 std::vector, Java의 ArrayList, Python의 ..
🧳 러스트 프로젝트 구조 쉽게 이해하기 – 패키지, 크레이트, 모듈, 경로러스트로 프로젝트를 하다 보면 자주 듣게 되는 말들이 있어요.패키지(Package), 크레이트(Crate), 모듈(Module), 경로(Path) 같은 것들이죠.이게 뭔가 싶고 헷갈릴 수 있는데, 사실은 그렇게 어렵지 않아요.딱 정리해두면 러스트 코드를 아주 깔끔하고 체계적으로 만들 수 있습니다.📦 패키지(Package)란?패키지는 러스트 프로젝트 하나라고 생각하면 돼요.우리가 흔히 cargo new my_app으로 만드는 게 바로 하나의 패키지예요.my_app/├── Cargo.toml // 패키지 정보└── src/ └── main.rs // 실행 시작점이렇게 만들어진 패키지에는 바이너리 크레이트가 하나 포함돼 있..
🎭 러스트의 열거형(enum): 상태를 표현하는 강력한 도구지금까지 우리는 구조체를 통해 데이터를 묶고, 메서드와 트레이트로 행동을 부여하는 방법을 배웠습니다.이번에는 값의 상태나 종류가 여러 개일 수 있을 때 러스트에서 이를 어떻게 표현하는지를 살펴볼 차례입니다.바로 **열거형(enum)**입니다.📦 열거형이란?열거형(enum)은 하나의 타입이 여러 가지 상태 중 하나를 가질 수 있도록 정의하는 방식입니다.enum Direction { North, East, South, West, }이 예시에서 Direction은 네 가지 중 하나의 값을 가질 수 있어요.각 상태는 **열거자(variant)**라고 부릅니다.🔗 열거형과 구조체의 차이점과 공통점 구조체열거행목적여러 데이터를 함께 표현하나의 상태 중..
🧱 러스트 구조체(struct): 데이터를 구조화하고 행동을 담는 방법앞서 우리는 러스트의 소유권, 참조, 슬라이스 등 개별 값과 메모리의 관계를 집중적으로 다뤘습니다.이제는 여러 데이터를 하나로 묶고, 여기에 의미 있는 행동까지 붙이는 **구조체(struct)**를 배워볼 차례입니다.✨ 구조체란?구조체(struct)는 서로 관련 있는 데이터를 하나의 덩어리로 묶기 위한 사용자 정의 타입입니다.struct User { name: String, age: u32,}구조체는 단순한 데이터 묶음 그 이상입니다. 메서드, 생성자, 트레이트 구현 등을 통해구조체는 데이터 + 행동을 함께 담는 단위로 확장됩니다.🧱 튜플과 구조체의 차이점구분 구조체 (struct) 튜플 (tuple) 구조체튜플필드 접근..
경이로운아일라
'rust' 태그의 글 목록