831 posts
Rust Future란 무엇인가: async fn이 바로 실행되지 않는 이유

Rust Future란 무엇인가: async fn이 바로 실행되지 않는 이유

Rust에서 비동기 코드를 처음 보면 async와 await는 꽤 익숙해 보입니다. JavaScript나 Python을 써보셨다면 더 그렇죠. 그런데 막상 Rust에서 async fn을 호출해보면 살짝 당황스러운 지점이 나옵니다. 함수를 호출했는데 실행이 바로 시작되지 않습니다. 반환값도 우리가 기대한 값이 아니라 Future입니다. 그리고 .await를 붙이지 않으면 아무 일도 일어나지 않는 것처럼 보이죠. 🤔 Tokio 입문 글에서도 이 차이를 잠깐 다뤘는데요. 이번 글에서는 Tokio 같은 런타임을 쓰기 전에, Rust의 F

Rust 기초: From과 Into 트레이트

Rust 기초: From과 Into 트레이트

자료형 간의 명시적이고 안전한 데이터 변환은 Rust의 중요한 철학 중 하나입니다. Rust는 From과 Into라는 표준 트레이트을 제공하여 데이터 변환을 안전하고 명확하게 할 수 있도록 돕는데요. 이 글에서는 이 두 트레이트의 관계와 차이점, 그리고 활용법을 살펴보겠습니다. From 트레이트란? From 트레이트은 다른 자료형부터(from) 현재 자료형으로 변환하는 방법을 정의할 때 사용합니다. From 트레이트의 from() 메서드는 다른 제네릭(generic) 타입을 인자로 받고 자신의 타입을 반환합니다. 예를 들어, Rus

Rust 기초: Copy와 Clone 트레이트 이해하기

Rust 기초: Copy와 Clone 트레이트 이해하기

Rust에서 변수를 다른 변수에 할당하면 값이 복사될 때도 있고 소유권이 이동할 때도 있습니다. 정수는 let y = x; 해도 x를 계속 쓸 수 있는데, String은 같은 걸 하면 원래 변수를 못 쓰게 되죠. 이 차이를 결정하는 게 바로 Copy와 Clone 트레이트입니다. 둘 다 "값을 복사한다"는 점은 같지만, 동작 방식과 쓰임새가 꽤 다릅니다. 이 글에서는 Copy와 Clone이 각각 무엇이고, 어떤 관계이며, 실제로 어떻게 쓰는지 알아보겠습니다. 소유권과 빌림에서 다룬 이동(move)과 복사(copy) 개념을 알고 있으면

Rust 기초: 수명(Lifetime)으로 참조의 유효 범위 관리하기

Rust 기초: 수명(Lifetime)으로 참조의 유효 범위 관리하기

Rust로 코드를 짜다 보면 어김없이 만나게 되는 오류가 있습니다. 분명히 변수를 선언하고 참조했을 뿐인데 "충분히 오래 살지 못한다"는 야박한 평가를 받는데요. 이 오류는 Rust의 또 다른 핵심 개념인 수명(lifetime)과 관련이 있습니다. 수명은 모든 참조가 가지는 속성이고, 컴파일러의 빌림 검사기(borrow checker)가 메모리 안전성을 보장하는 데 쓰는 도구이기도 합니다. 이 글에서는 수명이 무엇인지, 컴파일러가 어떻게 검증하는지, 우리가 직접 표기해야 하는 순간은 언제인지 알아보겠습니다. 기본적인 소유권과 빌림

Better Auth로 TypeScript 인증 시스템 구축하기

Better Auth로 TypeScript 인증 시스템 구축하기

웹 애플리케이션을 만들 때 인증은 거의 빠지지 않는 기능인데요. 직접 구현하자니 보안 허점이 걱정되고 기존 라이브러리를 쓰자니 특정 프레임워크에 묶이거나 설정이 복잡한 경우가 많습니다. Better Auth는 이런 고민에서 출발한 TypeScript 네이티브 인증 라이브러리입니다. 프레임워크를 가리지 않고 플러그인으로 기능을 확장하고 데이터베이스 스키마까지 직접 관리해 주는 게 특징인데요. 이 글에서는 Better Auth의 설정부터 이메일/비밀번호 인증, 소셜 로그인, 플러그인 활용까지 단계별로 살펴보겠습니다. Better Aut

