๐Ÿ“š Monad๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์ด ๊ธ€์€ Monad๋ž€ ๋ฌด์—‡์ธ๊ฐ€?๋ฅผ ์‹œ์ฒญ ํ›„ ๊ฐœ์ธ ๊ณต๋ถ€ ๋ฐ ์ •๋ฆฌ์šฉ์œผ๋กœ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Scala(Scalable Language)

  • ์‚ฌ์šฉ์ž๊ฐ€ ์–ธ์–ด๋ฅผ ํ™•์žฅํ•˜๋ฉด์„œ๋„ ์›๋ž˜ ์–ธ์–ด๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Functional Language

  • ํ•จ์ˆ˜๊ฐ€ 1๊ธ‰ ๊ณ„์ธต
  • ๋ณ€์ˆ˜ ๋ถˆ๋ณ€
  • ํƒ€์ž…ํด๋ž˜์Šค
  • ํŒจํ„ด ๋งค์นญ
  • Currying

Monad?

  • ์ˆ˜ํ•™์˜ ๋ฒ”์ฃผ๋ก ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ์กฐ๋กœ Haskel, Scala์—์„œ ์ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ ์šฉ

map()์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ฐฐ์—ด์˜ ์›์†Œ์— ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ  ๊ทธ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๊ณ ํ†ต์ด ์‹œ์ž‘๋œ๋‹ค.
๋ชจ๋‚˜๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๊ฑด ์ข‹์ง€ ๋ชปํ•˜๋‹ค!
(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ flatMap()์€ ๋จผ์ € map์„ ํ•˜๊ณ  ์ดํ›„์— flat์„ ํ•ด์ฃผ๋Š” ์—ญํ• )

Monad๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์— ํ•„์š”ํ•œ๊ฐ€?

  • ๋น„๋™๊ธฐ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ => Promise๊ฐ€ ์‚ฌ์‹ค Monad์˜ ์ผ์ข…
  • ๊ฐ’์ด ๋ฏธ๋ž˜์— ์กด์žฌํ•˜๊ฑฐ๋‚˜ ๊ฐ’์ด null์ธ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋ธ๋งํ•  ๋•Œ Monad๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Monad์˜ ์ •์˜(๋ฐœํ‘œ์ž๋‹˜ ํ‘œํ˜„)

  • Monad๋Š” ๊ฐ’์„ ๋‹ด๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ผ์ข…
  • Functor๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Œ
  • flatMap() ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • Monad Laws๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋งํ•œ๋‹ค.

Functor๋ž€?

  • ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” map ๋ฉ”์†Œ๋“œ๋งŒ ๊ฐ€์ง„๋‹ค.
  • ํƒ€์ž…์ธ์ž ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์ „๋‹ฌ์ธ์ž์ธ ํ•จ์ˆ˜๋Š” ํƒ€์ž… ๊ฐ’์„ ๋ฐ›์•„ ํƒ€์ž… ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  • Functor๋Š” mapํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ ํƒ€์ž…์˜ Functor๋ฅผ ๋ฐ˜ํ™˜

map์˜ ์ง„์ •ํ•œ ์˜๋ฏธ

  • ์ปฌ๋ ‰์…˜์˜ ์›์†Œ๋ฅผ ์ˆœํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ• X
  • ํƒ€์ž…์˜ Functor๋ฅผ ํƒ€์ž…์˜ Functor๋กœ ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ
Functor๋ฅผ ์™œ ์“ฐ๋Š”๊ฑธ๊นŒ?

๊ฐ’์„ ๊บผ๋‚ผ ์ˆ˜๋„ ์—†๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด๋ผ๊ณ ๋Š” map() ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋ฟ์ธ๋ฐ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ’์ด ์—†๋Š” ์ผ€์ด์Šค
  • ๊ฐ’์ด ๋ฏธ๋ž˜์— ์ค€๋น„๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์ผ€์ด์Šค
  • ํ•จ์ˆ˜๋“ค์„ ์†์‰ฝ๊ฒŒ ํ•ฉ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
Functor - ๊ฐ’์ด ์—†๋Š” ์ผ€์ด์Šค
  • ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ null check ๋ถˆํ•„์š”
  • null์ธ ๊ฒฝ์šฐ, ๊ทธ๋ƒฅ ๋กœ์ง์ด ์‹คํ–‰๋˜์ง€ ์•Š์Œ
  • ์ฆ‰, ํƒ€์ž…์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ null์„ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•
Functor - ๊ฐ’์ด ๋ฏธ๋ž˜์— ์ค€๋น„๋˜๋Š” ์ผ€์ด์Šค
  • Promise๋“ค์— map์„ ์ ์šฉํ•ด๋„ ๊ณ„์† Promise๋กœ ๋‚˜์˜จ๋‹ค.
  • ์ฆ‰, non-blocking์ž„์„ ์˜๋ฏธ => ๋น„๋™๊ธฐ ์—ฐ์‚ฐ๋“ค์˜ ํ•ฉ์„ฑ์ด ๊ฐ€๋Šฅ

๊ทธ๋ž˜์„œ Monad๊ฐ€ ๋ญ”๋ฐ?

  • Functor์— flatMap()๋งŒ ์ถ”๊ฐ€ํ•œ ๊ฒƒ
  • Functor์˜ ๋ฌธ์ œ์ ์ด ์žˆ์–ด์„œ ๋“ฑ์žฅํ•œ ๊ฒŒ Monad
  • Functor๊ฐ€ Functor์— ๊ฐ์‹ธ์ ธ ์žˆ์œผ๋ฉด Functor์•ˆ์— Functor๋ฅผ ๊ฐ–๋Š” ํƒ€์ž…์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

Monad์˜ ์˜์˜

๊ฐ’์ด ์—†๋Š” ์ƒํ™ฉ, ๊ฐ’์ด ๋ฏธ๋ž˜์— ์ด์šฉ ๊ฐ€๋Šฅํ•ด์งˆ ์ƒํ™ฉ ๋“ฑ์˜ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ํ•  ์ˆ˜ ์—†๋Š” ์—ฌ๋Ÿฌ ์ƒํ™ฉ์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
๋น„๋™๊ธฐ ๋กœ์ง์„ ๋™๊ธฐ ๋กœ์ง ๊ตฌํ˜„์ฒ˜๋Ÿผ ๋™์ผํ•œ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด์„œ๋„, ํ•จ์ˆ˜์˜ ํ•ฉ์„ฑ ๋ฐ ์™„์ „ํ•œ non-blocking pipeline์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Reference

๋Š๋‚€์ 

์•„์ง ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹คโ€ฆ ๋ญ”๊ฐ€ ๊ทธ ํƒ€์ž…์„ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ณ„์† ํŒŒ์ดํ”„๋ผ์ธ์„ ์œ ์ง€ํ•˜๊ฒŒ๋” ํ•˜๊ธฐ ์œ„ํ•œ ๊ฑฐ ๊ฐ™์€๋ฐโ€ฆใ… 
์ด๊ณณ์ €๊ณณ ๋‚ด์šฉ์„ ์ฐพ์•„๋ด๋„ ๋ญ”๊ฐ€ ๋ช…์พŒํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ•ด์•ผํ•˜๋‚˜โ€ฆ ์•„๋ฌด๋ž˜๋„ ์ข€๋” ๊ณต๋ถ€๋ฅผ ํ•ด๋ด์•ผ ์กฐ๊ธˆ์”ฉ ๋Š๋‚Œ์ผ ์˜ฌ ๊ฒƒ ๊ฐ™๋‹ค.