<Rust 서버, 서비스, 앱 만들기> 책 소개

그간 시스템 프로그래밍 언어로 알려져왔던 Rust로 프론트엔드, 백엔드 그리고 인프라까지 모두 직접 구축하며, 웹 어플리케이션 개발부터 배포까지 해볼 수 있다. Rust뿐만 아니라 웹 개발 전체 프로세스를 익히기에도 최적 👍
아직까지 국내엔 Rust 관련 책이 별로 없어서 인터넷에서 자료를 찾아 공부할 수밖에 없었다
RustBook이라든가, RustLearning같은 국룰 자료들로 말이다
잘 만들어져 있긴 한데, 난 진짜 책을 선호하는 아날로그 인간이라 아무래도 많이 아쉬웠다

하지만 올해 초부터 제이펍에서 러스트 관련 책들이 하나둘 나오기 시작하면서
드디어 국내에도 러스트 맛집이 생긴 것 같다~
몇 달 전에 <제로부터 시작하는 러스트 백엔드 프로그래밍>을 사읽었는데,
어디서 본 것 같은 제목이긴 하지만 그건 무시하고

러스트 책도 드문 나라에서 러스트로 백엔드 개발?
이건 못 참자너
나한텐 너무 작고 소중해서 잘 때도 안고 잤는데 두꺼워서 베개로도 활용 삽가능
이번에 나온 <러스트 서버, 서비스, 앱 만들기>는 백엔드 뿐만이 아니고
프론트, 인프라에 걸쳐 웹 개발 전체 프로세스를 다루고 있어서 더 흥미로운데
아무튼
제이펍, 내 최애 출판사로 등극
본격적인 책 리뷰 🧐
- 책의 구성

이 책의 구성은 크게 3가지로 나눌 수 있는데
① 웹 어플리케이션 개념 소개와 REST API, DB, 에러 핸들링를 다루는 백엔드 개발 1부
② SSR 방식의 프론트엔드 개발 2부
③ 비동기, P2P노드 구현과 같은 고급 주제들과 도커로 서비스를 배포하는 3부다.
앞에서 말했지만 이 책이 특히 마음에 들었던 이유가 바로 이거다
보통 백엔드면 백엔드, 프론트면 프론트 이렇게 따로 나눠 개발하는 경우가 대부분이라
자기 파트 외엔 어떻게 돌아가는지 잘 모르는 경우가 많은데
(아니 그냥 이해를 포기하는 경우가 더 많은 듯)

하지만, 이 책에서는 백엔드와 프론트엔드, 배포같은 인프라 모두 Rust로 직접 구축하기 때문에
웹 개발 전체 프로세스를 훑으면서 전부 한번씩 경험해볼 수 있다는~
- 웹 개발 언어로 Rust를 채택한 이유



1장에선 웹 개발 언어로 왜 러스트를 채택했는지 설명하고 있다
나야 러스트가 얼마나 좋은지 이미 알고 있지만, 허허
모르는 사람들한테 기존에 잘 쓰던 웹 개발 언어(java, javaScript, python 등)를 냅두고
굳이굳이 공부하기도 어려운 Rust를 쓰는 이유가 뭔지 확실히 납득시켜야 할 것 아닌가?
이거 시스템 프로그래밍 할 때 쓰는 언어 아니야? 어엉~?
Rust를 써서 웹 애플리케이션 개발에 뭐가 이득인가 나열해보면,
- 안전한 프로그램을 만들 수 있다.
- 정적 타입 언어로서, 컴파일 타임에 타입 검사를 수행하기에 type safety
- ownership model로 가비지 컬렉터를 사용하지 않기에 memory safety
--> 그래서 널포인터, 세그멘테이션, 댕글링 포인터, 버퍼 오버플로가 발생하지 않는다.
- 데이터 타입을 스레드 safe/unsafe로 구분하기에 thread safety - 자원 효율적이다.
- 고수준 웹 개발 언어와 다르게, 메모리 사용을 제한하는 세밀한 제어를 허용한다.
--> 소유권 모델이 있고, 런타임이 없기에 적은 서버 비용 및 낮은 운영 비용으로 이어진다 - 지연 시간이 짧다.
- 가비지 컬렉터와 런타임을 갖지 않고, 논블로킹 I/O 지원, 고성능 비동기 I/O라이브러리 및 런타임, zero-cost 추상화
- 기본적으로 변수가 스택에 존재하기 때문에 빠르게 관리할 수 있다. - 동시성을 통해 멀티 코어 프로세서의 성능을 극대화할 수 있다.
- 전통적 멀티스레딩과 비동기 I/O 두 가지 유형의 동시성을 제공하는데,
- 멀티스레딩: 데이터 경합 안전성을 제공하므로 스레드 블로킹을 방지해 성능을 향상한다.
- 비동기 I/O: zero-cost futures와 async-await를 구현하고, 논블로킹 I/O로 데이터 처리를 대기하는 동안 중단되지 않게 한다. - 개발 생산적이다.
- anonymous function을 포함하는 closure
- iterator
- trait를 통한 다형성, Trait 객체를 통한 dynamic dispatch
- Option 및 Result와 같은 enum 자료형
호오..
전부 맞는 말이라서
논리적으로 반박할 수가 없다

