Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scala, Cats Effect로 사서 고생한 함수형 프로그래밍 기행

Lee Wan Geun
December 04, 2022

Scala, Cats Effect로 사서 고생한 함수형 프로그래밍 기행

liftIO 2022 함수형 컨퍼런스 발표자료

Lee Wan Geun

December 04, 2022
Tweet

Other Decks in Technology

Transcript

  1. Scala, Cats Effect로 사서 고생한 함수형 프로그래밍 기행 liftIO 2022

    카카오페이 이완근 (Will) https://icednut.space ࢿҕ पಁ
  2. 목차 1. WHY Cats Effect? 2. Hurdle 3. Next Step

    ҕхਸਤೠӝࣿ੸ߓ҃૑ध पޖীࢲѻ঻؍$BUT&GGFDUҙ۲য۰਑ٜ ;*0 %%%BOE.PSF
  3. 왜 Scala, Cats Effect를 선택했나요? ߊ಴ܳद੘ೞӝ੹ী

  4. 1. WHY Cats Effect? Cats E ff ect Scala &

    Functional Programming에서 
 Cats Effect가 최신 기술이니까? 진정한 FP를 하기 위해? 2
  5. Future scala.concurrent.Future 1. WHY Cats Effect? Cats E ff ect

    Error Try, Option, Either যڌѱೞݶ ӭՔೞѱ׮ܙࣻ੓ਸө Legacy Scala & Akka 3
  6. https://taeguk 2 .blogspot.com/ 2021 / 06 /ndc 2 1 .html

    ೵ ੉Ѣޤ૑  
  7. 1. WHY Cats Effect? Cats E ff ect 스승님!! 제게

    가르침을 주십시오! 5
  8. 1. WHY Cats Effect? Cats E ff ect ???!?!?!!! 잘들어라.

    두 번 말 안 한다. Future is a Eager Evaluation. Find a Lazy Evaluation. OptionT, EitherT in Cats 6
  9. 1. WHY Cats Effect? Cats E ff ect $BUTƑ@Ƒ $BUT&GGFDU

    Referential Transparency Side E ff ect Higher-Kinded Type Tagless Final Encoding Type Class Context Bound Fiber Functor, Applicative, Monad Stream Monad Transformer Http 4 s IO Bracket Pattern Resource 7
  10. 1. WHY Cats Effect? Cats E ff ect 내가 참고했던

    자료들 Cats Effect 공식 레퍼런스 사이트 Leanpub > Practial FP in Scala Rock The JVM > Cats, Cats Effect 강의 Essential Effects https://taeguk2.blogspot.com/2020/07/monad-transformer-in-scala_19.html ઁੌхݺӨ঻਺ƑƑ 8
  11. 1. WHY Cats Effect? Cats E ff ect ???!?!?!!! 난

    Cats 라고 했지 Cats Effect 라곤 안했다. FDS-API Blog Post 고생해가면서 겨우 다 만들어 놨더니... https://velog.io/@icednut/TIL-Side-e ff ect%EC% 99 % 80 -Lazy-Evaluation https://velog.io/@icednut/%ED% 83 % 80 %EC% 9 E% 85 %ED% 8 1 %B 4 %EB% 9 E% 9 8 %EC% 8 A%A 4 %EB%A 5 %BC- %EC% 9 D%B 4 %EC% 9 A%A 9 %ED% 95 % 9 C-%EC% 95 %A 0 %EB% 93 % 9 C%ED% 9 8 %B 9 -%EB% 8 B%A 4 %ED% 9 8 % 95 %EC% 84 %B 1 - %EA%B 5 %AC%ED% 98 % 84 %ED% 95 % 98 %EA%B 8 %B 0 -Ad-hoc-Polymorphism-in-Scala ZIO 9
  12. Background with Cats & Cats Effect Ӓۢয۰਑ী؀೧ফӝೞӝ੹ীрױೞѱ૝Ҋֈযцद׮

  13. 장바구니를 일반적인 방식으로 구현해보겠습니다. 1. WHY Cats Effect? Monad: General

    Properties & Pure Productivity 11
  14. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

     12
  15. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    13  عջ
  16. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    13 عջ 
  17. Cats를 이용한 함수형 프로그래밍 방식으로는 어떻게 구현할까요? 1. WHY Cats

    Effect? Monad: General Properties & Pure Productivity 14
  18. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    15
  19. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    15
  20. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    15
  21. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    15
  22. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    ଵऔભ 근데 잠깐만요. 뭔가 이상한데요???  16
  23. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

     여기서 생성한 ShoppingCart 인스턴스를 뒤로 넘기지도 않았는데 ShoppingCart의 내부 상태가 어떻게 변하는거죠? 16 1 2 3 4
  24. 코드를 전체적으로 살펴봐도 ShoppingCart 인스턴스를 담는 전역 변수 같은 것은

    없습니다.
  25. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    마술인가요? 아닙니다. State Monad 덕분 입니다. OOP에서 봤던 방식과는 달리 원본 ShoppingCart 인스턴스의 내부 값을 변경하지 않음 대신 이전 ShoppingCart를 기반으로 새로운 ShoppingCart를 생성함 (쇼핑카트 State 합성) 이걸 flatMap과 map을 이용하여 해냄 18
  26. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    flatMap과 map 만으로도 상태를 관리하는 State 모나드 다음에 우리 서로 진하게 알아가보자!!! 19
  27. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    응? 근데 이게 뭘까요??   19
  28. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    flatMap 메소드 내부를 볼까요? 20
  29. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    여기서 F: FlatMap[F] 를 Cats에서는 타입클래스(Type-class)라고 부릅니다. 20 flatMap을 외부에서 전달받은 녀석의 flatMap을 호출하네요? 난 implicit parameter인 F를 전달한 적이 없는데 누가 전달한거죠?
  30. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    ޤঠ੉ѢޖࢲਕƑ@Ƒ ৵ாࣁ࢚ਸࠂ੟ೞѱ࢓ইƕ ف۰ਕೡѪ਷ইޖѪبহ׮ ੉೧೧ঠೞחѪ੉੓ਸࡺ੉׮ ௰ܻࠗੋ Type Class 21
  31. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    사실 Type-class 패턴은 Java에서도 우리가 모르는 사이에 이미 쓰고 있었습니다. 22
  32. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    사실 Type-class 패턴은 Java에서도 우리가 모르는 사이에 이미 쓰고 있었습니다. 22
  33. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    다만 Cats에서는 Scala의 implicit를 활용하여 타입클래스 전달을 좀 더 간결하게 할 수 있습니다. (하스켈 흉내??) 게다가 Cats, Cats Effect에는 이런 타입클래스 인스턴스를 이미 선언해 두었으니 23
  34. 1. WHY Cats Effect? Monad: General Properties & Pure Productivity

    상황에 맞게 알맞은 곳에 가져다가 쓰시면 됩니다. য੉ߊ಴੗ন߈ ੉ѢցޖೠѢইפয় 출처: https://rockthejvm.com 24
  35. 1. WHY Cats Effect? E ff ect & Fiber উ֞

     դ֎஘ҳঠ Side Effect ޤঠ  դցэ਷ ޅࢤӟ  ஘ҳك੸হয 25
  36. 1. WHY Cats Effect? E ff ect & Fiber ૓૞

     ֎оݔզզ଺ӡې 
 ஘ҳੋ઴ঌওחؘƑƑ DB (MySQL, Redis)에서 데이터 조회하기 사용자 정보 조회 HTTP API 호출해서 데이터 가져오기 에러 로그 남기기 Exception ؍૑ӝ ... যӒ۞֎  ਋ܻ׮द஘ҳೡө Side E ff ect Side E ff ect Side E ff ect Side E ff ect Side E ff ect 26
  37. 1. WHY Cats Effect? E ff ect & Fiber Ѧ۷׮੉֧

    ೞೞೞ যോցٸޙী יח׮יয ҡ൤஘ҳ೮ա 27 Side Effect가 미쳐 날뛰고 있습니다.
  38. 1. WHY Cats Effect? E ff ect & Fiber Ձ

    ೞೞೞ ٘ܖ৬٘ܖ৬ ଵऔભ 28
  39. 1. WHY Cats Effect? E ff ect & Fiber Ձ

    ೞೞೞ ٘ܖ৬٘ܖ৬ ଵऔભ 28
  40. 1. WHY Cats Effect? E ff ect & Fiber Side

    Effect가 미쳐 날뛰지 못하게 하는 마법의 아이템 IO를 획득하였습니다. 29
  41. 1. WHY Cats Effect? E ff ect & Fiber End

    of the World Fiber IO Type Class Type Class Side Effect를 관리하는 IO 모나드 너도 다음에 우리 서로 진하게 알아보자!!! ??! 30
  42. 1. WHY Cats Effect? E ff ect & Fiber Fiber

    উ֞  դց੄࢜۽਍஘ҳঠ য൜ ޤঠց৵੉ۧѱ ޖࢼѱࢤ҂য Tiger 31
  43. 1. WHY Cats Effect? E ff ect & Fiber ޖटܻࣗঠ

    ղ؋࠙ীפо ف׮ܻ࡟Ҋ੗חѢ ইೞ ցજ਷֧੉঻ҳա 출처: https://rockthejvm.com/courses/cats-effect/lectures/33903798 32
  44. 1. WHY Cats Effect? E ff ect & Fiber Ӓېੋ݃

    খਵ۽աೠపੜ೧ ֓ഋש WorkStealingThreadPool Queue ThreadPool IO IO IO IO IO IO IO IO IO IOFiber IOFiber IOFiber Fiber에 대한 설명도 나중에 다시 만나요! 33
  45. Hurdle: 실무에서 내가 겪었던 CE 관련 어려움들 ੉۞ೠӝࣿਸपޖী੸ਊೞ৓ਸٸযڃয۰਑੉੓঻աਃ

  46. 2. Hurdle: 실무에서 내가 겪었던 어려움 : IO.pure 뭐가 문제일까요?

    35
  47. 우리 이렇게 바꿔봐요. Eager Evaluation As is Lazy Evaluation To

    Be 2. Hurdle: 실무에서 내가 겪었던 어려움 : IO.pure 36
  48. 2. Hurdle: 실무에서 내가 겪었던 어려움 : Type-class 장난 지금

    나랑 하십니까? 무슨 타입클래스를 써야될지 내가 어떻게 아냐고요.  37
  49. 설령 타입클래스를 안다고 해도 타입클래스 주입이 문제 2. Hurdle: 실무에서

    내가 겪었던 어려움 : Type-class 38
  50. 모든 컴파일 오류를 찾아다니면서 타입클래스 주입을 해결해줘야 하는 번거로움 ㅜ_ㅜ

    이제 나를 호출하는 모든 곳에서 Logger 타입클래스를 암묵적으로 전달하지 않고 있었다면 컴파일 오류가 터질 것입니다. 2. Hurdle: 실무에서 내가 겪었던 어려움 : Type-class 그러게 왜 말을 안 듣냐 ZIO
  51. 2. Hurdle: 실무에서 내가 겪었던 어려움 Reader: Dependency Injection 함수형

    프로그래밍으로도 Dependency Injection을 구현할 수 있습니다. 응?? Spring Container 같은건가??? 40
  52. 땡!!! 저는 모나드라고요. 저는 UserStatisticsRepository가 누군지도 몰라염 2. Hurdle: 실무에서

    내가 겪었던 어려움 Reader: Dependency Injection 함수형 프로그래밍으로도 Dependency Injection을 구현할 수 있습니다. 40
  53. 근데 새로운 Dependency를 Injection 한다고 하면 컴파일 오류가 발생하는 것은

    좋지만 인풋이 보기 안 좋네요? উ֞ ݅աࢲ ߈оਕ 2. Hurdle: 실무에서 내가 겪었던 어려움 Reader: Dependency Injection 41
  54. 2. Hurdle: 실무에서 내가 겪었던 어려움 Reader: Dependency Injection 그러게

    왜 말을 안 듣냐 ZIO 근데 새로운 Dependency를 Injection 한다고 하면 컴파일 오류가 발생하는 것은 좋지만 인풋이 보기 안 좋네요? উ֞ ݅աࢲ ߈оਕ
  55. Next Step: ZIO, DDD and More ࢸ݃੉ۧѱ೧֬Ҋ՘਷ইפભ

  56. 3. Next Step Cats E ff ect 그래도 Cats Effect를

    쓰고 있는 거 보면 다들 자기만의 해결 방법이 있긴 한가 봅니다. (아직 내가 모를 뿐) 2022.11.30 이었습니다. 유지보수는 활발한듯 43
  57. 하지만 이걸 보면 생각이 달라지실 겁니다. https://youtu.be/M0Fe2SRTm5c 3. Next Step

    ZIO 44
  58. Cats Effect ZIO FS2 Http4s zio-stream zio-http Doobie Tapir Quill

    Circe Redis4s ScalaPB FS2 Kafka Scala 2 Scala 3 Haskell Kotlin & Spring Webflux 3. Next Step So what's next? 45
  59. Cats Effect ZIO FS2 Http4s zio-stream zio-http Doobie Tapir Quill

    Circe Redis4s ScalaPB FS2 Kafka Scala 2 Scala 3 Haskell Kotlin & Spring Webflux Category Theory for Programmer Domain Driven Development Event Sourcing 3. Next Step So what's next? 46
  60. $MPOF $PEJOH $POUSJCVUF $PEJOH 5SBJOJOH 4UVEZ 나무를 베는데 6시간을 준다면,

    4시간은 도끼 날을 가는 데 쓰겠다. - 에이브러햄 링컨 - 3. Next Step Good Luck! 47
  61. 2O" 발표 들어주셔서 감사합니다. 다음에 또 만나요!