[Rust] async trait
Rust์ async ์์คํ
์ ์ผ๋ง์ ๊น์ง๋ง ํด๋ trait์ ๋ํ ์ง์์ด ๋ถ์กฑํ์๋ค. ์์ ๊ถ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ๋ณต์กํ๊ฒ ์ฝํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทผ๋์, 1.75.0 ๋ฒ์ ๋ถํฐ ๋ถ๋ถ์ ์ผ๋ก ์ง์์ด ๋๊ธฐ ์์ํ๋ค.
1.75 ๋ฒ์ ์ดํ
1.75 ๋ฒ์ ์ดํ์๋ ๋ถ๋ถ์ ์ผ๋ก๋ง ์ง์์ด ๋๊ธฐ ์์ํ๋ค.
์๋ฅผ ๋ค์ด, ์ด๋ ๊ฒ ๋จ์ํ ๊ฒฝ์ฐ์๋ ์ง์์ด ๋๋ค.


๊ทธ๋ฆฌ๊ณ impl T ๊ฐ์ ๊ฒฝ์ฐ๋ก static dispatch๋ฅผ ํ ๊ฒฝ์ฐ์๋ ์ ๋์ํ๋ค.

๋ฌธ์ ๋ dynamic dispatch์ ์ ํ์ด ์๋ค๋ ๊ฒ์ด๋ค.
์ ์ฝ๋์์ trait์ impl T๊ฐ ์๋๋ผ, dyn T๋ก ๊ต์ฒดํด๋ณด์.

๊ทธ๋ผ ์ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ๋ค.
์ด๊ฑด ๊ทผ๋ณธ์ ์ผ๋ก async trait์ ๋ฒ์ด๋์ "trait ๋ฉ์๋์์์ impl T ๋ฐํ ๋ฌธ์ "์ ๊ด๊ณ๋ ๋ฌธ์ ์ด๊ธฐ๋ ํ๋ค.
async trait์ ๋ฉ์๋๋ ๋ด๋ถ์ ์ผ๋ก ๋ฐํ ํ์
์ impl Future๋ก ๋ณํํ๋ค. ์ฌ๊ธฐ์ ์ ๋ฌธ์ ์ ๋๋ฌํ๋ ๊ฒ์ด๋ค.
๋ด์ฉ์ด ์ข ๋ณต์กํ๋ฐ, ๊ฐ๋จํ๊ฒ ๋งํด์ ์ด๊ฒ๋ ๋ผ์ดํํ์ ๊ด๋ จ๋ ๋ฌธ์ ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์๋๋ ์ฐธ๊ณ ํ ๋งํ ๊ธ๋ค์ด๋ค. ๊ถ๊ธํ๋ค๋ฉด ๋ณด๋ฉด ๋๋ค.
https://blog.rust-lang.org/2023/12/21/async-fn-rpit-in-traits.html#where-the-gaps-lie
https://smallcultfollowing.com/babysteps/blog/2019/10/26/async-fn-in-traits-are-hard/
์๋ฌดํผ ์ด๊ฒ๋ ์ถํ์๋ ์ฌ์ฉ์ฑ์ ๋ ๊ฐ์ ํ ์์ ์ด๋ผ๊ณ ํ๋ค.
์ด ๋ฌธ์ ๊ฐ ๊ฑธ๋ฆฐ๋ค๋ฉด ๋ค์ ์๋์์ ์๊ฐํ๋ "1.75.0 ๋ฏธ๋ง ๋ฒ์ "์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.
1.75.0 ๋ฏธ๋ง ๋ฒ์ ์ ๊ฒฝ์ฐ
1.75 ์ด์ ๋ฒ์ ์์๋ trait์ async๋ฅผ ์ง์ด๋ฃ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์๋ค.

์๋ฌ๋ฅผ ์๋ฉ ๋ฟ์ด๋ธ๋ค.
์ด์ ๋ํ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ํด๊ฒฐ์ฑ ์ ์๋ํํฐ crate์ธ async_trait์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
๊น๊ณ
ํธ๋ ์์ ๋งคํฌ๋ก ๋ถ์ธ๋ค์์

๊ตฌํ๋ถ์๋ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.

๊ทธ๋ผ ์ ๋ ๊ฒ์ด๋ค.

์ด ๋งคํฌ๋ก๊ฐ ํด์ฃผ๋ ์ผ์ ์ด๋ ๋ค.
์ด๋ฐ ์ฝ๋๋ฅผ

์ด๋ ๊ฒ ํ์ ๋ฐ์์ ๊ฐ์ธ์ฃผ๋ ๊ฒ์ด๋ค.
trait Readable {
fn readable<'a>(&self) -> Pin<Box<dyn 'a + Send + Future<Output = io::Result<()>>>
}์ฐธ์กฐ
https://blog.rust-lang.org/inside-rust/2023/05/03/stabilizing-async-fn-in-trait.html
https://stackoverflow.com/questions/65921581/how-can-i-define-an-async-method-in-a-trait
https://smallcultfollowing.com/babysteps/blog/2023/03/12/to-async-trait-or-just-to-trait/
https://blog.naver.com/sssang97/223306429993
https://smallcultfollowing.com/babysteps/blog/2019/10/26/async-fn-in-traits-are-hard/