๐ฆ Rust์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ: Tokio ํ๋ ์์ํฌ ํ์ฉ ๐

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํซํ ์ฃผ์ ๋ก ์ฐพ์์์ด์. ๋ฐ๋ก Rust ์ธ์ด์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ๊ณผ Tokio ํ๋ ์์ํฌ์ ๋ํด ๊น์ด ํํค์ณ๋ณผ ๊ฑฐ์์. ๐ ์ด ์ฃผ์ , ์ด๋ ต๊ฒ ๋ค๋ฆฌ์๋์? ๊ฑฑ์ ๋ง์ธ์! ์ ๊ฐ ์ฝ๊ณ ์ฌ๋ฏธ์๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์. ๋ง์น ์นดํก์ผ๋ก ์๋ค ๋ ๋ ๊ฒ์ฒ๋ผ์! ใ ใ ใ
๊ทธ๋ผ ์ด์ ๋ถํฐ Rust์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ธ๊ณ๋ก ํจ๊ป ๋ ๋๋ณผ๊น์? ๐
์ ๊น! ํน์ ํ๋ก๊ทธ๋๋ฐ์ ๊ด์ฌ ์์ผ์ ๊ฐ์? ๊ทธ๋ ๋ค๋ฉด ์ฌ๋ฅ๋ท(https://www.jaenung.net)์์ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ๊ด๋ จ ์ฌ๋ฅ์ ์ฐพ์๋ณด์ธ์. ์ฌ๋ฌ๋ถ์ ์ค๋ ฅ ํฅ์์ ํฐ ๋์์ด ๋ ๊ฑฐ์์! ๐จโ๐ป๐ฉโ๐ป
1. Rust, ๋ ๋์ฒด ๋ญ๋? ๐ค
์, ๋จผ์ Rust์ ๋ํด ์์๋ณผ๊น์? Rust๋ ์์ฆ ํ๋ก๊ทธ๋๋จธ๋ค ์ฌ์ด์์ ์์ฒญ ํซํ ์ธ์ด์์. ๋ง์น ์์ด๋ ๊ทธ๋ฃน BTS์ฒ๋ผ ์ธ๊ธฐ ํญ๋ฐ์ด์ฃ ! ใ ใ ใ
Rust๋ Mozilla์์ ๊ฐ๋ฐํ ์์คํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก, ์์ ์ฑ, ๋์์ฑ, ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ์ ๋ชจ๋ ์ก์์ด์. ์, ๋๋ฐ์ด์ฃ ? ๐ฎ
- ์์ ์ฑ: ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ๋ฒ๊ทธ๋ฅผ ์ปดํ์ผ ์์ ์ ์ก์๋ด์. ๋ฐํ์ ์๋ฌ? ์๋ ~ ๐
- ๋์์ฑ: ์ค๋ ๋ ๊ฐ ๋ฐ์ดํฐ ๋ ์ด์ค ์์ด ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์์ด์.
- ์ฑ๋ฅ: C/C++์ ๊ฒฌ์ค๋งํ ๋น ๋ฅธ ์๋๋ฅผ ์๋ํด์. ์คํผ๋์ ๋ํ์! ๐๏ธ๐จ
Rust์ ์ด๋ฐ ํน์ง๋ค ๋๋ฌธ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด "์ ๋๋ฐ! ์ด๊ฑฐ ์ง์ง ์ข์๋ฐ?" ํ๋ฉด์ ์ด๊ดํ๊ณ ์์ด์. ํนํ ์์คํ ํ๋ก๊ทธ๋๋ฐ์ด๋ ์น ๊ฐ๋ฐ์์ ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ฃ .
๊ทธ๋ฐ๋ฐ ์ฌ๋ฌ๋ถ, Rust์ ์ง์ง ๋งค๋ ฅ์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์์ด์! ์ด๊ฒ ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ค๋ ํํค์น ์ฃผ์ ์์. ํฅ๋ฏธ์ง์งํ์ง ์๋์? ๐
2. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด ๋ญ์ผ? ๐คฏ
์, ์ด์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ์์๋ณผ ์ฐจ๋ก์์. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํ๋ฉด ๋ญ๊ฐ ์ด๋ ค์ ๋ณด์ด์ฃ ? ํ์ง๋ง ๊ฑฑ์ ๋ง์ธ์. ์ ๊ฐ ์ฝ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์!
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ง์น ์ฌ๋ฌ ๊ฐ์ ์ผ์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ์๋ฅผ ๋ค์ด๋ณผ๊น์?
์ํฉ ์์: ์ฌ๋ฌ๋ถ์ด ๋ผ๋ฉด์ ๋์ด๊ณ ์๋ค๊ณ ์์ํด๋ณด์ธ์. ๐
- ๋ฌผ์ ๋์ด๋ ๋์ (๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ)
- ์ฑ์๋ฅผ ์ฐ๊ณ (๋ค๋ฅธ ์์ )
- ๋ฌผ์ด ๋์ผ๋ฉด ๋ฉด๊ณผ ์คํ๋ฅผ ๋ฃ๊ณ (๋ค์ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ)
- ๊ทธ ์ฌ์ด์ ๊ทธ๋ฆ๊ณผ ์ ๊ฐ๋ฝ์ ์ค๋นํฉ๋๋ค. (๋ ๋ค๋ฅธ ์์ )
์ด๋ ๊ฒ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ ํจ์จ์ ์ผ๋ก ํ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ด์์!
ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ง์ฐฌ๊ฐ์ง์์. ์๋ฅผ ๋ค์ด, ์น ์๋ฒ์์ ํ์ผ์ ์ฝ์ด์ค๋ ๋์ ๋ค๋ฅธ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ฃ . ์ด๋ ๊ฒ ํ๋ฉด ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ด ํจ์ฌ ์ข์์ ธ์. ๐
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์ค์ํ ์ ! ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ฉํฐ์ค๋ ๋ฉ๊ณผ๋ ๋ฌ๋ผ์. ๋ฉํฐ์ค๋ ๋ฉ์ ์ฌ๋ฌ ๊ฐ์ CPU ์ฝ์ด๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๊ฑฐ์ง๋ง, ๋น๋๊ธฐ๋ ๋จ์ผ ์ค๋ ๋์์๋ ํจ์จ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ ์ ์์ด์.
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ฅ์ ์ ์ ๋ฆฌํด๋ณผ๊น์?
- ๋ฆฌ์์ค ํจ์จ์ฑ: CPU์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์.
- ๋ฐ์์ฑ ํฅ์: ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ๋ ๋ถ๋๋ฝ๊ฒ ๋์ํด์.
- ํ์ฅ์ฑ: ๋ ๋ง์ ๋์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ ์ ์์ด์.
์ด์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด ๋ญ์ง ์ข ๊ฐ์ด ์ค์๋์? ๐ ๊ทธ๋ผ ์ด์ Rust์์ ์ด๋ป๊ฒ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋์ง ์์๋ณผ๊น์?
3. Rust์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ: Future์ async/await ๐ฎ
Rust์์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ์ด ๋ฐ๋ก 'Future'์์. Future๋ ๋ฏธ๋์ ์๋ฃ๋ ์์ ์ ๋ํ๋ด๋ ํ์ ์ด์์. ๋ง์น "๋์ค์ ์ด ์์ ์ด ๋๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ค๊ฒ~"๋ผ๊ณ ์ฝ์ํ๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ .
๊ทธ๋ฆฌ๊ณ ์ด Future๋ฅผ ๋ ์ฝ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด Rust๋ 'async/await' ๋ฌธ๋ฒ์ ์ ๊ณตํด์. ์ด๊ฒ ๋ญ์ง ์ฝ๋๋ก ํ๋ฒ ๋ณผ๊น์?
async fn read_file(path: &str) -> Result<string std::io::error> {
tokio::fs::read_to_string(path).await
}
async fn process_file() {
let content = read_file("hello.txt").await.unwrap();
println!("ํ์ผ ๋ด์ฉ: {}", content);
}
#[tokio::main]
async fn main() {
process_file().await;
}
</string>
์ฐ์, ์ด ์ฝ๋ ๋ฉ์ง์ง ์๋์? ใ ใ ใ ํ๋์ฉ ์ค๋ช ํด๋๋ฆด๊ฒ์!
async fn
: ์ด ํจ์๋ ๋น๋๊ธฐ ํจ์๋ผ๋ ๋ป์ด์์. ์คํ์ด ์ผ์ ์ค๋จ๋ ์ ์์ด์..await
: Future๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ผ๋ ์๋ฏธ์์. ๊ทธ๋์ ๋ค๋ฅธ ์์ ์ ํ ์ ์์ด์!#[tokio::main]
: ์ด๊ฑด ๋ญ๊น์? ๋ฐ๋ก Tokio ๋ฐํ์์ ์ฌ์ฉํ๋ค๋ ๋ป์ด์์. ๊ณง ์์ธํ ์ค๋ช ํ ๊ฒ์!
์ด async/await ๋ฌธ๋ฒ ๋๋ถ์ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋ง์น ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์ฝ๊ฒ ์์ฑํ ์ ์์ด์. ๋ฉ์ง์ง ์๋์? ๐
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์๋ฌธ! "๊ทธ๋ผ ์ด ๋น๋๊ธฐ ์์ ๋ค์ ๋๊ฐ ๊ด๋ฆฌํ๊ณ ์คํํ๋ ๊ฑฐ์ผ?" ๋ผ๊ณ ๋ฌผ์ผ์ค ์ ์์ด์. ๋ฐ๋ก ์ฌ๊ธฐ์ Tokio์ ๋ฑ์ฅ์ ๋๋ค! ์ง์~ ๐
4. Tokio: Rust์ ๋น๋๊ธฐ ๋ฐํ์ ์์ ๐ฆธโโ๏ธ
Tokio๋ Rust์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ์์. ๋ง์น ๋น๋๊ธฐ ์ธ๊ณ์ ์ํผํ์ด๋ก ๊ฐ์ฃ ! ใ ใ ใ
Tokio๊ฐ ํ๋ ์ผ์ ๊ฐ๋จํ ์ ๋ฆฌํด๋ณผ๊น์?
- ๋น๋๊ธฐ ์์ ์ค์ผ์ค๋ง: ์ฌ๋ฌ ์์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํด์.
- I/O ์์ ์ฒ๋ฆฌ: ํ์ผ, ๋คํธ์ํฌ ๋ฑ์ ์ ์ถ๋ ฅ์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํด์.
- ํ์ด๋จธ ๋ฐ ์๊ฐ ๊ด๋ จ ๊ธฐ๋ฅ ์ ๊ณต: ์๊ฐ ๊ธฐ๋ฐ ์์ ์ ์ฝ๊ฒ ํ ์ ์์ด์.
- ๋์์ฑ ๋๊ตฌ ์ ๊ณต: ์ฑ๋, ๋ฎคํ ์ค ๋ฑ์ ๋น๋๊ธฐ ํ๊ฒฝ์ ๋ง๊ฒ ์ ๊ณตํด์.
Tokio๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ง ์ฝ๊ฒ ๊ณ ์ฑ๋ฅ ๋น๋๊ธฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ด์. ๋ง์น ๋ง๋ฒ์ฒ๋ผ์! โจ
์, ์ด์ Tokio๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ ์์ ๋ฅผ ๋ณผ๊น์?
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::error>> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
loop {
let (mut socket, _) = listener.accept().await?;
tokio::spawn(async move {
let mut buf = [0; 1024];
loop {
let n = match socket.read(&mut buf).await {
Ok(n) if n == 0 => return,
Ok(n) => n,
Err(e) => {
eprintln!("failed to read from socket; err = {:?}", e);
return;
}
};
if let Err(e) = socket.write_all(&buf[0..n]).await {
eprintln!("failed to write to socket; err = {:?}", e);
return;
}
}
});
}
}
</dyn>
์ฐ์, ์ด ์ฝ๋ ์ข ๋ฉ์ง๋ฐ์? ใ ใ ใ ์ด๊ฒ ๋ฐ๋ก Tokio๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ ์์ฝ ์๋ฒ์์. ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ๊ทธ๋๋ก ๋๋ ค์ฃผ๋ ์๋ฒ์ฃ .
์ฝ๋๋ฅผ ํ๋์ฉ ์ดํด๋ณผ๊น์?
TcpListener::bind()
: 8080 ํฌํธ์์ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ ค์.listener.accept()
: ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋ฐ์๋ค์ฌ์.tokio::spawn()
: ์๋ก์ด ๋น๋๊ธฐ ํ์คํฌ๋ฅผ ์์ฑํด์. ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๋๋ก ์ฒ๋ฆฌํ ์ ์์ด์!socket.read()
์socket.write_all()
: ๋น๋๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์๋๋ค.
์ด ์ฝ๋ ํ๋๋ก ์์ฒ ๊ฐ์ ๋์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ ์ ์์ด์! Tokio์ ํ์ ๋๋ผ์๋์? ๐
5. Tokio์ ์ฃผ์ ๊ธฐ๋ฅ๋ค: ๋น๋๊ธฐ์ ์ค์์ค ์๋ฏธ ๋์ดํ ๐ง
Tokio๋ ์ ๋ง ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํด์. ๋ง์น ์ค์์ค ์๋ฏธ ๋์ดํ์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ง ๋๊ตฌ๊ฐ ๋ค์ด์์ฃ ! ์ฃผ์ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณผ๊น์?
5.1 ํ์คํฌ (Tasks)
Tokio์ ํ์คํฌ๋ ๊ฐ๋ฒผ์ด ๋น๋๊ธฐ ์์
๋จ์์์. tokio::spawn()
์ ์ฌ์ฉํด ์๋ก์ด ํ์คํฌ๋ฅผ ๋ง๋ค ์ ์์ฃ .
tokio::spawn(async {
println!("์๋
ํ์ธ์, ์ ๋ ์๋ก์ด ํ์คํฌ์์!");
});
์ด๋ ๊ฒ ํ๋ฉด ๋ฉ์ธ ํ์คํฌ์ ๋ณ๋ ฌ๋ก ์คํ๋๋ ์๋ก์ด ํ์คํฌ๊ฐ ์์ฑ๋ผ์. ๋ฉ์ง์ฃ ? ๐
5.2 ์ฑ๋ (Channels)
์ฑ๋์ ํ์คํฌ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ํด์ฃผ๋ ํต์ ๋๊ตฌ์์. Tokio๋ ์ฌ๋ฌ ์ข ๋ฅ์ ์ฑ๋์ ์ ๊ณตํด์.
use tokio::sync::mpsc;
#[tokio::main]
async fn main() {
let (tx, mut rx) = mpsc::channel(32);
tokio::spawn(async move {
tx.send("์๋
ํ์ธ์!").await.unwrap();
});
if let Some(message) = rx.recv().await {
println!("๋ฐ์ ๋ฉ์์ง: {}", message);
}
}
์ด ์ฝ๋์์๋ mpsc(multi-producer, single-consumer) ์ฑ๋์ ์ฌ์ฉํ์ด์. ์ฌ๋ฌ ์์ฐ์๊ฐ ํ๋์ ์๋น์์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ฃ .
5.3 ์๊ฐ ๊ด๋ จ ๊ธฐ๋ฅ (Time)
Tokio๋ ์๊ฐ ๊ด๋ จ ๊ธฐ๋ฅ๋ ์ ๊ณตํด์. ์ผ์ ์๊ฐ ํ์ ์์ ์ ์คํํ๊ฑฐ๋, ์ฃผ๊ธฐ์ ์ผ๋ก ์์ ์ ๋ฐ๋ณตํ ์ ์์ฃ .
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
println!("์ ๊น๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์...");
sleep(Duration::from_secs(2)).await;
println!("2์ด๊ฐ ์ง๋ฌ์ด์!");
}
์ด ์ฝ๋๋ 2์ด ๋์ ๊ธฐ๋ค๋ฆฐ ํ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด์. ๊ฐ๋จํ์ฃ ? ใ ใ ใ
5.4 I/O ์์
Tokio๋ ํ์ผ ์์คํ , ๋คํธ์ํฌ ๋ฑ์ I/O ์์ ์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์.
use tokio::fs::File;
use tokio::io::AsyncReadExt;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::error>> {
let mut file = File::open("hello.txt").await?;
let mut contents = String::new();
file.read_to_string(&mut contents).await?;
println!("ํ์ผ ๋ด์ฉ: {}", contents);
Ok(())
}
</dyn>
์ด ์ฝ๋๋ ํ์ผ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฝ์ด์ค๋ ์์ ์์. ํ์ผ I/O๊ฐ ๋๋ ๋๊น์ง ๋ค๋ฅธ ์์ ์ ํ ์ ์์ด์!
5.5 ๋์์ฑ ๋๊ตฌ (Sync)
Tokio๋ Mutex, RwLock ๋ฑ์ ๋์์ฑ ๋๊ตฌ๋ ์ ๊ณตํด์. ์ด๋ค์ ๋น๋๊ธฐ ํ๊ฒฝ์ ์ต์ ํ๋์ด ์์ฃ .
use tokio::sync::Mutex;
use std::sync::Arc;
#[tokio::main]
async fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = tokio::spawn(async move {
let mut lock = counter.lock().await;
*lock += 1;
});
handles.push(handle);
}
for handle in handles {
handle.await.unwrap();
}
println!("์ต์ข
์นด์ดํธ: {}", *counter.lock().await);
}
์ด ์์ ์์๋ 10๊ฐ์ ํ์คํฌ๊ฐ ๋์์ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์์ผ์. Mutex๋ฅผ ์ฌ์ฉํด ์์ ํ๊ฒ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ฃ .
์ด๋ ๊ฒ Tokio๋ ์ ๋ง ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํด์. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ชจ๋ ๊ฒ์ด ์ฌ๊ธฐ ๋ค ์๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋์ฃ !
6. Tokio๋ฅผ ํ์ฉํ ์ค์ ์์ : ์ฑํ ์๋ฒ ๋ง๋ค๊ธฐ ๐ฌ
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ํ์ฉํด์ ๊ฐ๋จํ ์ฑํ ์๋ฒ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์? ์ด ์์ ๋ฅผ ํตํด Tokio์ ๊ฐ๋ ฅํจ์ ์ง์ ์ฒดํํด๋ณด์ธ์!
use tokio::net::{TcpListener, TcpStream};
use tokio::sync::broadcast;
use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader};
#[tokio::main]
async fn main() {
let listener = TcpListener::bind("localhost:8080").await.unwrap();
let (tx, _rx) = broadcast::channel(10);
loop {
let (mut socket, addr) = listener.accept().await.unwrap();
let tx = tx.clone();
let mut rx = tx.subscribe();
tokio::spawn(async move {
let (reader, mut writer) = socket.split();
let mut reader = BufReader::new(reader);
let mut line = String::new();
loop {
tokio::select! {
result = reader.read_line(&mut line) => {
if result.unwrap() == 0 {
break;
}
tx.send((line.clone(), addr)).unwrap();
line.clear();
}
result = rx.recv() => {
let (msg, other_addr) = result.unwrap();
if addr != other_addr {
writer.write_all(msg.as_bytes()).await.unwrap();
}
}
}
}
});
}
}
์ฐ์, ์ด ์ฝ๋ ์ ๋ง ๋๋จํ์ง ์๋์? ใ ใ ใ ํ ๋ฒ ์์ธํ ์ดํด๋ณผ๊น์?
TcpListener::bind()
: 8080 ํฌํธ์์ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ ค์.broadcast::channel()
: ๋ธ๋ก๋์บ์คํธ ์ฑ๋์ ๋ง๋ค์ด์. ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๋ฐ ์ฌ์ฉ๋ผ์.tokio::spawn()
: ๊ฐ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ๋ง๋ค ์๋ก์ด ํ์คํฌ๋ฅผ ๋ง๋ค์ด์.socket.split()
: ์์ผ์ ์ฝ๊ธฐ์ ์ฐ๊ธฐ ๋ถ๋ถ์ผ๋ก ๋๋ ์.tokio::select!
: ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ค ํ๋๊ฐ ์๋ฃ๋๋ฉด ์คํ๋ผ์. ์ฌ๊ธฐ์๋ ๋ฉ์์ง ์ฝ๊ธฐ์ ๋ฐ๊ธฐ๋ฅผ ๋์์ ์ฒ๋ฆฌํด์.
์ด ๊ฐ๋จํ ์ฝ๋๋ก ์์ฒ ๋ช ์ด ๋์์ ์ฑํ ํ ์ ์๋ ์๋ฒ๋ฅผ ๋ง๋ค์์ด์! Tokio์ ํ์ ๋๋ผ์๋์? ๐
7. Tokio์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ: ์ด๊ณ ์ ๋น๋๊ธฐ์ ์ธ๊ณ ๐
Tokio์ ์ฑ๋ฅ์ ์ ๋ง ๋๋จํด์. ์ฌ๋ฌ๋ถ, ์ด๊ฑฐ ์์ธ์? Tokio๋ฅผ ์ฌ์ฉํ๋ฉด ๋จ์ผ ์ค๋ ๋์์๋ ์๋ง ๊ฐ์ ๋์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ ์ ์์ด์! ๐คฏ
์ด๋ฐ ๋๋ผ์ด ์ฑ๋ฅ์ ๋น๊ฒฐ์ด ๋ญ๊น์? ๋ฐ๋ก ์ด๊ฑฐ์์:
- ํจ์จ์ ์ธ ์ด๋ฒคํธ ๋ฃจํ: Tokio๋ ์ด์ ์ฒด์ ์ ์ด๋ฒคํธ ํต์ง ๋ฉ์ปค๋์ฆ์ ์ต๋ํ ํ์ฉํด์.
- Work-stealing ์ค์ผ์ค๋ฌ: ์ฌ๋ฌ ์ค๋ ๋ ๊ฐ์ ์์ ์ ํจ์จ์ ์ผ๋ก ๋ถ๋ฐฐํด์.
- ์ ๋ก-์ฝ์คํธ ์ถ์ํ: Rust์ ๊ฐ๋ ฅํ ์ปดํ์ผ๋ฌ ๋๋ถ์ ๋ฐํ์ ์ค๋ฒํค๋๊ฐ ๊ฑฐ์ ์์ด์.
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: ๊ฐ ํ์คํฌ๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋งค์ฐ ์ ์ด์.
์ด๋ฐ ํน์ง๋ค ๋๋ถ์ Tokio๋ ๋๊ท๋ชจ ์์คํ ์์๋ ์์ฃผ ์ ์๋ํด์. ์๋ฅผ ๋ค์ด, Discord๋ผ๋ ์ ๋ช ํ ์ฑํ ํ๋ซํผ๋ Tokio๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฑฐ ์์ธ์? ๋๋ฐ์ด์ฃ ? ใ ใ ใ
๊ทธ๋ฆฌ๊ณ Tokio์ ๋ ๋ค๋ฅธ ์ฅ์ ์ ํ์ฅ์ฑ์ด์์. ์์ ํ๋ก์ ํธ์์ ์์ํด์ ์ ์ ํฐ ์์คํ ์ผ๋ก ํ์ฅํด ๋๊ฐ๊ธฐ ์ฌ์์. Tokio์ ๊ฐ ์ปดํฌ๋ํธ๋ค์ด ์ ์กฐํ๋ฅผ ์ด๋ฃจ๋ฉด์๋, ํ์ํ ๋ถ๋ถ๋ง ์ ํํด์ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ์.
Tokio๋ฅผ ์ฌ์ฉํ๋ฉด, ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง์น ๋ก์ผ์ฒ๋ผ ๋น ๋ฅด๊ณ , ๊ณ ๋ฌด์ค์ฒ๋ผ ์ ์ฐํด์ง ๊ฑฐ์์! ๐๐งต
8. Tokio ์ํ๊ณ: ๋น๋๊ธฐ์ ๊ดํํ ์ฐ์ฃผ ๐
Tokio๋ ๊ทธ ์์ฒด๋ก๋ ๊ฐ๋ ฅํ์ง๋ง, ์ฃผ๋ณ์ ์ ๋ง ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์์ด์. ๋ง์น ํ์๊ณ์ ํ์ฑ๋ค์ฒ๋ผ Tokio๋ฅผ ์ค์ฌ์ผ๋ก ๋๊ณ ์์ฃ . ใ ใ ใ ๋ช ๊ฐ์ง ์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์๊ฐํด๋๋ฆด๊ฒ์!
8.1 Hyper
Hyper๋ Tokio ์์ ๊ตฌ์ถ๋ ๋น ๋ฅด๊ณ ์์ ํ HTTP ๊ตฌํ์ฒด์์. ์น ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๋ค ๋ ์ ๋ง ์ ์ฉํด์.
๊ด๋ จ ํค์๋
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