Show HN: 예시로 보는 CEL

발행: (2026년 2월 18일 오후 11:05 GMT+9)
3 분 소요

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)
0 조회
Back to Blog

관련 글

더 보기 »

EDuke32 – Duke Nukem 3D (오픈소스)

이제는 거침없이 행동하고 버블껌을 씹을 시간이며, 나는 껌이 다 떨어졌다! !Polymer renderer screenshot/images/shots/polymer2.jpg 픽셀당 동적 조명 및 실시간 그림자...