

# 조건부 삭제를 수행하는 방법
<a name="conditional-deletes"></a>

조건부 삭제를 사용하여 객체 삭제 전에 객체가 존재하는지 또는 변경되지 않았는지 여부를 평가할 수 있습니다. S3 범용 및 디렉터리 버킷에서 `DeleteObject` 또는 `DeleteObjects` API 작업을 사용하여 조건부 삭제를 수행할 수 있습니다. 조건부 삭제 요청을 할 때 사전 조건 값 `*`가 포함된 `HTTP If-Match` 헤더를 사용하여 객체가 존재하는지 여부를 확인하거나, 제공된 `ETag`가 포함된 `If-Match` 헤더를 사용하여 객체가 수정되었는지 여부를 확인할 수 있습니다.

S3 버킷 또는 Identity and Access Management(IAM) 정책을 사용하여 범용 버킷 수준에서 조건부 삭제를 적용할 수 있습니다. 자세한 내용은 [Amazon S3 버킷에 조건부 삭제 강제 적용](conditional-delete-enforce.md) 섹션을 참조하세요.

**참고**  
조건부 삭제 평가는 객체의 현재 버전에만 적용됩니다.

**Topics**
+ [객체 삭제 전에 객체가 수정되었는지 여부를 확인하는 방법](#conditional-deletes-etags)
+ [객체 삭제 전에 객체가 존재하는지 여부를 확인하는 방법](#conditional-delete)
+ [Amazon S3 버킷에 조건부 삭제 강제 적용](conditional-delete-enforce.md)

## 객체 삭제 전에 객체가 수정되었는지 여부를 확인하는 방법
<a name="conditional-deletes-etags"></a>

 조건부 삭제를 사용하면 실수로 객체가 삭제되지 않도록 애플리케이션을 보호할 수 있습니다. `HTTP If-Match`헤더를 `ETag` 값과 함께 사용하여 객체가 수정되었는지 여부를 확인할 수 있습니다. S3 버킷에 있는 객체의 `ETag` 값이 삭제 작업 중에 제공한 `ETag`와 일치하지 않으면 작업이 실패합니다. `DeleteObjects` 작업을 사용하여 여러 객체를 조건부로 삭제하려면 XML 요청 본문에 있는 객체의 `ETag` 요소에 `ETag` 값을 제공해야 합니다. 자세한 내용은 [Content-MD5 및 ETag를 사용하여 업로드된 객체 확인](checking-object-integrity-upload.md#checking-object-integrity-etag-and-md5) 섹션을 참조하세요.

**참고**  
`ETag`값이 포함된 `If-Match` 헤더로 조건부 삭제를 수행하려면 `s3:DeleteObject` 및 `s3:GetObject` 권한이 있어야 합니다.

`ETag` 값이 포함된 `If-Match` 헤더는 버킷의 기존 객체와 비교하여 평가합니다. 동일한 키 이름 및 일치하는 `ETag`를 가진 기존 객체가 있는 경우 `DeleteObject` 요청이 성공하고 `204 No content` 응답을 반환합니다. `ETag`가 일치하지 않으면 `412 Precondition Failed` 응답과 함께 삭제 작업이 실패합니다. `DeleteObjects` 작업을 사용하여 여러 객체를 조건부로 삭제하려면 XML 요청 본문의 객체에 있는 `ETag` 요소에 `ETag` 값을 제공할 수 있습니다. 요청이 성공하면 `DeleteObjects` 작업은 `200 OK`로 응답하고 응답 본문에 있는 각 객체의 상태를 제공합니다. 사전 조건이 성공하면 해당 객체에 대한 응답이 응답 본문의 `<Deleted>` 요소에 캡처됩니다. 사전 조건이 실패하면 해당 객체에 대한 응답이 응답 본문의 `<Error>` 요소에 캡처됩니다.

 동시 요청이 발생하는 경우 해당 객체에 대한 조건부 삭제 작업이 완료되기 전에 객체에 대한 `DELETE` 또는 `PUT` 요청이 성공하면 `409 Conflict` 오류 응답을 받을 수도 있습니다. 객체에 대한 조건부 쓰기 작업이 완료되기 전에 해당 객체에 대한 동시 삭제 요청이 성공하는 경우 객체 키가 더 이상 존재하지 않으므로 `404 Not Found` 응답이 반환됩니다.

`ETag` 값이 포함된 `If-Match` 헤더를 다음 API와 함께 사용할 수 있습니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html)

### AWS CLI 사용
<a name="conditional-deletes-deleteobject-CLI-etags"></a>

다음 `delete-object` 예제 명령은 제공된 ETag 값 `6805f2cfc46c0f04559748bb039d69al`을 사용해 조건부 쓰기를 수행하려고 시도합니다.

```
aws s3api delete-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --if-match "6805f2cfc46c0f04559748bb039d69al"       
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html) 섹션을 참조하십시오.

다음 `delete-objects` 예제 명령은 제공된 ETag 값 `6805f2cfc46c0f04559748bb039d69al`을 사용해 조건부 쓰기를 수행하려고 시도합니다.

```
aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "6805f2cfc46c0f04559748bb039d69al"}]}' 
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html) 섹션을 참조하십시오.

