

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AND/OR 로직
<a name="and-or-logic"></a>

필터 정책에서 AND/OR 로직을 사용하여 Amazon SNS의 메시지 속성 또는 본문 속성을 일치시킵니다. 이를 통해 보다 정확하고 유연한 메시지 필터링이 가능합니다.

## AND 로직
<a name="and-logic"></a>

여러 속성 이름을 사용하여 AND 로직을 적용할 수 있습니다.

다음 정책을 살펴보겠습니다.

```
{
  "customer_interests": ["rugby"],
  "price_usd": [{"numeric": [">", 100]}]
}
```

이 속성은 `rugby`로 설정된 `customer_interests` 값 *그리고* 100을 초과하는 값으로 설정된 `price_usd` 값을 갖는 모든 메시지 속성 또는 메시지 본문 속성과 일치합니다.

**참고**  
동일한 속성의 값에는 AND 로직을 적용할 수 없습니다.

## OR 로직
<a name="or-logic"></a>

속성 이름에 여러 값을 할당하여 OR 로직을 적용할 수 있습니다.

다음 정책을 살펴보겠습니다.

```
{
   "customer_interests": ["rugby", "football", "baseball"]
}
```

이 속성은 `customer_interests` 값이 `rugby`, `football` *또는* `baseball`로 설정된 모든 메시지 속성 또는 메시지 본문 속성과 일치합니다.

## OR 연산자
<a name="or-operator"></a>

`"$or"` 연산자를 사용해 필터 정책을 명시적으로 정의하여 정책에 있는 여러 속성 간의 OR 관계를 표현할 수 있습니다.

Amazon SNS는 정책이 다음 조건을 모두 충족하는 경우에만 `"$or"` 관계를 인식합니다. 이러한 조건이 모두 충족되지 않으면 `"$or"`은 정책의 다른 문자열과 마찬가지로 일반 속성 이름으로 처리됩니다.
+ 규칙에 `"$or"` 필드 속성이 있고 그 뒤에 배열이 있습니다(예: `“$or” : []`).
+ `"$or"` 배열에 최소 두 개의 객체가 있습니다. `"$or": [{}, {}]` 
+ `"$or"` 배열의 모든 객체에 예약된 키워드인 필드 이름이 없습니다.

그렇지 않으면 `"$or"`는 정책의 다른 문자열과 마찬가지로 일반 속성 이름으로 처리됩니다.

숫자와 접두사는 예약된 키워드이므로 다음 정책은 OR 관계로 구문 분석되지 않습니다.

```
{ 
   "$or": [ {"numeric" : 123}, {"prefix": "abc"} ] 
}
```

**`OR` 연산자 예제**

표준 `OR`:

```
{
  "source": [ "aws.cloudwatch" ], 
  "$or": [
    { "metricName": [ "CPUUtilization" ] },
    { "namespace": [ "AWS/EC2" ] }
  ] 
}
```

이 정책의 필터 로직은 다음과 같습니다.

```
"source" && ("metricName" || "namespace")
```

이는 다음 메시지 속성 중 하나와 일치합니다.

```
"source": {"Type": "String", "Value": "aws.cloudwatch"},
"metricName": {"Type": "String", "Value": "CPUUtilization"}
```

또는

```
"source": {"Type": "String", "Value": "aws.cloudwatch"},
"namespace": {"Type": "String", "Value": "AWS/EC2"}
```

이 속성은 다음 메시지 본문 중 하나와도 일치합니다.

```
{
    "source": "aws.cloudwatch",
    "metricName": "CPUUtilization"
}
```

또는

```
{
    "source": "aws.cloudwatch",
    "namespace": "AWS/EC2"
}
```

### `OR` 관계를 포함하는 정책 제약 조건
<a name="or-operator-constraints"></a>

다음 정책을 살펴보겠습니다.

```
{
    "source": [ "aws.cloudwatch" ],
    "$or": [
      { "metricName": [ "CPUUtilization", "ReadLatency" ] },
      {
        "metricType": [ "MetricType" ] ,
        "$or" : [
          { "metricId": [ 1234, 4321 ] },
          { "spaceId": [ 1000, 2000, 3000 ] }
        ]
      }
    ]
  }
```

이 정책의 로직을 다음과 같이 단순화할 수도 있습니다.

```
("source" AND "metricName") 
OR 
("source" AND "metricType" AND "metricId") 
OR 
("source" AND "metricType" AND "spaceId")
```

OR 관계가 있는 정책의 복잡성 계산은 각 OR 문에 대한 조합 복잡성의 합으로 단순화할 수 있습니다.

따라서 전체 조합은 다음과 같습니다.

```
(source * metricName) + (source * metricType * metricId) + (source * metricType * spaceId)
= (1 * 2) + (1 * 1 * 2) + (1 * 1 * 3) 
= 7
```

`source`에는 값이 하나, `metricName`에는 값이 두 개, `metricType`에는 값이 하나, `metricId`에는 값이 두 개, `spaceId`에는 값이 세 개 있습니다.

다음과 같은 중첩 필터 정책을 고려해 봅니다.

```
{
    "$or": [
      { "metricName": [ "CPUUtilization", "ReadLatency" ] },
      { "namespace": [ "AWS/EC2", "AWS/ES" ] }
    ],
    "detail" : {
      "scope" : [ "Service" ],
      "$or": [
        { "source": [ "aws.cloudwatch" ] },
        { "type": [ "CloudWatch Alarm State Change"] }
      ]
    }
  }
```

이 정책의 로직을 다음과 같이 단순화할 수 있습니다.

```
("metricName" AND ("detail"."scope" AND "detail"."source")
OR
("metricName" AND ("detail"."scope" AND "detail"."type")
OR
("namespace" AND ("detail"."scope" AND "detail"."source")
OR
("namespace" AND ("detail"."scope" AND "detail"."type")
```

총 조합 계산은 키의 중첩 수준을 고려해야 한다는 점을 제외하고 중첩되지 않은 정책과 동일합니다.

따라서 전체 조합은 다음과 같습니다.

```
(2 * 2 * 2) + (2 * 2 * 2) + (2 * 2 * 2) + (2 * 2 * 2) = 32
```

`metricName`에는 두 개의 값이 있고, `namespace`에는 두 개의 값이 있고, `scope`는 하나의 값이 있는 2수준 중첩 키이고, `source`는 하나의 값이 있는 2수준 중첩 키이며, `type`은 하나의 값이 있는 2수준 중첩 키입니다.