이건 뭐
Rust 안 쓰는 게 더 이상하잖아?
러스트 개발자 많이많이 뽑아달라고~~
- 무엇을 만들어 볼 건가

강사들이 강의 카탈로그를 게시할 수 있는 EzyTutors라는 이름의 온라인 교육 플랫폼을 만들어 볼 예정이다
EzyTutors - 강사들을 위한 디지털 스토어프런트 (16p 발췌)
독특한 기술이나 지식을 가진 강사이십니까? 그 기술과 지식을 돈으로 바꾸고 싶습니까?
여러분의 웹 사이트를 설정하고 관리하는 데 필요한 시간과 자원이 있으십니까?
이지 튜터는 바로 여러분을 위한 솔루션입니다. 몇 분만에 온라인 교육 비즈니스를 시작해보세요!
- 애플리케이션 구조

애플리케이션 논리적 설계고, 이걸 전부 순수 러스트로만 만들어 볼거다
React, Vue, Angular같은 인기있는 웹 프레임워크도 있긴하지만

Actix를 사용해서 SSR 방식으로 프론트마저 러스트로 직접 만들어버린다는 거지
이번엔 오직 러스트에만 집중하는 걸로
이번에 만들어볼 EzyTutors같은 온라인 교육 플랫폼은 서비스 특성상
유저 인증, 강사나 학생 정보, 강의 자료 등의 데이터 조회가 많고,
강의 자료 업로드와 다운로드가 빈번해서 파일 입출력 작업도 많다.
이 말은 뭐냐?
I/O 작업이 많다는 뜻인데,
다른 I/O 작업이 완료될 때까지 안 기다리고, 다른 작업을 할 수 있는 비동기 방식이 필요하다는 말이다
그게 CPU를 놀게 냅두지 않고 혹사시켜서, 효율이 좋으니까

웹 프레임워크로는 Actix-Web를 골랐는데
Rust 웹 프레임워크엔 Rocket도 있지만, async(비동기)를 지원하는 Actix로 선택됐다.
성능이야 뭐 당연히 뛰어나다
Rocket과 Actix 퍼포먼스 비교 및 activity 비교 참고
Rust — Actix vs Rocket: Hello World performance
Find out who’s faster for a simple hello world case: Rust — Actix or Rocket?
medium.com

