Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

프로젝트에 스칼라 도입하기!

스칼라로 비동기 프로그래밍하기

  • Login to see the comments

  • Be the first to like this

프로젝트에 스칼라 도입하기!

  1. 1. 프로젝트에 스칼라 도입하기! 뻔뻔한 발표 3rd @sungjk
  2. 2. Thenully 2016.10.18 - Current
  3. 3. https://reworkapp.com
  4. 4. • 자바 가상 머신(JVM)에서 동작 • 정적 타이핑 언어 • 객체지향과 함수 프로그래밍 패러다임을 모두 지원 Scala
  5. 5. • 이벤트 루프 기반의 비동기 네트워크 프레임워크 • Non-blocking IO 지원 • 초당 250만 정도의 요청 처리 Netty
  6. 6. Future
  7. 7. • 동시성(Concurrency) 처리를 위해 사용 • 값이 계산된 후 채워지는 Read-only placeholder • 암시적으로 실행 컨텍스트(Execution context)에서 수행 Future
  8. 8. The curse of the monad is that once you get the epiphany, once you understand - “oh thats what it is”- you lose the ability to explain it to anybody. - Douglas Crockford
  9. 9. • Associativity • m flatMap f flatMap g == m flatMap (x => f(x) flatMap g) • Left unit • unit(x) flatMap f == f(x) • Right unit • m flatMap unit == m Monad laws
  10. 10. • identity • Return in Haskell, unit in Scala • bind • >>= in Haskell, flatMap in Scala Monad operators
  11. 11. Transforming Future
  12. 12. • Future is an object holding a value which may become available at some point. • While futures are defined as a type of read-only placeholder object created for a result which doesnt yet exist, a promise can be thought of as a writable, single-assignment container, which completes a future. Future & Promise
  13. 13. • 데이터베이스에서 특정 키 값으로 조회하기 Future & Promise • 데이터베이스에서 userId에 해당하는 유저의 정보를 비동기적으로 가져온다. • 계산이 다 끝났을 때(computed) 유저의 정보가 있다면 UserEntity가 반환된다. • 없다면, None이 반환된다.
  14. 14. • 외부 API의 콜백 결과 값 가져오기 Future & Promise • 생성 당시 빈 컨테이너(Empty container)이지만, 계산이 완료되면 값을 꺼내서 사용할 수 있다. • promise.success / promise.failure에 원하는 값을 채워 넣는다(pushed in). • 미래에 사용 가능하다는 것을 나타내는 promise.future를 리턴한다.
  15. 15. • def flatMap[B](f: (A) => M[B]): M[B] • M[A] ---- (map with A => M[B]) ----> M[M[B]] ----flatten ----> M[B] flatMap
  16. 16. • flatMap과 map을 합성하는 기능을 제공 • Callback hell에서 벗어나 가독성 높은 코드 만들기 For comprehension
  17. 17. • Seq[Future]: 원소가 Future인 시퀀스 Seq[Future]  Future[Seq] • 데이터베이스에서 여러 개의 키값으로 데이터를 비동기적으로 가져오는 경우 • Blocking I/O를 이용해 값 얻어내기
  18. 18. • 다수의 Future를 하나의 Future로 만들기 Seq[Future]  Future[Seq] • Seq[Option[X]]을 Seq[X]로 변형하기
  19. 19. • Future.sequence는 .traverse의 심플 버전 • 순차 실행(in serial)이 아닌 병렬(parallel) 실행 • 따라서, 조회(SELECT)가 아닌 삽입(INSERT) 수행 시 insert duplicate key 에러에 유의 Seq[Future]  Future[Seq]
  20. 20. Handling Error
  21. 21. • 순수 함수형 언어에 예외란 없다. • 예외는 타입 시스템과 순수성을 약화시키는 사이드 이펙트 • 에러나 부적절한 조건은 특정한 값으로 명시되어야 한다. Error in FP
  22. 22. • Some / None 둘 중 하나 • 사용자 정보 업데이트하기 Option Type • userId에 해당하는 유저가 존재하는지 확인한다. • 존재한다면 Some(user), 그렇지 않으면 None을 리턴한다. • 각 분기에 맞게 업데이트를 하거나 Future의 결과를 반환한다.
  23. 23. • sealed abstract class Either[+A, +B] extends AnyRef • 성공 시 Right에 결과 값을 저장하고, • 실패 시 Left에 에러 저장 Either Type
  24. 24. • Success[T]와 Failure[T] 둘 중 하나 • Failure는 오직 Throwable 타입 Try[T] • 실패하면 NumberFormatException이 Throw 된다. • 실패하면 Exception을 포함한 Failure가 리턴되고, • 성공하면 파싱된 integer 값이 Success에 리턴된다.
  25. 25. • Exceptions를 기반으로 저수준 에러 핸들링 • 자바의 try, catch, finally 문과 유사 Exceptions • 다음과 같이 작성할 경우, 모든 Throwable을 에러로 인식하기 때문에 OOM 발생 가능
  26. 26. KEEP CALM A N D SCALA ON
  27. 27. 감사합니다

×