Show HN: 예시로 보는 CEL
Source: Hacker News
Example User message
{
"name": "Alice",
"roles": ["admin", "editor", "viewer"],
"age": 30,
"email": "alice@example.com",
"created": timestamp("2025-12-14T00:00:00Z"),
"email_verified": timestamp("2025-12-14T18:30:00Z")
}
Strings and numbers
기본 비교: 사용자가 18세 이상인가요?
user.age >= 18
// result: true (bool)
문자열 함수를 사용해 사용자의 이메일 도메인을 확인합니다.
user.email.endsWith("@example.com")
// result: true (bool)
Collections
사용자가 특정 역할을 가지고 있나요? in 은 리스트 내 멤버십을 확인합니다.
"admin" in user.roles
// result: true (bool)
일치가 정확하지 않을 경우는요? exists() 는 어떤 요소가 조건을 만족하는지 테스트합니다.
user.roles.exists(r, r.startsWith("ad"))
// result: true (bool)
사용자에게 세 개의 역할이 있습니다—그 중에서 권한이 높은 역할만 원한다면? filter() 는 리스트를 조건에 맞는 요소만 남깁니다.
user.roles.filter(r, r != "viewer")
// result: ["admin", "editor"] (list)
Timestamps and durations
사용자가 가입 후 24시간 이내에 이메일을 인증했나요? CEL은 시간 을 기본적으로 처리합니다—두 타임스탬프를 빼서 기간을 얻고, 이를 비교합니다.
user.email_verified - user.created = 18 && "admin" in user.roles
// result: true (bool)
조건 연산자 를 사용하면 분기 로직을 구현할 수 있습니다.
user.age >= 18 ? "adult" : "minor"
// result: "adult" (string)
Transforming data
CEL 표현식은 모든 타입을 반환합니다. 사용자의 PII(개인 식별 정보)를 제거한 맵 을 만듭니다.
{
"roles": user.roles,
"is_adult": user.age >= 18
}
// result: {"roles": ["admin", "editor", "viewer"], "is_adult": true} (map)
각 역할에 권한이 높은지 여부를 표시합니다. map() 은 컬렉션을 새로운 형태로 변환합니다.
user.roles.map(r, {"role": r, "elevated": r != "viewer"})
// result: [{"role": "admin", "elevated": true}, {"role": "editor", "elevated": true}, {"role": "viewer", "elevated": false}] (list)
map() 은 필터링도 할 수 있습니다—권한이 높은 역할을 선택하고 한 단계에 쓰기 접근 권한을 부여합니다.
user.roles.map(r, r != "viewer", r + ":write")
// result: ["admin:write", "editor:write"] (list)