Skip to content

Context-Action 스토어 통합 아키텍처 ​

1. 개요 및 핵심 개념 ​

Context-Action 아키텍처란? ​

Context-Action 프레임워크는 문서 중심의 컨텍스트 분리와 효과적인 아티팩트 관리를 통해 기존 라이브러리의 근본적인 한계를 극복하도록 설계된 혁신적인 상태 관리 시스템입니다.

프로젝트 철학 ​

Context-Action 프레임워크는 현대 상태 관리의 중요한 문제들을 해결합니다:

기존 라이브러리의 문제점:

  • 높은 React 결합도: 강한 통합으로 컴포넌트 모듈화와 props 처리가 어려움
  • 이진 상태 접근법: 단순한 전역/로컬 상태 이분법으로는 특정 범위 기반 분리를 처리하기 어려움
  • 부적절한 핸들러/트리거 관리: 복잡한 상호작용과 비즈니스 로직 처리에 대한 부족한 지원

Context-Action의 솔루션:

  • 문서-아티팩트 중심 설계: 문서 테마와 결과물 관리를 기반으로 한 컨텍스트 분리
  • 완벽한 관심사 분리:
    • 뷰 디자인 격리 → 디자인 컨텍스트
    • 개발 아키텍처 격리 → 아키텍처 컨텍스트
    • 비즈니스 로직 격리 → 비즈니스 컨텍스트
    • 데이터 검증 격리 → 검증 컨텍스트
  • 명확한 경계: 구현 결과가 뚜렷하고 잘 정의된 도메인 경계를 유지
  • 효과적인 문서-아티팩트 관리: 문서와 결과물 간의 관계를 적극적으로 지원하는 상태 관리 라이브러리

아키텍처 구현 ​

프레임워크는 완전한 도메인 격리를 위한 세 가지 핵심 패턴을 통해 MVVM에서 영감을 받은 패턴으로 깔끔한 관심사 분리를 구현합니다:

  • 액션은 createActionContext를 통해 비즈니스 로직과 조정을 처리 (ViewModel 레이어)
  • 선언적 스토어 패턴은 createStoreContext을 통해 도메인 격리로 상태를 관리 (Model 레이어)
  • RefContext는 createRefContext를 통해 제로 리렌더링으로 직접 DOM 조작 제공 (Performance 레이어)
  • 컴포넌트는 UI를 렌더링 (View 레이어)
  • 컨텍스트 경계는 기능 도메인을 격리
  • 타입 안전한 통합은 도메인별 훅을 통해 구현

핵심 아키텍처 흐름 ​

[컴포넌트] → dispatch → [액션 파이프라인] → handlers → [스토어] → subscribe → [컴포넌트]

컨텍스트 분리 전략 ​

도메인 기반 컨텍스트 아키텍처 ​

  • 비즈니스 컨텍스트: 비즈니스 로직, 데이터 처리, 도메인 규칙 (액션 + 스토어)
  • UI 컨텍스트: 화면 상태, 사용자 상호작용, 컴포넌트 동작 (스토어 + RefContext)
  • 성능 컨텍스트: 고성능 DOM 조작과 애니메이션 (RefContext)
  • 검증 컨텍스트: 데이터 검증, 폼 처리, 오류 처리 (액션 + 스토어)
  • 디자인 컨텍스트: 테마 관리, 스타일링, 레이아웃, 시각적 상태 (스토어 + RefContext)
  • 아키텍처 컨텍스트: 시스템 구성, 인프라, 기술적 결정 (액션 + 스토어)

문서 기반 컨텍스트 설계 ​

각 컨텍스트는 해당 문서와 결과물을 관리하도록 설계됩니다:

  • 디자인 문서 → Design Context (테마, 컴포넌트 사양, 스타일 가이드) → 스토어 + RefContext
  • 비즈니스 요구사항 → Business Context (워크플로, 규칙, 도메인 로직) → 액션 + 스토어
  • 성능 사양 → Performance Context (애니메이션, 상호작용) → RefContext
  • 아키텍처 문서 → Architecture Context (시스템 설계, 기술적 결정) → 액션 + 스토어
  • 검증 사양 → Validation Context (규칙, 스키마, 오류 처리) → 액션 + 스토어
  • UI 사양 → UI Context (상호작용, 상태 관리, 사용자 플로우) → 세 패턴 모두

고급 핸들러 및 트리거 관리 ​

Context-Action은 기존 라이브러리에서 부족한 정교한 핸들러 및 트리거 관리를 제공합니다:

우선순위 기반 핸들러 실행 ​

  • 순차 처리: 적절한 비동기 처리와 함께 우선순위 순서로 핸들러 실행
  • 도메인 격리: 각 컨텍스트가 자체 핸들러 레지스트리를 유지
  • 교차 컨텍스트 조정: 도메인 컨텍스트 간 제어된 통신
  • 결과 수집: 복잡한 워크플로를 위한 여러 핸들러의 결과 집계

지능형 트리거 시스템 ​

  • 상태 변경 트리거: 스토어 값 변경에 기반한 자동 트리거
  • 교차 컨텍스트 트리거: 도메인 경계가 다른 컨텍스트의 액션을 트리거
  • 조건부 트리거: 비즈니스 규칙과 조건에 기반한 스마트 트리거
  • 트리거 정리: 자동 정리가 메모리 누수와 오래된 참조를 방지

