개발을 하던 중 서버에 파일을 다운로드를 해야 하는 상황이 생겼다.
방법에 대해 생각해보았는데 지금까지 파일을 관리할 때 해오던 방식은 파일을 저장하는 곳이 AWS s3 이기 때문에 aws-sdk를 사용해서 파일을 관리해왔었다.
하지만 혹시라도 s3외의 파일들을 다운로드해야 된다면? 파일에 대한 링크만 존재할 뿐이라면?
그렇기에 찾아봤다. 바로 axios.get
이 두 가지를 비교해 보겠다.
사용법 (예시이지 정답은 아닙니다.)
AWS-sdk (S3 getobject)
const s3 = new AWS.S3();
const params = {
Bucket: 'bucket명',
Key: '객체 명',
};
s3.getObject(params, (err, data) => {
if (err) {
console.log(err);
} else {
fs.writeFileSync(${파일 경로} + ${파일 명}, ${파일 buffer 데이터});
}
});
axios.get
await axios.get(dataObj, { responseType: 'arraybuffer' }).then(res => {
const buffer = Buffer.from(res.data, 'binary');
writeFileSync(${파일 경로} + ${파일 명}, buffer);
});
처음 생각으로는 s3 getObject의 경우에는 aws 내부에 있는 s3에 직접 접속하여 가져오는 거고 axios는 HTTP 클라이언트 라이브러리로 호출이기 때문에 당연히 axios가 빠를 줄 알았다. (s3 getObject는 한번 거쳐가니까?) 또한 해당 서버는 ec2에 배포된 서버가 아니었다.
테스트 결과
일단 테스트의 경우
1. 단일 파일 하나
2. 폴더 내부 반복문으로 여러 파일 (list)
3. 파일은 jepg, png
이렇게 진행하였다.
거의 10배에서 많게는 20배 차이가 났다. 그렇다면 왜 이렇게 차이가 나게 되었을까?
1. 네트워크
결국 Axios는 HTTP요청을 생성부터 시작하여 응답을 처리하는데 까지 걸리는 시간을 모두 포함하였기 때문에 클라이언트 간의 거리, 네트워크 차이 등 여러 요인이 작용할 수가 있다. 반면 s3 getObject의 경우 AWS S3와 직접 통신을 하기 때문에 네트워크 지연이 상대적으로 적을 수가 있었다.
2. 캐싱 ( AWS 최적화 )
AWS의 서비스 간의 통신에서는 최적화가 제공되기 때문에 AWS S3에서 자주 접근하는 객체는 AWS 내부에서 캐싱이 되어 제공되어진다.
3. 물리적인 데이터 센터의 위치
AWS s3 버킷과 애플리케이션 서버가 같은 리전에 위치하고 있다면, 훨씬 더 빠른 속도로 가져올 수도 있다.
결론
물론 위의 이유들에 불구하고 axios가 더 빠를 수도 있다. 이러한 부분들은 직접 속도를 비교하면서 테스트를 해가며 애플리케이션의 최적화가 필요할 것 같다. 또한 여러 콘퍼런스에서 들은 것과 같이 aws 내부의 최적화가 정말 잘 되어 있는 것 같다. 지금과 같이 데이터를 가져오는 경우가 해외에 존재하는 버킷이라도 aws 내부의 cdn이나 vpc peering을 통하면 axios보다 더 빠른 환경이 구축되지 않을까 싶다.
'AWS' 카테고리의 다른 글
NAT Gateway란? (0) | 2023.06.27 |
---|---|
Network ACL vs 보안그룹 (0) | 2023.06.20 |
Pre-signed url (0) | 2023.06.12 |
AWS SES (with aws-sdk) (0) | 2023.05.23 |