본문 바로가기
Frontend/Library

[라이브러리] json-rules-engine - if 중첩문이 다수일 때 유용한 라이브러리

by 만발한매화 2024. 10. 11.

if 중첩문이 다수일 때 유용한 라이브러리

https://www.npmjs.com/package/json-rules-engine

 

json-rules-engine

Rules Engine expressed in simple json. Latest version: 6.5.0, last published: a year ago. Start using json-rules-engine in your project by running `npm i json-rules-engine`. There are 163 other projects in the npm registry using json-rules-engine.

www.npmjs.com

 

json-rules-engine은 JavaScript 기반의 라이브러리로, JSON 형식으로 정의된 규칙을 평가하여 논리적인 결과를 도출한다.

이를 통해 복잡한 비즈니스 로직을 코드 내에서 직접 구현하지 않고, 규칙을 JSON 파일로 정의하여 적용할 수 있다.

주로 데이터 검증, 권한 관리, 워크플로우 엔진 등에서 활용된다.

주요 기능

  • 규칙 정의: 각 규칙은 JSON으로 정의되며, 규칙의 조건(condition)과 실행될 결과(event)를 명시한다.
  • 조건 평가: 주어진 사실(facts)에 따라 규칙의 조건이 충족되는지 평가한다.
  • 이벤트 실행: 조건이 만족될 경우 특정 작업이 이루어지거나 함수가 호출된다.
  • 조합 가능성: 여러 규칙을 동시에 평가하여 복합적인 논리를 처리할 수 있다.
  • 비동기 처리 지원: 비동기 데이터 처리 및 평가도 가능하며, 데이터베이스에서 데이터를 가져와 조건을 평가하는 등의 작업도 가능하다.

기본 사용 예시

const { Engine } = require('json-rules-engine');

// 엔진 생성
let engine = new Engine();

// 규칙 추가
engine.addRule({
  conditions: {
    all: [{
      fact: 'age',
      operator: 'greaterThanInclusive',
      value: 18
    }]
  },
  event: {
    type: 'adult',
    params: {
      message: '성인입니다.'
    }
  }
});

// 사실 추가
let facts = { age: 20 };

// 규칙 평가
engine
  .run(facts)
  .then(events => {
    events.map(event => console.log(event.params.message)); // "성인입니다." 출력
  });

 

핵심 요소

  1. Facts (사실): 규칙 평가의 기준이 되는 데이터로 JSON 형식의 객체로 전달된다.
  2. Conditions (조건): 규칙을 트리거하기 위한 논리 조건이다. 다양한 연산자(operator)를 통해 조건을 정의할 수 있다.
  3. Events (이벤트): 조건이 만족되었을 때 발생하는 결과로, 특정 작업이나 메시지를 포함할 수 있다.

활용 사례

  • 비즈니스 규칙 엔진: 복잡한 규칙 기반의 의사결정 로직을 JSON으로 정의하여 유연하게 관리.
  • 권한 관리 시스템: 사용자 역할(role)이나 상태에 따른 권한 부여 및 제한 로직 처리.
  • 거래 검증 시스템: 다양한 조건을 기반으로 한 거래 승인 또는 거부 로직 구현.

json-rules-engine은 특히 프론트엔드와 백엔드 시스템에서 비즈니스 로직을 보다 쉽게 유지하고 관리할 수 있도록 돕는다.

 

실제 사용예시 

json-rules-engine을 if 문이 많은 코드에 적용하면 코드가 보다 간결하고 유지보수하기 쉽게 변한다. 복잡한 논리 조건을 if-else 문으로 구현하면 코드가 복잡해지고 수정하기 어려워지지만, json-rules-engine을 사용하면 규칙을 JSON으로 분리하여 논리의 변경이나 추가를 쉽게 할 수 있다.

기존 if 문 기반의 코드 예시

if 문이 여러 번 중첩되면 가독성이 떨어지고, 새로운 조건이 추가될 때마다 수정이 필요하다.

function determineUserAccess(user) {
  if (user.age >= 18) {
    if (user.role === 'admin') {
      return '관리자 접근 허용';
    } else if (user.role === 'member') {
      return '일반 회원 접근 허용';
    } else {
      return '접근 권한 없음';
    }
  } else {
    return '나이가 부족하여 접근 불가';
  }
}

const result = determineUserAccess({ age: 20, role: 'admin' });
console.log(result);  // '관리자 접근 허용'

json-rules-engine을 사용한 개선된 코드

const { Engine } = require('json-rules-engine');

// 규칙 엔진 생성
let engine = new Engine();

// 성인인지 확인하는 규칙
engine.addRule({
  conditions: {
    all: [{
      fact: 'age',
      operator: 'greaterThanInclusive',
      value: 18
    }]
  },
  event: {
    type: 'accessAllowed',
    params: {
      message: '나이 기준 통과'
    }
  }
});

// 관리자 접근 허용 규칙
engine.addRule({
  conditions: {
    all: [{
      fact: 'role',
      operator: 'equal',
      value: 'admin'
    }]
  },
  event: {
    type: 'adminAccess',
    params: {
      message: '관리자 접근 허용'
    }
  }
});

// 일반 회원 접근 허용 규칙
engine.addRule({
  conditions: {
    all: [{
      fact: 'role',
      operator: 'equal',
      value: 'member'
    }]
  },
  event: {
    type: 'memberAccess',
    params: {
      message: '일반 회원 접근 허용'
    }
  }
});

// 사용자 데이터
let facts = { age: 20, role: 'admin' };

// 규칙 평가
engine
  .run(facts)
  .then(events => {
    events.map(event => console.log(event.params.message)); 
    // "나이 기준 통과"와 "관리자 접근 허용"이 출력됩니다.
  });

차이점

  1. 가독성 향상: if 문이 중첩된 복잡한 논리가 규칙으로 분리되면서 코드의 가독성이 크게 향상된다.
  2. 유연성 증가: 규칙은 JSON으로 관리되므로 새로운 조건을 추가하거나 수정하는 것이 쉽다. 예를 들어, 새로운 역할을 추가하거나 나이 제한을 변경하는 것이 JSON 데이터를 수정하는 것만으로 가능하다.
  3. 재사용성: 동일한 규칙 엔진을 여러 곳에서 재사용할 수 있다. 다양한 데이터에 대한 규칙 평가를 별도의 코드 수정 없이 적용할 수 있다.

실사용 시 고려 사항

  • 규칙 분리: if 문이 많은 코드에서 각 조건을 적절히 규칙으로 나누어야한다. 각 규칙의 조건과 결과를 명확히 정의하고, 이벤트를 통해 결과 처리를 관리한다.
  • 사실(fact) 관리: 규칙에서 사용할 데이터를 미리 준비하고 fact로 전달하여 엔진이 이를 기반으로 조건을 평가하도록 한다.
  • 비즈니스 로직 분리: 비즈니스 로직을 JSON으로 분리하면 개발자가 아닌 사용자나 관리자가 직접 규칙을 수정하거나 추가할 수 있게 된다.

'Frontend > Library' 카테고리의 다른 글

[UnJS] [unbuild] javascript 빌드를 위한 시스템  (0) 2024.11.21