Task,TaskValue ์˜ ์ฐจ์ด


linkedin์—์„œ ๋ณธ ํฅ๋ฏธ๋กœ์šด Post๋ฅผ ์†Œ๊ฐœํ• ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.

  • Task์—์„œ ValueTask๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • :mag: ๊ฒฐ์ • ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ•ด๋‹น ํฌ์ŠคํŠธ์— ์ „๋ฌธ๋ฒˆ์—ญ๋ณธ์ž…๋‹ˆ๋‹ค.

NET์—์„œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•  ๋•Œ 'Taskโ€™์™€ 'ValueTaskโ€™๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ž‘์—…์„ ์ ‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
:trophy: ์–ธ๋œป ๋ณด๊ธฐ์—๋Š” ๋น„์Šทํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‘˜ ์‚ฌ์ด์—๋Š” ์„ฑ๋Šฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ
์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋จผ์ € 'Taskโ€™์ด ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 'Taskโ€™๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„
๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
'Taskโ€™๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด์ œ๋˜๊ณ  'Taskโ€™๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
'Taskโ€™์ด ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ(์žˆ๋Š” ๊ฒฝ์šฐ)๊ฐ€ ํ˜ธ์ถœ ์ฝ”๋“œ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด์— 'ValueTaskโ€™๋„ ๋น„๋™๊ธฐ ์ž‘์—…์ด์ง€๋งŒ ๋ถˆํ•„์š”ํ•œ ํ• ๋‹น์„ ๋ฐฉ์ง€ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
'ValueTaskโ€™๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—… ๋˜๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
'ValueTaskโ€™๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒฝ์šฐ ๋™์ž‘์€ 'Taskโ€™์˜ ๋™์ž‘๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค: ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด์ œ๋˜๊ณ 
'ValueTaskโ€™๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฃผ์š” ์ฐจ์ด์ ์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
'Taskโ€™๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ๋Ÿฐํƒ€์ž„์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด โ€˜Taskโ€™ ๊ฐœ์ฒด๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ฐœ์ฒด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํž™์— ํ• ๋‹น๋˜๋ฉฐ ๋งŽ์€ โ€˜taskโ€™ ๊ฐœ์ฒด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒฝ์šฐ ์ƒ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋Œ€๋กœ 'ValueTaskโ€™๋Š” ๊ตฌ์กฐ์ฒด์ด๋ฏ€๋กœ ํž™ ๋Œ€์‹  ์Šคํƒ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜๊ณ  ๋งŽ์€ ์ˆ˜์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ 'Taskโ€™๋Œ€์‹  'ValueTaskโ€™๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋Œ€๋‹ต์€ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
์ ์€ ์ˆ˜์˜ ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ์ž‘์—…ํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ 'taskโ€™์œผ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์ˆ˜์˜ ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ์ž‘์—…ํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ 'ValueTaskโ€™๊ฐ€ ๋”
๋‚˜์€ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ cancel ๋˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ 'ValueTaskโ€™๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด 'Taskโ€™๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋”
๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ โ€˜ValueTaskโ€™ ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” 'ValueTaskโ€™๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ณ€์—ญ๋ณธ์ด๋ผ ์ฝ๊ธฐ ์ข€ ๋ถˆํŽธํ•˜์‹ค์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ์–ด๋ณด์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.
์œ„ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๋ฉด

  • ValueTask ๋Š” ๋™๊ธฐ,๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Task ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • 'Taskโ€™์™€ 'ValueTaskโ€™๋Š” ๋ชจ๋‘ .NET์˜ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์œ ์šฉํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํŠน์„ฑ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰:rocket:์„ ์ตœ์ ํ™”ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋งŽ์€ ์ˆ˜์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ :chart_with_upwards_trend: ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 'ValueTaskโ€™๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ ์€ ์ˆ˜์˜ ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ 'taskโ€™์œผ๋กœ ์ถฉ๋ถ„:dart:ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ

C# - ValueTask์™€ Task์˜ ์„ฑ๋Šฅ ๋น„๊ต https://www.sysnet.pe.kr/2/0/13115?pageno=0#ref_list

C# - Task์™€ ๋น„๊ตํ•ด ๋ณธ ValueTask ์‚ฌ์šฉ๋ฒ• .NET Framework: 2039. C# - Task์™€ ๋น„๊ตํ•ด ๋ณธ ValueTask ์‚ฌ์šฉ๋ฒ•

4๊ฐœ์˜ ์ข‹์•„์š”

ํ˜น์‹œ "Task ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค."๋ผ๊ณ  ์ •๋ฆฌํ•œ ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š”?

์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฃผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์Šค๋ ˆ๋“œ ํ’€ ์Šค๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ์„ค๊ณ„๋˜์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

4. Task/Task

Task๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (Taskํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Thread๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

https://www.sysnet.pe.kr/3/1/5698
์ด๊ธ€๋„ ์ฐธ์กฐํ•ด๋ณด์„ธ์š”
์ข€๋” ๊ธ€์„ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์€๋ฐ valuetask, task ๊ด€๋ จํ•ด์„œ ์ข€๋” ์—ฐ๊ตฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

์•ˆ๋…•ํ•˜์„ธ์š”. ํ•ด๋‹น ์‚ฌ์•ˆ์— ๋Œ€ํ•ด ๊ธ€๋งˆ๋‹ค ๊ฒฌํ•ด๊ฐ€ ๋‹ค๋‹ฌ๋ผ์„œ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
์œ„์˜ ์ฝ์€ ๊ธ€์„ ํ† ๋Œ€๋กœ ๋ณด๋ฉด,
ValueTask๋Š” ์Šคํƒ์— ํ• ๋‹น, Task๋Š” ํž™์— ํ• ๋‹น๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„, ์Šคํƒ์ด ํ›จ์”ฌ ๋” ๋น ๋ฅธ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ์•Œ๊ณ ์žˆ๋Š”๋ฐ, ๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์—์„œ ๋ง์”€ํ•˜์‹  Cancel๋“ฑ์˜ ํŠน์ด ์ผ€์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ฌด์กฐ๊ฑด์ ์ธ ValueTask๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์„๊นŒ์š”?

ValueTask ๋Š” ์•„๋ž˜์˜ ๊ธ€์— ๋‚˜ํƒ€๋‚œ ๊ฒƒ ์ฒ˜๋Ÿผ,

.NET Framework: 2039. C# - Task์™€ ๋น„๊ตํ•ด ๋ณธ ValueTask ์‚ฌ์šฉ๋ฒ• (sysnet.pe.kr)

"์ด๋ฏธ ๊ฒฐ๊ณผ๊ฐ’์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ"์— ์„ฑ๋Šฅ ์ด๋“์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, "๊ฐ’์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ"๋Š” โ€œํŠน์ • ์ž…๋ ฅ๊ฐ’์—๋Š” ์–ธ์ œ๋‚˜ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•จโ€ ๊ณผ โ€œ์ƒ๋‹น ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’๋“ค์„ ์ด๋ฏธ ์ €์žฅํ•˜๊ณ  ์žˆ์Œโ€ ์„ ์ „์ œํ•ฉ๋‹ˆ๋‹ค.

๊ฑฐ์‹œ์ ์œผ๋กœ ๋ณด๋ฉด, ValueTask์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€๋Š” "์„ฑ๋Šฅ๊ณผ ์ž์›์€ ์ƒ๋ณด์ (Trade-off)"์ด๋ผ๋Š” ์ตœ์ ํ™”์˜ ์›์น™์„ ๋ฒ—์–ด ๋‚˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์„ฑ๋Šฅ๊ณผ ์ž์›์€ ์ƒ๋ณด์ "์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋Š” "Recursive call"๋ณด๋‹ค๋Š” Memoization์ด๋‚˜ Tabulation์ด ๋‚˜์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์  - ์ „์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋œ ์‚ฌ์šฉํ•˜๊ณ , ํ›„์ž๋Š” ๋ชจ๋“  ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ(์ž์›)๋ฅผ ๋” ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ท๋„ท์—์„œ๋„ Task.CompletedTask, string.Empty (์š”์ฆ˜์€ โ€œโ€ ๋„ ํฌํ•จ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค) ์™€ ๊ฐ™์ด ์‚ฌ์ „์— ๋ฏธ๋ฆฌ ํ• ๋‹น ์‹œ์ผœ ๋†“์€ ๊ฒƒ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ํž™ ํ• ๋‹น ํšŒํ”ผ ๊ธฐ๋ฒ•์ด ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์ตœ์ ํ™”์˜ ๋Œ€์ „์ œ์ธ "ํŠน์ • ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’ ์‚ฌ์ด์— ๋ถˆ๋ณ€์˜ ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•จ"์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์œผ๋ฉด, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์‹œํ‚ฌ ์ˆ˜๋‹จ์„ ์ฐพ๊ธฐ๋Š” ์–ด๋ ค์šด๋ฐ, ํ˜„์‹ค์˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹น๋  ํ™•๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • id ์˜ User ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์—์„œ get ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์–ธ์ œ๋‚˜ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ User ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด User์˜ ๋ฐ์ดํ„ฐ๋Š” ์–ธ์ œ Update ๋ ์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ์š”. Update ์ด์ „์— ์ €์žฅํ•ด ๋†“์€ ๊ฐ’์€ ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ, ํ˜ธ์ถœ ์ฝ”๋“œ์—์„œ User ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ณ„์† ์ถ”์ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ์ถ”์ ์˜ ๋‚ด์šฉ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ž์›์„ ์‚ฌ์ „์— ์†Œ๋น„ํ•˜๊ณ  ๋‚˜์„œ์•ผ, ๋น„๋กœ์†Œ ValueTask๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ์ด๋“์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์ผ€์ด์Šค๊ฐ€ EF ์˜ DbSet<T>.FindAsync ๋กœ, ValueTask<T>๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ท๋„ท ์ฝ”์–ด๋งŒ ์“ฐ๋Š” ์ €์˜ ๊ฒฝํ—˜ ์ƒ, ValueTask๋กœ ์œ ์˜๋ฏธํ•œ ์ด๋“์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ผ€์ด์Šค๋ฅผ ์•„์ง๊นŒ์ง€ ์ฒดํ—˜ํ•ด๋ณด์ง€๋Š” ๋ชป ํ–ˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋น„๋™๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ์ตœ์ ํ™”๋œ ๋น„๋™๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜๊ฑฐ๋‚˜, ์ปค์Šคํ…€ ์ฝ”๋“œ๋ผ๋„ Task.CompletedTask, Task.FromResult ๋“ฑ ๋‹ท๋„ท์ด ์ œ๊ณตํ•˜๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Cancel ์ด "๋น„๋™๊ธฐ์  ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Œ"์„ ์˜๋ฏธํ•œ๋‹ค๋ฉด, Cancel ์กฐ๊ฑด์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์ „์— ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Task ๋ฅผ ์“ฐ๋ƒ ValueTask ๋ฅผ ์“ฐ๋ƒ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์€, ๋‹ค์‹œ ์–˜๊ธฐํ•˜๋ฉด, Task.CompletedTask, Task.FromResult ๋“ฑ์ด ์ œ๊ณต๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ตœ์ ํ™”๋˜์ง€ ์•Š์•˜๋˜ ์‹œ์ ˆ์—๋งŒ ์œ ์˜๋ฏธํ•œ ๊ณ ๋ฏผ์ด์ง€ ์•Š๋‚˜ํ•˜๋Š” ์ƒ๊ฐ€์„ ํ•ด๋ด…๋‹ˆ๋‹ค.

4๊ฐœ์˜ ์ข‹์•„์š”