Rust 기초: 트레이트(Trait) 사용법

Rust 기초: 트레이트(Trait) 사용법

구조체와 열거형으로 데이터의 형태를 정의하는 방법을 배웠는데요. 그런데 서로 다른 타입이 같은 동작을 공유해야 하는 상황이 자주 생깁니다. 원과 직사각형은 완전히 다른 구조의 데이터이지만 둘 다 "넓이를 구한다"는 동작은 가지고 있잖아요. Rust에서는 이런 공통 동작을 트레이트(Trait)로 정의합니다. 이 글에서는 트레이트가 무엇이고 어떻게 정의하고 구현하는지 예제와 함께 살펴보겠습니다. 트레이트란? 트레이트(Trait)는 여러 타입이 공통으로 가져야 하는 동작(behavior)을 정의하는 방법입니다. Java나 TypeScri

Rust의 Option: null 없는 세상에서 값의 부재를 다루는 법

Rust의 Option: null 없는 세상에서 값의 부재를 다루는 법

자바스크립트나 자바를 쓰다 보면 null이나 undefined 때문에 한 번쯤 데어 본 경험이 있으실 겁니다. 멀쩡하게 돌던 코드가 운영 환경에서 갑자기 Cannot read property of null을 뱉으며 죽는 그 순간 말이죠. 💥 Rust는 아예 null이라는 개념을 빼버렸습니다. 대신 "값이 있을 수도, 없을 수도 있다"를 타입으로 표현하는데, 그게 바로 Option<T>입니다. 이 글에서는 Option을 어떻게 만들고, 안에 든 값을 어떻게 안전하게 꺼내며, 실무에서 자주 만나는 패턴을 어떻게 풀어내는지 차근차근 살

Rust 기초: 소유권(Ownership)과 빌림(Borrowing)

Rust 기초: 소유권(Ownership)과 빌림(Borrowing)

Rust를 처음 배우다 보면 컴파일러가 자꾸 "value used here after move"나 "borrow of moved value" 같은 오류를 뱉어서 당황하게 되죠. 분명 올바른 코드를 작성한 것 같은데 컴파일이 안 되니 답답하기도 하고요. 이런 오류들은 모두 Rust의 핵심 개념인 소유권(Ownership)과 관련이 있습니다. 대부분의 프로그래밍 언어는 가비지 컬렉터(GC)를 통해 메모리를 관리하거나, C/C++처럼 프로그래머가 직접 메모리를 할당하고 해제합니다. Rust는 이 두 가지 방식 대신 소유권이라는 독특한 시

Rust 기초: match로 시작하는 패턴 매칭

Rust 기초: match로 시작하는 패턴 매칭

Rust를 쓰는 이유 패턴 매칭 시스템이라는 말이 있을 정도로 Rust는 강력한 패턴 매칭 시스템을 자랑하는데요. 이러한 패턴 매칭은 바로 안전성과 가독성을 동시에 만족시키는 표현식 match에서 시작됩니다. 이 글에서는 match 표현식의 기본 사용법부터 자주 사용되는 패턴 매칭 기법, 그리고 실무에서 볼 수 있는 활용 예시까지 살펴보겠습니다. 기본 문법 match는 어떤 값에 대해 가능한 여러 가지 경우를 "패턴"으로 나눠 처리할 수 있게 해줍니다. 다른 프로그래밍 언어에서는 보통 switch 문으로 비슷한 기능을 제공하지만,

Rust 기초: 열거형(Enum) 사용법

Rust 기초: 열거형(Enum) 사용법

Rust에서 구조체가 데이터 구조를 표현하는 방법라면, 열거형은 선택지를 추상화하는데 특화된 자료형입니다. 이 글에서는 Rust에서 열거형이 무엇이고 어떻게 사용하는지 예제와 함께 살펴보겠습니다. 열거형이란? 열거형(Enum)은 여러 가지 가능한 값(variant) 중 하나만 가질 수 있는 사용자 정의(custom) 자료형(type)입니다. enum 키워드로 열거형의 이름을 붙이고, 중괄호 안에 모든 배리언트 이름을 나열하면 됩니다. 예를 들어, 웹에서 발생할 수 있는 4가지 이벤트로 이루어진 열거형으로 다음과 같이 정의할 수 있습

Rust 기초: 구조체 (Structure) 사용법

Rust 기초: 구조체 (Structure) 사용법