AWS CLI에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS Command Line Interface란 무엇입니까?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 참조하세요.

## 객체 삭제 전에 객체가 존재하는지 여부를 확인하는 방법
<a name="conditional-delete"></a>

 `*` 값이 포함된 `If-Match` 헤더를 사용하여 객체 삭제 전에 객체가 존재하는지 여부를 확인할 수 있습니다. `*` 값은 객체가 수정되었는지 여부에 관계없이 객체가 존재하는 경우에만 작업을 진행해야 함을 나타냅니다.

삭제 마커는 버전이 관리되는 S3 범용 버킷에서 객체가 삭제되었음을 나타내는 특수 객체입니다. 이전 버전을 유지하면서 객체가 삭제된 것처럼 보이도록 하는 자리 표시자입니다. 따라서 `DeleteObject` API와 함께 `If-Match:*`를 사용하면 객체가 존재하는 경우에만 `204 No Content`로 작업이 성공합니다. 최신 버전의 객체가 삭제 마커인 경우 객체가 존재하지 않으며 `DeleteObject` API가 실패하고 `412 Precondition Failed` 응답을 반환합니다. 삭제 마커에 대한 자세한 내용은 [삭제 마커를 통한 작업](DeleteMarker.md) 단원을 참조하십시오.

`DeleteObjects` 작업을 사용하여 여러 객체를 조건부로 삭제하려면 XML 요청 본문의 객체에 있는 `ETag` 요소에 `*`를 제공할 수 있습니다. 사전 조건이 성공하면 `DeleteObjects` 작업은 `200 OK`로 응답하고 응답 본문에 있는 각 객체의 상태를 제공합니다. 사전 조건이 성공하면 해당 객체에 대한 응답이 응답 본문의 `<Deleted>` 요소에 캡처됩니다. 사전 조건이 실패하면 해당 객체에 대한 응답이 응답 본문의 `<Error>` 요소에 캡처됩니다. 사전 조건 중 하나를 평가할 때 객체가 존재하지 않는 경우 S3는 요청을 거부하고 `Not Found` 오류 응답을 반환합니다.

**참고**  
 `If-Match:*`를 사용하여 조건부 삭제를 수행하려면 `s3:DeleteObject` 권한이 있어야 합니다.

`*` 값이 포함된 `If-Match` 헤더를 다음 API와 함께 사용할 수 있습니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html)

### AWS CLI 사용
<a name="conditional-deleteobject-CLI-etags"></a>

다음 `delete-object` 예제 명령은 모든 ETag를 나타내는 `*` 값을 가진 키 이름 `my_images.tar.bz2`의 객체에 대해 조건부 삭제를 시도합니다.

```
aws s3api delete-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --if-match "*"
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-object.html) 섹션을 참조하십시오.

다음 `delete-objects` 예제 명령은 모든 ETag를 나타내는 `*` 값을 가진 키 이름 `my_images.tar.bz2`의 객체에 대해 조건부 삭제를 시도합니다.

```
aws s3api delete-objects --bucket amzn-s3-demo-bucket --delete '{"Objects":[{"Key":"my_images.tar.bz2", "ETag": "*"}]}' 
```

자세한 내용은 *AWS CLI 명령 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-objects.html) 섹션을 참조하십시오.

AWS CLI에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [AWS Command Line Interface란 무엇입니까?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 참조하세요.