[2019 JSConf Korea] Nact: Node.js + Actors
이현수 책임
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에 지나치게 의존하는 안티패턴
- 이 모든 것들을 해결해 줄 방법이 있다면?
- 기존 CRUD 모델에서 개발 시 불편한 점
- 데이터 쿼리
- 본론
- 대안: 액터 모델
- Nact 프로젝트 소개
- CRUD 모델과 대비해서 액터 모델 개발 방식의 장점
- 메시지 기반
- typescript 잘 어울림
- 데이터 쿼리는 어떻게 편해지는가 (+코드 예제)
- 데이터 업데이트는 어떻게 편해지는가 (+코드 예제)
- 테이블에 덮어써버리는 방식 vs 이벤트 소싱 방식
- History 성격의 테이블 만들 필요없이 이벤트 소싱 자체가 History + Log + Audit trail 역할을 다함
- 이벤트 소싱 + CQRS: 퍼시스턴스 액터와 이벤트 스토어를 Write Side로 만들고, 따로 Read Side를 만들어서 기존 SQL 방식처럼 데이터 검색, 통계 출력 가능
- 메시지 기반
- 비유: 코드가 어디서 많이 본 모양? Redux 리듀서,
(S, A) => S
(스테이트 모나드) - 향후 추가될 기능:
- Remote Actor
- Clustering
- 결론
- 앞 장 세 줄 정리
- 프로젝트 참여 독려
기대 성과
- 그동안 다른 언어 진영에 비해 상대적으로 액터 모델에 대한 관심이 적은 자바스크립트 커뮤니티에, 액터 모델 기반 개발 방법에 대한 관심을 유도하고 가능성을 발견할 수 있도록 기회 제공
- Nact 프로젝트에 실력있는 컨트리뷰터의 참여를 독려해서 프로젝트를 개선 발전 동력 확보