대용량 파일 업로드 에러 해결: 고화질 사진이 등록되지 않던 이유 🚀

동재·2024년 7월 30일

Delgo

목록 보기
2/3
post-thumbnail

안녕하세요, 백엔드 개발자 이동재입니다.😄

이번에 사이드 프로젝트를 진행하면서 인증 등록 서비스에서 예상치 못한 파일 업로드 문제를 경험했습니다. 오늘은 해당 문제를 해결하기 위해 진행한 단계별 과정을 기록하고자 합니다.


🔥문제 발생과 초기 대응

1. 이슈 전달

인증 등록 기능 QA 중 특정 상황에서 에러가 발생한다는 점이 확인되어 저에게 이슈가 전달되었습니다.

2. 테스트 진행 및 이슈 해결

과거에 Multipart 파일 크기 이슈로 사진 파일이 올라오지 않았던 경험이 있어, Spring Boot에서 Multipart 옵션을 추가하고 이슈 처리되었다고 전달했습니다.

 spring: 
  servlet:
    multipart:
      maxFileSize: 50MB
      maxRequestSize: 55MB

3. 이슈 재발생

디자이너가 테스트하던 중 동일한 이슈가 발생했습니다.

4. 로그 확인

Tomcat에서 관련 로그를 확인했으나 에러 로그가 나타나지 않았습니다.

5. 클라이언트 문제라고 판단

따라서 클라이언트 에러라고 판단하고 프론트 개발자에게 전달했습니다.
그러나 프론트 개발자로부터 문제없다는 피드백을 받았습니다.

6. 재요청 및 안드로이드 의심

재확인을 요청했지만, 문제없다고 다시 피드백이 왔습니다. 그래서 웹앱이기 때문에 웹브라우저 테스트로는 알 수 없는 안드로이드 단에서의 이슈가 있는지 의심했습니다. 🤔

7. 안드로이드 로그 확인

안드로이드에서 콘솔 로그를 볼 수 있는 라이브러리(vConsole)를 삽입했습니다. 그리고 로그 상 문제가 없음을 확인했습니다. ✅

8. 서버 로그 의심

AOP로 REST 요청을 로깅하도록 설정해두었기 때문에 Tomcat에서 아무런 로그가 뜨지 않는다는 점이 이상하다는 것을 이제야 깨닫습니다.

9. WAS(Tomcat) 요청 확인

클라이언트 요청이 WAS(Tomcat)에 들어오는지 access_log 파일을 체크했으나, 들어오지 않았습니다. 🚫

10. 웹 서버(Nginx) 확인

웹 서버(Nginx)에 요청이 들어오는지 체크한 결과, 요청이 들어오고 에러가 발생함을 확인했습니다.


🛠️ 문제 원인 분석

웹 서버(Nginx)에 문제가 있다는 건 확인했고, 문제의 원인을 알기 위해, 파일 크기와 연관된 Nginx 설정을 확인했습니다.

Nginx는 프록시 서버로서 클라이언트의 요청을 받아 Spring Boot 애플리케이션으로 전달하는 역할을 합니다.

여기서 client_max_body_size 설정이 문제의 원인일 수 있다는 생각이 들었습니다. 기본적으로 Nginx는 요청 본문의 크기를 1MB로 제한합니다.

고화질 사진의 경우 3 ~ 5MB인 경우가 많기에 Nginx의 max_body_size를 초과해 해당 파일이 업로드되지 않았던 것입니다.

또한, Tomcat에서 에러 로그가 나타나지 않았던 이유는 Nginx가 파일 크기 제한을 초과한 요청을 애플리케이션 서버로 전달하기 전에 차단했기 때문입니다.

따라서 Tomcat은 이 요청을 처리할 기회가 없었고, 로그에도 아무런 기록이 남지 않았습니다.

🔧해결 방법

문제를 해결하기 위해 Nginx 설정 파일을 수정했습니다. nginx.conf 파일에 다음 설정을 추가했습니다:

인증 등록 API에서 최대 5장의 사진을 업로드할 수 있으며, 각 사진의 최대 크기를 테스트를 통해 5MB로 가정했습니다. 따라서 여유분 5MB를 추가하여 client_max_body_size를 35MB로 설정했습니다.

http {
    ...
    client_max_body_size 35M;
    ...
}

이 설정을 적용한 후 Nginx를 재시작했습니다.

이후 테스트를 통해 고화질의 사진 파일도 정상적으로 업로드가 되는 걸 확인했습니다.

결론

이 경험을 통해 배운 점은 다음과 같습니다:

1. 문제의 원인을 다각도로 분석하고 접근해야 한다는 것. 🔍
2. 애플리케이션과 서버 설정 간의 상호작용을 이해하는 것이 중요하다는 것.
3. 단순 테스트 이후, 이슈 완료라고 성급히 판단하면 안된다는 것.🔥

Nginx의 기본 client_max_body_size 설정이 1MB로 되어 있음을 기억하고, 필요에 따라 이를 조정하는 것이 중요합니다. 이 글이 유사한 문제를 겪는 분들께 도움이 되길 바랍니다.

긴 글 읽어주셔서 감사합니다.😄

profile
Backend Developer

0개의 댓글