주요 이점 ​

  1. 문서-아티팩트 관리: 문서와 구현 간의 직접적 관계
  2. 도메인 격리: 각 컨텍스트가 완전한 독립성을 유지
  3. 타입 안전성: 도메인별 훅으로 완전한 TypeScript 지원
  4. 성능: RefContext로 제로 React 리렌더링, 스토어로 선택적 업데이트
  5. 확장성: 기존 도메인에 영향을 주지 않고 새 도메인을 쉽게 추가
  6. 팀 협업: 다양한 팀이 충돌 없이 서로 다른 도메인에서 작업
  7. 명확한 경계: 문서 도메인을 기반으로 한 완벽한 관심사 분리
  8. 하드웨어 가속: 60fps 성능을 위한 translate3d()로 직접 DOM 조작

구현 문서 ​

참고: 자세한 구현 패턴과 예제는 더 나은 구성을 위해 패턴 섹션으로 이동되었습니다.

핵심 패턴 ​

아키텍처 패턴 ​

구현 가이드 ​

RefContext 성능 아키텍처 ​

제로 리렌더 철학 ​

RefContext 패턴은 DOM 조작을 위해 React의 렌더링 사이클을 완전히 우회하는 성능 우선 레이어를 도입합니다:

[사용자 상호작용] → [직접 DOM 조작] → [하드웨어 가속] → [60fps 업데이트]
                               ↓
                         [React 리렌더링 없음]

핵심 성능 원칙 ​

  1. 직접 DOM 액세스: React 재조정을 트리거하지 않고 DOM 요소를 직접 조작
  2. 하드웨어 가속: GPU 가속 애니메이션을 위한 transform3d() 사용
  3. 관심사 분리: 시각적 업데이트를 비즈니스 로직 업데이트와 분리
  4. 메모리 효율성: 자동 정리 및 생명주기 관리
  5. 타입 안전성: DOM 요소 타입에 대한 완전한 TypeScript 지원

성능 특성 ​

RefContext는 직접 DOM 제어가 필요한 고성능 시나리오를 위해 특별히 설계되었습니다:

접근법사용 사례React 리렌더링DOM 액세스
useState표준 UI 상호작용재조정 트리거React 관리
useRef기본 DOM 조작수동 제어 필요직접 참조
RefContext고성능 그래픽, 애니메이션제로 리렌더링직접 조작

RefContext 장점:

  • 제로 React 리렌더링: 재조정 없는 직접 DOM 조작
  • 하드웨어 가속: GPU 최적화 애니메이션 지원

RefContext 주요 대상:

  • ✅ 캔버스 애니메이션과 Three.js 그래픽
  • ✅ WebGL 렌더링과 게임 엔진
  • ✅ 고빈도 DOM 업데이트

참고: 데이터 관리의 경우 더 나은 확장성과 타입 안전성을 위해 useState 대신 Store contexts를 사용하세요.

모범 사례 요약 ​

아키텍처 설계 ​

  1. 하나의 도메인 = 하나의 컨텍스트 경계
  2. 비즈니스와 UI 관심사 분리
  3. 문서 주도 컨텍스트 분리 사용
  4. 도메인 격리 우선, 필요시 도메인 간 통신 사용

패턴 선택 ​

  1. 단순한 상태 관리는 Store Only로 시작
  2. 부수 효과나 복잡한 워크플로가 필요할 때 Action Only 추가
  3. 고성능 DOM 조작이 필요할 때 RefContext 추가
  4. 완전한 기능의 애플리케이션을 위해 모든 패턴 조합

구현 ​

  1. 타입 안전성과 명확성을 위해 항상 도메인별 훅 사용
  2. 오래된 상태를 피하기 위해 핸들러에서 지연 평가 사용
  3. 적절한 중첩을 위해 provider 조합 패턴 따르기
  4. 팀 협업을 위해 도메인 경계를 명확하게 문서화

코드 품질 및 모듈 조직 ​

  1. 더 나은 트리 쉐이킹과 번들 최적화를 위해 네임스페이스 import보다 명명된 import 선호
  2. 트리 쉐이킹 개선과 린팅 문제 방지를 위해 static-only 클래스 대신 유틸리티 함수 사용
  3. 체계적인 import 구성: React/외부 → 프레임워크 → 상대 경로 → 타입
  4. 유틸리티 함수와 에러 팩토리에 함수형 프로그래밍 패턴 따르기

코드 예시 ​

✅ 권장하는 Import 패턴 ​

tsx
// 더 나은 트리 쉐이킹을 위한 명명된 import
import { validateFormData, FormData, ValidationState } from '../business/businessLogic';
import { createValidationError, createRefError } from '../utils/errorFactory';

// 명확한 import 구성
import React, { useState, useCallback } from 'react';
import { useStoreValue } from '@context-action/react';
import { useRefRegistry } from '../contexts/RefContexts';
import type { ValidationResult } from '../types/validation';

✅ 권장하는 유틸리티 함수 ​

tsx
// static-only 클래스 대신 유틸리티 함수
export function createValidationError(message: string, context?: Record<string, any>): HandlerError {
  return {
    code: 'VALIDATION_ERROR',
    message,
    timestamp: Date.now(),
    context,
    recoverable: true
  };
}

// 사용법: 직접 함수 호출
import { createValidationError } from './errorUtils';
throw createValidationError('Invalid input', { field: 'email' });

❌ 피해야 할 패턴 ​

tsx
// 네임스페이스 import는 트리 쉐이킹을 방해
import * as BusinessLogic from '../business/businessLogic';
import * as ErrorFactory from '../utils/errorFactory';

// Static-only 클래스는 린팅 경고 발생
export class ErrorFactory {
  static createValidationError(message: string): HandlerError {
    // 구현...
  }
}

시작하기 ​

자세한 구현 예제와 단계별 가이드는 다음을 참조하세요:

더 많은 정보와 업데이트는 프로젝트 저장소를 방문하세요.

Released under the Apache-2.0 License.