Jinhan Choi

이벤트는 비즈니스 통신 구조 범위에서 발생한 무엇이라도 될 수 있다.
ex>송장접수, 회의실예약, 커피 한잔 요청, 신입사원채용 등 업무상에서 발생하는 모든 일이 전부 이벤트 이다.

  • Event 구조
  • 키없는 이벤트
    하나의 사실을 진술한 형태로 나타낸 이벤트
    단순 로그 성향
  • 엔티티 이벤트
    엔티티 = 유일한 것
    unique key 부여되고, 어느 시점의 엔티티 속성 및 상태를 기술한다.
    이 시점의 모든 필요한 엔티티의 정보가 다 담겨있다.
  • 키 있는 이벤트
    키를 포함하지만 엔티티를 나타내지 않는다.
    주로 이벤트 스트림의 한 파티션 내에서 데이터지역성을 보장하기 위해 이벤트 스트림을 파티셔닝 하는 용도 (동일 파티션으로 이벤트가 흘러가도록 키를 이용)
    키별로 집계하면, 하나의 엔티티 이벤트로 귀결됨
    툼스톤 이벤트를 만들어 삭제한다 (값을 null로 설정한 키 있는 이벤트)
    다운스트림에 삭제해야 한다는 사실을 알려주는 일종의 관례
  • Mysql 같은 데이터베이스의 Append-only 로그파일(binLog)도 일종의 이벤트

--

--

handle error

  1. default
    if we do not do anything.
    on calling get(), join() throw exception which wraps the actual exception as the root cause exception.
  2. Using exceptionally() method
    CompletionStage<T> exceptionally(Function<Throwable,? extends T> fn)
    if there no exception. this stage is skipped otherwise it is executed
    supplyAsync(…).exceptionally(… lambda or method ref)
  3. Async exception handling (exceptionallyAsync() — java 12)
  4. Composing Exceptionally (exceptionallyCompose() — java 12)
  5. Using handle() method
    handle(..), handleAsync(..)
    this method is always executed regardless of exception occurs or not.
    so have to handle error is null or not

--

--

클린하게 작성하기

  1. 연산자 중심으로 코드 작성
  2. map. flatMap의 함수 간결하게 (복잡하면 분리)
  3. 연산자는 원래 목적에서 벗어나지 않는 범위에서 사용
    map{
    log.info(….)
    it.doSomething()
    } -> bad case
    doOnNext{
    log.info(…)
    }.map { … }
  4. 데이터 클래스에는 Publisher 타입이 아닌것 사용하기
    Mono, Flux는 연산을 추상화 한것이지 데이터 타입이 아니다.
  5. Publisher의 null 타입은 Mono.empty
  6. Mono Flux 가 중첩되면 메서드 레퍼런스를 활용해라
  7. Collection API와 겹치지 않게.. (map,같은 것들 이름이 같아서 혼란을 줄수 있음)
  8. 변수명에 Mono, Flux 명시해주기 — userMono, userFlux
  9. 명시적 subscribe는 신중하게 -> 엔지니어가 모르는 장기간 돌게되는 스레드를 양산할 가능성이 크다.
  10. 높은 동시성은 flatMap을 중심으로 이루어짐. delayElement같은걸 사용하기보단, flatMapSequential, concatMap 등을 확인하고 차이점을 인지하고 사용하라.

누군가 작성한 내용을 보고 공감되고, 규칙처럼 세겨두면 좋을거 같아서 남김.

--

--