EzyTutors같은 온라인 교육 플랫폼에는 데이터(강사, 수강생, 강의 등) 간 관계 표현이 쉽고,
또한 데이터 무결성, 일관성이 보장되는 관계형 데이터베이스(RDBMS)가 적합하다.
그래서 데이터베이스 커넥션으로 SQLx를, 데이터베이스는 Postgres를 선택했다.
SQLx는 Rust 친화적이기도 하고, 컴파일 시점에 SQL 쿼리를 검사해서 런타임 에러를 줄여준다
그리고 비동기 쿼리를 지원해 효율적으로 DB 쿼리 대기 시간을 관리할 수 있어서 선택됐다.
Mysql과 비교해 Postgres는 복잡한 쿼리와 데이터 구조를 효율적으로 처리할 수 있고,
ACID 준수로 데이터 무결성을 보장해서 비동기 환경에서 작업에 유리하기 때문에 얘로 pick.
(근데 Mysql 써도 되긴 함. Mysql써도 프로젝트 따라갈 수 있음)
결론적으로 Actix-Web과 SQLx 모두 async, await로 비동기 I/O 작업을 지원하니까 골랐다~ 이거임
그래서 이 세팅들은 I/O 중심 웹 애플리케이션 작업에 안성맞춤이라 보면 된다
- TCP/HTTP 웹 서버 작성

이 책의 또 흥미로운 부분이다
TCP/HTTP 통신을 직접 구현해보면서 어떻게 통신이 이루어지는지 자세히 알 수 있는데,
전공과목에서 이론으로만 듣던 걸 직접 하나하나 수제로 만들어보면서 추억을 되새길 수 있다
// tcp server
use std::io::{Read, Write};
use std::net::TcpListener;
fn main() {
let connection_listener = TcpListener::bind("127.0.0.1:3000").unwrap();
println!("Running on port 3000");
for stream in connection_listener.incoming() {
let mut stream = stream.unwrap();
println!("Connection established");
let mut buffer = [0; 1024];
let n = stream.read(&mut buffer[..]).unwrap();
stream.write(&buffer[..n]).unwrap();
}
}
// tcp client
use std::io::{Read, Write};
use std::net::TcpStream;
use std::str;
fn main() {
let mut stream = TcpStream::connect("localhost:3000").unwrap();
stream.write("Hello".as_bytes()).unwrap();
let mut buffer = [0; 5];
let n = stream.read(&mut buffer).unwrap();
println!(
"Got response from server:{:?}",
str::from_utf8(&buffer[..n]).unwrap()
);
}
이건 소켓 프로그래밍 영역이라고 할 수 있는데,
요즘은 스프링같은 프레임워크 안에 서블릿이 있어서 얘네가 전부 해주니까
소켓 프로그래밍 쪽은 자세히 모르고 코드만 타닥 치는 경우가 많다.
하지만 이렇게 직접 통신 과정을 구현해본다면?
CS 공부가 따로 있는게 아니고, 이게 CS 공부지
확실히 프로젝트 하나 제대로 깊게 파보면 많이 배우는 듯
- RESTful 웹 서비스 구축하기

이제 본격적으로 Actix에서 실제 웹 서비스를 구현하기 시작하는데
서비스 기능에 맞게 REST API를 설계하고...더보기
이후의 과정이 궁금하다면?
<러스트 서버, 서비스, 앱 만들기> 책을 하나 사서 직접 서비스를 만들어보자
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=338781485
러스트 서버, 서비스, 앱 만들기
오직 러스트만으로 웹서버, RESTful 서비스, 서버 렌더링 앱, 클라이언트 프런트엔드를 만든다. 작고 예측 가능한 리소스 풋프린트로 코드를 작성하는 법, 탁월한 안전성과 신뢰성을 갖춘 고성능
www.aladin.co.kr
리뷰 마무리 + 총평
오늘은 이렇게 <러스트 서버, 서비스, 앱 만들기>를 함께 살펴봤는데
내용은 위에서 얘기했던 대로 베이스부터 차근차근 진행하기 때문에 크게 어렵진 않은 것 같다
구조도나 그림도 자세하게 나와있어서 초보자도 따라가기 쉽다
대신 알맞은 독자층은 Rust 기본 문법과 특성을 조금이나마 알아둔 상태에서,
백이든 프론트든 프로젝트 개발 경험이 있으면 훨씬 더 이해하기 쉬운 것 같다
+ 러스트 기본 공부 자료는 아래 링크 참고
The Rust Programming Language - The Rust Programming Language
Steve Klabnik, Carol Nichols 지음. 기여해주신 러스트 커뮤니티 여러분과 한국어 번역에 참여해주신 분들께 감사드립니다. 이 텍스트 버전은 여러분이 (2023년 2월 9일에 출시된) 러스트 1.67.1 혹은 이후
doc.rust-kr.org
+ 개발 경험은 친구랑 같이 프로젝트 하나 진행해보는 걸 추천한다
백엔드/프론트엔드 파트 잘 나눠서, 오래걸리더라도 설계부터 꼼꼼하게 해보는 게 베스트인 듯
특히 마지막 3부에서 도커로 배포도 진행하기 때문에
단계적으로 따라가면서 결국엔 전체 서비스 하나를 통째로 직접 만들어볼 수 있게 된다.
단지 책 하나로 러스트 웹 개발 프로젝트 경험을 쌓을 수 있다니
심지어 나 혼자 풀스택으로?

