실세계 모양 모델링하기 위한 schema 조합
allOf — 교집합
주어진 값이 모든 sub-schema 를 다 통과해야 해. 상속처럼 쌓아 올릴 때 써. 'Base 이면서 이 필드들도 더 갖는다' 같은 거지.
anyOf — 합집합 (최소 하나)
sub-schema 중 하나만 통과해도 돼. 경계가 느슨한 합집합에 써. 'string 이거나 number', '이 여러 모양 중 아무거나' 같은 경우야.
oneOf — 배타적 합집합 (정확히 하나)
딱 하나의 sub-schema 에만 맞아야 해. tagged union 이 여기 딱이야. '신용카드 정보가 든 결제이거나 계좌이체 정보가 든 결제이거나, 둘 다는 아니고' 처럼.
not — 부정
이 sub-schema 에 맞으면 안 된다는 뜻이야. 되도록 아껴 써. not 이 뱉는 에러 메시지가 모호하기로 악명 높거든. 가능하면 '아니어야 한다' 대신 '이러이러해야 한다' 로 뒤집어 써.
Tagged-union 패턴: 모양이 여럿인 데이터 ('N 가지 중 하나') 는
const 로 고정한 구분 필드 (kind, type) 를 넣고 oneOf 로 묶는 게 좋아. 그래야 validator 가 어느 하나에 걸렸을 때 에러 메시지가 또렷하게 나와. anyOf 로 두면 사용자가 어느 쪽을 의도했는지 validator 도 모르고, 그래서 에러도 흐릿해져.