- 전체
- 명
- 오늘 찾아주신 분
- 명
listObject 나 V2 메소드를 사용하게 되면 무수히 많은 JSON 정보들과 함께 내가 사용할 값들을 가져올 수 있다. 다음의 JSON 예시는 공식 API 문서에서 가져온 내용이다.
[
'CommonPrefixes' => [
[
'Prefix' => '<string>',
],
// ...
],
'Contents' => [
[
'ChecksumAlgorithm' => ['<string>', ...],
'ETag' => '<string>',
'Key' => '<string>',
'LastModified' => <DateTime>,
'Owner' => [
'DisplayName' => '<string>',
'ID' => '<string>',
],
'Size' => <integer>,
'StorageClass' => 'STANDARD|REDUCED_REDUNDANCY|GLACIER|STANDARD_IA|ONEZONE_IA|INTELLIGENT_TIERING|DEEP_ARCHIVE|OUTPOSTS|GLACIER_IR',
],
// ...
],
'ContinuationToken' => '<string>',
'Delimiter' => '<string>',
'EncodingType' => 'url',
'IsTruncated' => true || false,
'KeyCount' => <integer>,
'MaxKeys' => <integer>,
'Name' => '<string>',
'NextContinuationToken' => '<string>',
'Prefix' => '<string>',
'StartAfter' => '<string>',
]
여기서 정작 필요한건 Contents 에 대한 내용이지만, 그 이외에 것은 정작 내가 리스트를 개발하거나 할 때 쓸모가 있는가 에 대해서는 그닥 필요하지 않는 메타데이터로 볼 수 있을 것이다. 또한, Contents 에 대한 묶음들 안에도 쓸모있는 아이들은 많이 없을 것이다.
그래서 JSON 데이터를 가져올 때 쉽게 데이터를 필터링하여 가져올 수 있는 방법에 대해 알아보도록 한다.
listObject 를 통해 파라미터를 입력하고 데이터를 가져오는데, 쿼리를 통해 처음부터 데이터를 필요한 것만 필터링 할 수 있으면 참 좋겠지만 메소드를 실행시키면 일단 데이터는 이미 AWS 에 갔다 오게 된다. 그래서 AWS 에서 받은 결과 값을 가지고 재구성을 하는 수 밖에 없다.
그 방법으로는 내가 보기에는 2가지의 방법이 있다. 하나는 원초적으로 Key 값을 통해서 for 문으로 지지고 볶고 하는 쉽게 접근하는 것이고, 다른 하나로는 JMESPath 를 사용하는 것이다. 너무 복잡한 구성을 원한다면 전자가 좋겠지만, 단순한 추출이라면 후자의 방법이 훨씬 효율적이기 때문에 후자의 방법을 알아보도록 한다.
우선 JMESPath 란, 다음의 공식 홈페이지를 참조해보도록 하자.
간략하게, JSON 데이터를 JMESPath 의 규칙에 맞게 작성을 하면 원하는 데이터를 가져올 수 있다 라는 매커니즘(?) 을 가지고 있다. 홈페이지에는 사용하는 방법에 대한 예시가 너무 잘 나와 있어서 조금만 이해하면 금방 익힐 수 있도록 되어 있다.
마침, AWS PHP SDK 는 쿼리 메소드에 대한 리턴 값이 Result 형으로 들어오게 되는데 Result 형에는 JMESPath 를 사용하여 값을 가져오는 search 메소드가 있다. 간단하게 [ 파일명. 파일 사이즈, 수정일 ] 에 대한 데이터를 가져오고 싶다면 다음과 같이 작성을 해주면 된다.
$objs = $s3->listObjectV2([
'Bucket' => ${버킷명},
]);
$objs->search("Contents[*].{name:Key, size: Size, date: LastModified}");
핵심은 "Contents[*].{name: Key, size: Size, date: LastModified}" 라고 할 수 있다. 쿼리의 내용은, Contents 의 모든 배열 값 중에서 Key, Size, LastModified 의 값을 가져와서 각각 새로운 키에 매칭을 시켜준다고 얘기를 풀어서 할 수 있을 것 같다.
특이한 점은, Object(또는 Set) 형태의 데이터를 쿼리하게 되면, 원래 가져오고자 하는 Value 의 Key 를 사용할 수 없다는 것이다. 공식문서에서도 내가 못본 것지 모르겠지만 사용할 수 없었고 새로 Key 를 매칭 시켜주어야 데이터를 뽑을 수 있었다. 그래서 파일명을 뜻하는 Key 라는 아이는 name 에 매칭을 시켜주게 된 것이다.
만약, 가져오는 목록에서 파일 데이터 만을 가져오고자 한다고 하면 다음과 같은 쿼리를 작성하면 될 것이다
$objs = $s3->listObjectV2([
'Bucket' => ${버킷명},
]);
$objs->search("Contents[?Size != '0'].{name:Key, size: Size, date: LastModified}");
이번에는 [] 안에 * 대신 ?Size != '0' 을 넣어주었다. S3 에서는 JSON 에서 폴더를 구분하는 값이 없기 때문에 Size 데이터를 통해서 어떤 것이 파일이며, 어떤것이 폴더이며 하는 구분을 할 수 있다. 하지만 이것도 확실한 구분법은 아니기 떄문에 오차가 있을 만한 상황에는 사용하지 않도록 한다.
나머지 다른 방법들은 홈페이지의 설명을 보면서 익혀보도록 하면 좀 더 편하게 데이터를 활용 할 수 있을 것이다.
[JS] window.open 에서 postMessage 와 Promise 를 이용하여 콜백 받기 (1) | 2022.10.04 |
---|---|
[Laravel/Vue.js] Vuetify 를 설치할 때 SASS 에러가 나는 경우 (0) | 2022.08.12 |
[Laravel/AWS] Laravel 에서 AWS SDK 을 이용하여 S3 에 파일 전송하기 (0) | 2022.07.27 |
[PHP/Laravel] Auth::attempt 가 안될 때... (0) | 2022.07.11 |
[Vue.js] 동적 컴포넌트에 이벤트 전달하기 (0) | 2022.05.04 |