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)); // "성인입니다." 출력
});
핵심 요소
- Facts (사실): 규칙 평가의 기준이 되는 데이터로 JSON 형식의 객체로 전달된다.
- Conditions (조건): 규칙을 트리거하기 위한 논리 조건이다. 다양한 연산자(operator)를 통해 조건을 정의할 수 있다.
- 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));
// "나이 기준 통과"와 "관리자 접근 허용"이 출력됩니다.
});
차이점
- 가독성 향상: if 문이 중첩된 복잡한 논리가 규칙으로 분리되면서 코드의 가독성이 크게 향상된다.
- 유연성 증가: 규칙은 JSON으로 관리되므로 새로운 조건을 추가하거나 수정하는 것이 쉽다. 예를 들어, 새로운 역할을 추가하거나 나이 제한을 변경하는 것이 JSON 데이터를 수정하는 것만으로 가능하다.
- 재사용성: 동일한 규칙 엔진을 여러 곳에서 재사용할 수 있다. 다양한 데이터에 대한 규칙 평가를 별도의 코드 수정 없이 적용할 수 있다.
실사용 시 고려 사항
- 규칙 분리: if 문이 많은 코드에서 각 조건을 적절히 규칙으로 나누어야한다. 각 규칙의 조건과 결과를 명확히 정의하고, 이벤트를 통해 결과 처리를 관리한다.
- 사실(fact) 관리: 규칙에서 사용할 데이터를 미리 준비하고 fact로 전달하여 엔진이 이를 기반으로 조건을 평가하도록 한다.
- 비즈니스 로직 분리: 비즈니스 로직을 JSON으로 분리하면 개발자가 아닌 사용자나 관리자가 직접 규칙을 수정하거나 추가할 수 있게 된다.
'Frontend > Library' 카테고리의 다른 글
| [UnJS] [unbuild] javascript 빌드를 위한 시스템 (0) | 2024.11.21 |
|---|