Rust에 내장된 원시 자료형만으로는 실제 비지니스에서 필요한 복잡한 구조의 데이터를 표현하는데는 한계가 있습니다. 그래서 구조체(Structure)를 통해서 여러 개의 관련된 데이터를 한 곳에 묶어서 추상화하게 되죠. 이 글에서는 Rust에서 구조체가 무엇이고 어떻게 사용하는지 예제와 함께 살펴보겠습니다. 구조체란? 구조체(Structure)는 여러 필드를 가진 사용자 정의(custom) 자료형(type)입니다. struct 키워드로 구조체의 이름을 붙이고, 중괄호 안에 각 필드의 이름과 자료형을 나열하면 됩니다. 예를 들어, 번

Rust 기초: assert와 assert_eq 매크로로 검증하기

Rust 기초: assert와 assert_eq 매크로로 검증하기

Rust로 코드를 작성하다 보면 "이 값이 정말 내가 기대한 것과 같을까?"를 확인해야 하는 순간이 많습니다. 단위 테스트를 작성할 때는 물론이고, 개발 중에 특정 조건이 반드시 성립하는지 검증하고 싶을 때도 그렇죠. 이럴 때 Rust가 제공하는 assert!, assert_eq!, assert_ne! 매크로가 딱입니다. 이번 글에서는 이 매크로들을 어떻게 쓰는지, 그리고 테스트에서 어떻게 활용하면 좋은지 알아보겠습니다. assert! 매크로 assert!는 가장 기본적인 검증 매크로입니다. 주어진 조건이 true인지 확인하고, 만

Mise: 통합 런타임 버전 관리 (끝판왕)

Mise: 통합 런타임 버전 관리 (끝판왕)

여러 프로그래밍 언어를 자유자재로 넘나드는 풀스택 개발자들에게는 다양한 런타임의 버전을 관리하는 게 쉽지 않죠? 대개는 Node.js는 nvm, Python은 pyenv, Java는 SDKMAN과 같은 런타임 매니저를 사용해서 버전을 관리하실 거예요. 하지만 이 역시도 프로그래밍 언어마다 관리 도구와 설정 파일이 달라서 정신이 혼미해질 때가 있죠. 😵‍💫 Mise는 이러한 런타임 버전 관리에 대한 고민에 해결해주는 끝판왕 도구인데요. Mise만 있으면 하나의 표준화된 방식으로 여러 프로그래밍 언어의 런타임 버전을 빠르고 간편하게

Rust 기초: String과 &str, 문자열이 두 개인 이유

Rust 기초: String과 &str, 문자열이 두 개인 이유

Rust를 처음 배울 때 많은 분이 당황하는 지점이 있습니다. 문자열 타입이 두 개라는 겁니다. String도 있고 &str도 있는데, 대체 뭐가 다른 걸까요? 다른 언어에서는 문자열 하나면 충분했는데 Rust는 왜 이렇게 만들었을까요? 답은 Rust의 소유권 시스템에 있습니다. 누가 문자열 데이터를 소유하고 있느냐, 아니면 잠깐 빌려서 보고 있느냐를 타입으로 구분하는 거죠. 이 글에서는 String과 &str의 내부 구조부터 시작해서 언제 어떤 걸 쓰는지까지 정리해보겠습니다. String의 내부 구조 String은 힙에 할당된 문

Rust 기초: 원시 자료형(Primitives) 정리

Rust 기초: 원시 자료형(Primitives) 정리

어떤 프로그래밍 언어를 학습하든 Primitives, 즉 원시 자료형에 대한 이해은 매우 중요합니다. 나중에 배우게 될 struct과 enum과 같은 커스텀(Custom) 자료형의 근간이 되는 중요한 개념이기 때문입니다. 이번 글에서는 Rust의 주요 원시 자료형들을 살펴보고, 각 타입이 어떤 특성을 가지는지, 그리고 실제로 어떻게 사용하는지 예제를 통해 알아보겠습니다. 원시 자료형이란? Rust의 원시 자료형은 언어에 내장되어 있는 가장 기본적인 데이터 유형(type)입니다. 변수나 함수 선언 시 명시적으로 자료형을 지정할 수도

Colima로 Docker Desktop 없이 컨테이너 개발하기

Colima로 Docker Desktop 없이 컨테이너 개발하기

