타기팅은 누가 어떤 변형을 받을지 정합니다. 평가할 때마다 컨텍스트를 넘기면 규칙이 그 속성과 비교합니다.
평가 컨텍스트
context.ts
const ctx = {
user: {
id: "u_42", // required, used for stable bucketing
email: "mia@acme.dev",
plan: "pro",
country: "KR",
createdAt: "2026-03-14",
},
device: { os: "ios", appVersion: "5.2.0" },
};어떤 속성이든 타기팅할 수 있습니다. 중첩 객체는 device.appVersion처럼 점으로 지정합니다.
규칙
규칙은 조건 목록(모두 일치해야 함)과 결과(변형 하나 또는 비율 출시)로 이뤄집니다.
rule.json
{
"description": "Pro users in Korea",
"conditions": [
{ "attribute": "user.plan", "op": "in", "values": ["pro", "team"] },
{ "attribute": "user.country", "op": "eq", "values": ["KR"] },
{ "attribute": "device.appVersion", "op": "semver_gte", "values": ["5.0.0"] }
],
"serve": { "variation": "on" }
}연산자
eq,neq,in,not_in: 정확히 일치contains,starts_with,ends_with,matches(정규식): 문자열gt,gte,lt,lte: 숫자와 ISO 날짜semver_eq,semver_gte,semver_lt: 버전 문자열in_segment: 저장된 세그먼트 소속 여부
세그먼트
세그먼트는 재사용하는 규칙입니다. 예를 들어 “베타 테스터”, “사내 직원”, “엔터프라이즈 고객”처럼 만들어 두고, 세그먼트를 한 번 고치면 이를 쓰는 모든 플래그에 반영됩니다.
비율 출시
규칙 결과로 변형 하나 대신 트래픽 비율을 나눌 수 있습니다. Shoal은 flagKey + user.id를 해시하므로 같은 사용자는 서버나 세션이 달라도 항상 같은 구간에 들어갑니다.