[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/