내 생각에 이 책은 무공비급이다
개발은 무공같은 거라서 한 살이라도 더 어릴 때 쌓아야 할 듯 아님말고
여튼
EzyTutors 프로젝트 개발 과정은 이어서 블로그에 포스팅할 예정이니까
이지튜터 시리즈 앞으로 많관부
제이펍 서평단이란?
만약 여러분도 관심있는 책을 제공받아서 리뷰해보고 싶다면
서평 활동에 참여해보라고 말해주고 싶다.
하지만 어떻게 하는지 모르겠다고?
그럼 지금부터 서평 활동에 참여할 수 있는 방법을 아라보자

물론 킹갓제너럴 제이펍 출판사에서 말이지
일단 한번 해봐 츄라이 츄라이~
다른 출판사도 비슷한 과정으로 진행되니 참고하면 된다
1. 제이펍 리뷰어
첫 번째, 제이펍 리뷰어에 선정되어 활동하는 방법이 있다.
제이펍 출판사 공식 홈페이지에서 매년 기수별로 리뷰어를 모집하는데,
활동기간은 약 1년이고 매번 새로운 책을 제공받아 리뷰할 수 있는 특권이 주어진다
https://jpub.tistory.com/notice/1553
믿고 보는 제이펍 IT 전문서 리뷰어 3기 모집!
안녕하세요? 제이펍은 2009년 4월에 첫 책을 시작으로 현재까지 프로그래밍 관련 전문서부터 그래픽, 오피스, 모바일 관련 실용서까지 480여 종의 서적을 출판한 IT 전문 출판사입니다. 2024년을 함
jpub.tistory.com
근데 올해 3기 모집은 이미 끝났기 때문에, 내년을 노려보자
모집기간은 매 기수마다 다른 듯하니 공식 홈페이지를 잘 모니터링 해보는 게 좋겠다
2. 제이펍 서평단
두 번째로는 제이펍 서평단 활동이 있는데,
만약 제이펍 리뷰어의 1년 단위 기수 활동이 부담스럽다거나
원하는 특정 신규 도서 리뷰만 원한다면 쓸 수 있는 방법이다.

참여 방법은 제이펍 공식 인스타그램에서 서평단에 지원하는 것이다.
이렇게 신권이 나올 때마다 서평단을 모집하는데, 여기에 지원해볼 수 있다.
다만 인원을 많이 뽑지는 않기 때문에 무조건 할 수 있다고는 장담할 수 없지만,
나도 서평단 지원에 당첨돼서 이번 리뷰를 작성할 수 있었던 거라 적극 추천한다
다음에 또 좋은 책으로 서평단 활동을 해볼 수 있기를~😉
"본 리뷰는 제이펍 서평단 활동으로 출판사로부터 책을 제공받아 작성되었습니다."
- 제이펍 공식 인스타그램: @jpub_official
- 제이펍 공식 홈페이지: https://jpub.tistory.com/
제이펍 최고 ❤
'Rust 연구 노트 > "EzyTutors" 프로젝트' 카테고리의 다른 글
[Rust/rust-analyzer] 문제없는 sqlx에 대해 오류로 감지하는 rust-analyzer 버그 (7) | 2024.10.14 |
---|---|
[오류 해결] failed to run custom build command for openssl-sys (5) | 2024.09.06 |
[Rust] Actix를 사용해서 RESTful API 만들기 (5) | 2024.08.25 |