macOS에서 Docker 컨테이너를 돌리려면 보통 Docker Desktop을 설치하는데요. 그런데 Docker Desktop이 2022년부터 대규모 조직에 유료 구독을 요구하면서 무료 대안을 찾는 개발자가 부쩍 늘었습니다. 그중에서도 Colima는 설치 한 줄이면 바로 쓸 수 있어서 가장 인기 있는 선택지로 자리 잡았는데요. 이번 글에서는 Colima가 뭔지, 어떻게 쓰는지 처음부터 차근차근 살펴보겠습니다. Colima란? Colima는 Containers in Lima의 줄임말입니다. Lima가 Linux on Mac이니까,

Rust 기초: 출력 매크로와 Display, Debug 트레이트

Rust 기초: 출력 매크로와 Display, Debug 트레이트

Rust를 배우다 보면 화면에 무언가를 출력하기 위해 println! 같은 매크로를 많이 사용하게 됩니다. 그런데 이 매크로들 뒤에는 Display와 Debug라는 트레이트가 숨어 있고, 이 둘의 차이를 이해하면 Rust의 출력 메커니즘을 더 깊이 있게 다룰 수 있습니다. 출력 매크로 Rust에는 표준 출력 및 에러 출력을 위한 다양한 매크로(macro)가 있습니다. 아래는 가장 많이 사용하는 출력 관련 매크로들입니다. println!: 표준 출력(stdout)에 줄바꿈과 함께 문자열을 출력합니다 print!: 줄바꿈 없이 출력합니

🧊 급격하게 얼어붙고 있는 해외 취업 시장 🥶

🧊 급격하게 얼어붙고 있는 해외 취업 시장 🥶

최근 한국에 아는 개발자 분께서 미국에서 근무할 수 있는 포지션의 최종 면접을 앞두고 있었는데 갑자기 채용이 무기한 연기되었다는 황당한 소식을 듣게 되셨습니다. 다른 개발자 분께서는 심지어 최종 합격을 하고 리로케이션 패키지까지 받았는데, 느닷없이 오퍼가 취소되어 멘붕에 빠지셨다고 하네요... 🫠 주변에서 일어나는 이런 안타까운 일들을 보며 해외 취업 시장이 진짜 예전같지 않다는 것을 체감하게 됩니다. 미중 관세 전쟁으로 오랫동안 지속되었던 자유 무역과 세계화의 시대가 점점 저물고 있는 것이 아닌가 싶어요. 미국을 비롯한 여러 나

🙉 달레의 찐팬이 되어주실래요? 💕

🙉 달레의 찐팬이 되어주실래요? 💕

여러분 안녕하세요! 오늘은 정말 설레는 소식을 하나 전해드리려 해요. 크레에이터와 팬을 이어주는 플랫폼 에손토리(essentory)와 파트너십을 맺고, 저만의 특별한 멤버십 콘텐츠를 새롭게 선보이게 되었습니다. 해외에서는 Patreon 같은 플랫폼을 통해 수많은 크리에이터들이 자신만의 멤버십 커뮤니티를 만들고, 진짜 팬들과의 관계에 집중하며 지속 가능한 창작 활동을 이어가고 있죠. 에센토리는 이런 흐름을 한국에서 이끌고 있는 플랫폼이며, 저도 감사하게 초기 창작자로 함께하게 되었습니다. 제가 18년 동안 개발자로 지내며 깨달은 가장

달레UI 디자인 시스템: 테크 스택 선정 과정 A to Z

달레UI 디자인 시스템: 테크 스택 선정 과정 A to Z

달레 스터디에서 진행 중인 오픈소스 디자인 시스템 프로젝트 "달레UI"는 오픈 소스 디자인 시스템을 만들어가며 겪는 고민과 시행착오, 그리고 그 과정에서의 배움을 정기적으로 블로그를 통해 나누려고 합니다. 그 첫 번째 이야기로, 디자인 시스템 팀의 초대 개발자이신 Sehwan Lee 님께서 달레UI의 핵심 기술 스택을 선정하게 된 배경과 이유를 깊이 있게 풀어주셨습니다. 단순한 기술 비교를 넘어, 왜 이 기술이어야 했는지에 대한 철학적 고민까지 담겨 있어 디자인 시스템 구축에 관심 있는 분들께 꼭 추천드리고 싶습니다. 📝 블로그

Discord