Nact: Node.js + Actors

2019 JSConf Korea 발표 제안입니다.

선정 동기

  • 소프트웨어 개발 패러다임 변화: 멀티코어 프로세서, 클라우드 네이티브, 마이크로서비스 아키텍처 등
  • 리액티브 시스템(응답이 잘 되고, 탄력적이며 유연하고 메시지 기반으로 동작하는 시스템) 설계 원칙에 입각한 애플리케이션 개발을 할 수 있는 도구 필요
  • 전통적인 CRUD 모델의 한계 인식과 대안 기술로서 액터 모델 제시
  • Akka 같은 유명한 라이브러리가 있는 Java, C# 진영에 비해 JavaScript 진영에서는 액터 모델 자체에 대한 관심이 적음
  • Node.js 플랫폼에서 동작하는 액터 모델 구현 Nact 프로젝트 소개
  • 본인도 커미터와 문서 번역자로 참여 중이며, 이번 기회를 통해 널리 알려서 사용자와 컨트리뷰터 유치

발표 컨셉

  • 액터 모델에 대한 구구절절한 설명은 시간 관계상 생략
  • 시중의 흔한 Akka 책에서 등장하는 인메모리 액터 숫자 카운팅, ping-pong 예제 같은 시시하고 실무에 적용할 거리가 안 되는 예제는 지양
  • (Akka 이름만 들어본 사람이 가장 궁금해할) 실무에 적용할 수 있는 퍼시스턴스 액터를 이용한 예제
  • 액터의 다른 특성 중에서도, 전통적인 CRUD 모델에 대비되는 특징인 이벤트 소싱 개념에 포커스를 맞춤
  • 이벤트 소싱(이벤트 스토어, 스냅샷) + CQRS(Write Side, Read Side) 설명 예제
  • Nact 프로젝트 소개, 코드 예제 소개
  • 오픈소스 프로젝트 참여 호소

개요

  • 서론
    • 기존 CRUD 모델에서 개발 시 불편한 점 - 데이터 쿼리
      • 구조상 객체로는 하나의 개체로 표현될 수 있지만, 세부 데이터가 여러 테이블에 정규화 되어 흩어져 있을 경우
      • 비즈니스 레이어에서 데이터를 불러오려면
        • 쿼리를 몇 단계로 하든지
        • 복잡한 조인 연산을 구현 하든지
      • 어찌하든 작성해야할 데이터 계층 코드가 많아짐
      • 리퀘스트가 올 때마다 쿼리 재반복 => 낭비
        • 설살가상으로 validation을 위해 여러 테이블을 찾아봐야 하는 경우, 리퀘스트 하나에 자원이 너무 낭비됨
      • 그렇다면 Cache? => 관리 포인트 증가 => 복잡성 증가
      • 데이터 업데이트
        • 특정 필드를 업데이트하는 UPDATE 문을 사례별로 개별 작성? (UPDATE name, UPDATE phone …)
        • 혹은 모든 필드를 조건적으로 업데이트하는 UPDATE문 하나 작성? (UPDATE name?, phone? …)
        • 어떤 식으로 해도 안 깔끔함
        • 트랜잭션, 격리, 락 등 생각해야 될 것 많음
      • 변경 이력
        • UPDATE 해버리면 기존 상태는 영구 상실
        • updatedBy, updatedAt 등 이런 필드들은 사실 그리 쓸모 없음
        • 변경 이력 남기자고 별도의 History 테이블 만들고 => 낭비
        • 테이블에 TRIGGER 걸어줌 (ON CREATE/UPDATE/DELETE) => 할 일 증가
      • 한방쿼리, 연통형 아키텍처 등 SQL에 지나치게 의존하는 안티패턴
    • 이 모든 것들을 해결해 줄 방법이 있다면?
  • 본론
    • 대안: 액터 모델
    • Nact 프로젝트 소개
    • CRUD 모델과 대비해서 액터 모델 개발 방식의 장점
      • 메시지 기반
        • typescript 잘 어울림
      • 데이터 쿼리는 어떻게 편해지는가 (+코드 예제)
      • 데이터 업데이트는 어떻게 편해지는가 (+코드 예제)
      • 테이블에 덮어써버리는 방식 vs 이벤트 소싱 방식
      • History 성격의 테이블 만들 필요없이 이벤트 소싱 자체가 History + Log + Audit trail 역할을 다함
      • 이벤트 소싱 + CQRS: 퍼시스턴스 액터와 이벤트 스토어를 Write Side로 만들고, 따로 Read Side를 만들어서 기존 SQL 방식처럼 데이터 검색, 통계 출력 가능
    • 비유: 코드가 어디서 많이 본 모양? Redux 리듀서, (S, A) => S (스테이트 모나드)
    • 향후 추가될 기능:
      • Remote Actor
      • Clustering
  • 결론
    • 앞 장 세 줄 정리
    • 프로젝트 참여 독려

기대 성과

  • 그동안 다른 언어 진영에 비해 상대적으로 액터 모델에 대한 관심이 적은 자바스크립트 커뮤니티에, 액터 모델 기반 개발 방법에 대한 관심을 유도하고 가능성을 발견할 수 있도록 기회 제공
  • Nact 프로젝트에 실력있는 컨트리뷰터의 참여를 독려해서 프로젝트를 개선 발전 동력 확보

참조