현재 MySongSpace 프로젝트에는
사용자가 트랙(본인이 작업한 음악 파일)을 업로드 하는 기능이 있습니다.
트랙 업로드 시 클라이언트를 통해 트랙의 이미지 커버 파일과 음악 파일 두 가지를 서버로 전송하는 과정에서,
고려해야 할 주요 사항과 발생 했던 문제점에 대해 이야기 보겠습니다.
문제 발생 및 고려 했던 점
1. 대용량 파일, 어디까지 허용해야 할까?
30분 이상의 음악 파일이나 매우 높은 해상도의 이미지 파일을 업로드하면 서버와 네트워크에 과도한 부하를 줄 수 있지 않을까?
- 대용량 파일은 업로드 과정에서 서버 메모리를 압박할 가능성이 높다라고 판단
- 동시 접속자가 많은 상황에서 대형 파일 업로드는 네트워크 병목 현상을 유발 할 수 있다 판단
생각했던 해결 방안
1. Chunk 기반 분할 업로드
파일을 작은 조각으로 나누어 서버로 전송해서
모든 Chunk 파일이 서버에 도착하면 이를 결합하여 원본 파일을 완성해
서버 부하를 분산 시키는 방식을 생각 해보았다.
만약에 중간에 네트워크가 끊기더라도 중단된 부분부터 업로드를 이어나 갈 수있는 장점도 있고,
대용량 파일을 전송하는데 있어 많은 장점이 있을 꺼라고 생각했다.
2. 파일 크기 제한 설정
서버와 클라이언트 모두에서 크기 제한을 적용하여 이중 보호 장치? 와 같은 방어막을 제한한다.
(즉 업로드할 수 있는 파일 크기 자체를 제한하는 방법)
서비스 품질을 유지하고 예기치 않은 오류를 방지하는 데 있어 좋은 방법이라고 생각했다.
결론적으로 이야기하면 나는 2번 방법을 선택했다.
그 이유는,
현재 개발 중인 기능은 음악 파일와 이미지 커버를 업로드하는 것을 목적으로 하고 있고,
서로의 음악을 공유하고 올리는 것이 주 목적이며 긴 영상이나 긴 음악 파일이 오고 갈 가능성이 거의 없다.
음악과 이미지 파일은 수십 MB나 긴 영상 파일 처럼 대용량 파일에 해당하지 않는다고 판단 하였다.
서비스의 목적과 사용 패턴을 고려해봤을 때 Chunk 분할 업로드는 과도한 기술적 선택 이라고 판단이 들었다.
해결 방안
해결 방법으로는 간단했다.

yml 파일에 멀티파트 요청에 대한 설정 값만 부여해주면 끝이다.
다양한 multipart 설정 값이 있다.
내가 설정한 두 개의 설정 값에 대해 알아보자면
max-file-size: 한 번에 업로드 되는 각 파일의 크기가 10MB를 초과할 수 없음을 의미한다.
(즉 이미지 파일과 음악 파일 각각 하나만 10MB 이상을 넘어도 요청이 거부된다)
max-request-size: 요청 전체의 최대 크기를 설정한다.
(즉 업로드되는 모든 파일 + 추가 데이터의 총합 크기) 제한
이 설정 값 말고도 여러 설정 값이 있지만 대표적으로 자주 사용되는 설정 값들에 대해서 이야기 해보겠습니다!
location: 업로드된 파일을 저장할 디렉토리 또는 경로를 지정할 수 있다.
기본적으로는 임시 디렉토리에 저장되지만,
서버에서 직접 지정한 경로로 업로드 파일을 저장할 수 있다.
예를 들어, 특정 경로로 파일을 저장하고 싶다면 location: /uploads와 같이 설정할 수 있다.
file-size-threshold: 업로드된 파일이 메모리에 유지될 수 있는 최대 크기를 설정한다.
이 값 이하의 파일은 메모리에서 처리되고,
이를 초과하는 파일은 디스크에 임시로 저장된다.
예를 들어, file-size-threshold: 2MB로 설정하면, 2MB 이하의 파일은 메모리에서 처리되고, 2MB 이상인 파일은 디스크에 임시로 저장된다. 이 설정을 활용하면 서버의 메모리 부담을 줄일 수 있다.
결과 및 예외 처리

위 사진 처럼 74.8MB 크기의 음악 파일을 전송 했을 때
multipart/form-data 형식의 요청을 처리하기 위해 MultipartResolver가 이러한 과정을 처리하게 되는데
이 때, 업로드되는 파일의 크기에 대해서 검증하는 과정에서
서버의 설정한 제한을 초과하면
MaxUploadSizeExceededException 예외가 발생하게 된다.

그렇다면 이러한 오류처리를 사용자에게 알려주어야 한다.

커스텀 예외처리 부분이나 에러 코드 기반 처리에 관련해서는 추후 포스팅할 예정이다!!

클라이언트가 오류를 인식하고 해결 할 수 있도록 적절한 메시지를 던져준다.
2024.11.27 - [프로젝트] - 안전한 파일 업로드에 대한 처리란 무엇일까? chapter 2
참고
'프로젝트' 카테고리의 다른 글
| 안전한 파일 업로드에 대한 처리란 무엇일까? chapter 2 (0) | 2024.11.27 |
|---|---|
| 좋아요 버튼의 숨겨진 딜레마: @Transactional과 synchronized가 함께 풀지 못한 동시성 이슈 (0) | 2024.11.26 |
| 동적 쿼리와 배치 사이즈 최적화로 1+N 문제 해결 및 성능 개선 (0) | 2024.11.23 |
| Offset 페이징에서 효율적인 대댓글 처리 방법 (0) | 2024.11.23 |
| 경광등 테스트 프로그램: 실전 프로젝트 경험 공유 (0) | 2024.01.30 |