본문으로 건너뛰기

Value DSL

Value DSL은 계산된 값, 전이 가드, 불변식, 데이터 변환을 정의하기 위한 Fascia의 제한된 표현식 언어입니다. 의도적으로 기능을 제한하고 있습니다 -- 함수 정의, 반복문, 부작용이 없습니다. 모든 표현식은 기존 데이터에서 결과를 산출하는 순수 계산입니다.

Value DSL 표현식은 Fascia 스펙 전반에 걸쳐 사용됩니다:

  • Entity 불변식 -- 항상 참이어야 하는 비즈니스 규칙
  • 상태 머신 가드 -- 전이가 발생하기 위해 충족해야 하는 조건
  • Flow Transform 노드 -- Flow 단계 간 데이터 변환
  • If/Switch 조건 -- Flow 그래프의 분기 로직
  • Policy 조건 -- Risk Engine이 평가하는 규칙

연산자

산술 연산자

OperatorDescriptionExample
+덧셈order.subtotal + order.tax
-뺄셈order.total - order.discount
*곱셈item.price * item.quantity
/나눗셈total / count
%나머지index % 2

비교 연산자

OperatorDescriptionExample
==같음order.status == "confirmed"
!=같지 않음user.role != "guest"
>초과reservation.totalPrice > 0
<미만now() < reservation.startDate
>=이상account.balance >= withdrawal.amount
<=이하deposit <= totalPrice

논리 연산자

OperatorDescriptionExample
&&논리 ANDisActive && isVerified
||논리 ORisAdmin || isStaff
!논리 NOT!isDeleted

멤버 접근

점 표기법을 사용하여 Entity 및 중첩 객체의 필드에 접근합니다:

reservation.totalPrice
reservation.customer.name
input.paymentMethod

내장 함수

문자열

FunctionSignatureDescription
concatconcat(a, b, ...)문자열 연결
lengthlength(str)문자열 길이
substringsubstring(str, start, end)부분 문자열 추출
toLowerCasetoLowerCase(str)소문자로 변환
toUpperCasetoUpperCase(str)대문자로 변환
trimtrim(str)앞뒤 공백 제거
startsWithstartsWith(str, prefix)접두사로 시작하는지 확인
endsWithendsWith(str, suffix)접미사로 끝나는지 확인
containscontains(str, search)부분 문자열 포함 여부 확인
replacereplace(str, search, replacement)첫 번째 일치 항목 교체
splitsplit(str, delimiter)문자열을 리스트로 분할

날짜

FunctionSignatureDescription
nownow()현재 날짜와 시간
addDaysaddDays(date, days)날짜에 일수 추가
addHoursaddHours(date, hours)날짜에 시간 추가
diffDaysdiffDays(date1, date2)두 날짜 간 일수 차이
formatformat(date, pattern)날짜를 문자열로 포맷

수학

FunctionSignatureDescription
absabs(n)절대값
ceilceil(n)올림
floorfloor(n)내림
roundround(n)반올림
minmin(a, b)두 값 중 작은 값
maxmax(a, b)두 값 중 큰 값

집계

FunctionSignatureDescription
sumsum(list, field)리스트에서 필드의 합계
countcount(list)리스트의 항목 수
avgavg(list, field)리스트에서 필드의 평균

타입

FunctionSignatureDescription
toStringtoString(value)문자열로 변환
toNumbertoNumber(value)숫자로 변환
isNullisNull(value)값이 null인지 확인
coalescecoalesce(a, b)null이 아닌 첫 번째 값 반환

조건

FunctionSignatureDescription
ifif(condition, thenValue, elseValue)조건부 표현식

표현식 예시

총액의 10% 계산:

reservation.totalPrice * 0.1

조건부 표시 텍스트:

if(order.status == "pending", "Waiting for confirmation", "Processed")

기간(일수) 계산:

diffDays(reservation.endDate, reservation.startDate)

비즈니스 규칙 검사:

reservation.depositAmount <= reservation.totalPrice && reservation.totalPrice > 0

요약 문자열 포맷:

concat("Order #", toString(order.id), " - ", toUpperCase(order.status))

제약 사항

Value DSL은 안전성과 예측 가능성을 위해 의도적으로 제한되어 있습니다:

ConstraintLimit
함수 정의 불가사용자 정의 함수를 정의할 수 없습니다
반복문/재귀 불가반복(iteration)은 지원되지 않습니다
변수 변이 불가모든 표현식은 순수하며, 할당이 없습니다
외부 호출 불가API나 서비스를 호출할 수 없습니다
시스템 호출 불가파일 시스템, 네트워크, OS에 접근할 수 없습니다
최대 표현식 깊이256단계 중첩
최대 AST 노드 수표현식당 1000개 노드

이러한 제약은 모든 Value DSL 표현식이 부작용 없이 제한된 시간 내에 종료되도록 보장하여, 런타임을 완전히 결정론적으로 만듭니다.