본문 바로가기

개발/SpringBoot

S3 presigned Url 적용을 통한 영상 업로드 성능 향상

서론


숏츠 업로드 플랫폼을 개발하던 중, 업로드 기능의 성능을 테스트 해 보았습니다.

 

20MB 데이터를 가진 업로드 요청에 평균적으로 1초가 소요되었기 때문에, 동시 요청이 발생하면 가용 가능한 스레드가 존재하지 않아 에러가 발생할 것으로 예상했습니다.

 

 

 

테스트 (presigned URL 적용 전)


 

초기 서비스 대상은 교내 학생들이었기 때문에, 숏츠 업로드 API의 동시 요청을 10명으로 잡고 테스트했습니다.

 

 

초당 트랜잭션 처리량은 9.1 이었고, MTT는 979ms로 측정되었습니다.

 

눈여겨 봐야할 부분은 Errors 인데, 694개의 요청에 대해 201개로 34.5%의 에러 발생률을 기록했습니다.

 

 

10명이 동시에 비디오 업로드 API를 호출하면 최소 세명 이상은 에러를 반환받는다는 것 이기 때문에 성능 개선이 시급했습니다. 

 

 

 

성능 개선


영상 업로드 로직은 아래와 같습니다.

 

 

영상 전달 과정이 사용자 -> 서버 -> S3로 저장됩니다. 

 

이 때, 서버에서 영상을 받아오고, 해당 영상을 다시 S3로 저장하는 과정은 서버 자원을 많이 소모하는 작업입니다. 

 

이를 개선하기 위해 사용자 -> 서버 -> S3의 플로우를 사용자 -> S3로 전송하는 방식을 고민하던 중, AWS S3의 presigned URL에 대해 알게되어 이를 적용했습니다.

 

 

 

S3 PresignedURL


AWS S3의 presigned URL(서명된 URL)은 사용자에게 S3 버킷의 특정 객체에 대한 임시 액세스 권한을 부여하기 위해 생성되는 URL입니다.

 

이 URL은 생성할 때 지정한 기간 동안 유효하며, 만료되면 더 이상 사용할 수 없습니다.

 

Presigned URL은 객체를 업로드, 다운로드 또는 삭제하는 데 사용할 수 있으며, 보안이 중요한 애플리케이션에서 권한 있는 사용자만 S3 리소스에 접근할 수 있도록 합니다.

 

Presigned URL을 적용한 로직은 아래와 같습니다.

 

서버에서 presigned URL만 발급해주면 클라이언트 측에서 해당 URL을 토대로 S3에 직접 전송을 요청합니다.

 

이렇게 되면 서버 측에서 영상 데이터를 받아와 처리하는 작업이 사라집니다.

 

 

 

테스트 (presigned URL 적용 후)


 

초당 트랜잭션 처리량이 9.1 -> 16.0으로 증가했고, MTT는 635.7ms로 감소되었습니다.

 

 

에러 발생률 또한 34.5% -> 0%로 감소했습니다.