엑셀 파일 다운로드 시 용량이 파일의 용량이 큰 경우 Timeout이 발생하였다. 근무 중인 회사의 엑셀 파일에는 단순 텍스트 뿐만 아니라 엑셀 안에 이미지 삽입을 동시에 하는 경우가 있어 오래 걸릴 수 밖에 없는 상황이다.
물론 그 전에 엑셀 다운로드 로직 최적화를 해서 속도를 개선하였고, 절대적인 크기를 줄일 순 없는 상태이다.
아무튼, 처음에는 Timeout 에러가 발생할 만한 부분을 찾기 위해 원인을 생각해 보았다.
- 엑셀 다운로드 로직 자체가 오래 걸려 통신이 끊겼다.
- Spring 설정 중 Timeout 설정이 너무 짧게 되어 있다.
이렇게 2가지 원인을 추측하였고, 엑셀 다운로드 로직을 한줄 씩 디버깅을 하면서 오래 걸리는 부분을 찾아보았다. 하지만 아무리 찾아봐도 로직에는 문제가 없었다.
Config 설정이 잘못되어 있을까봐 생각하여 운영 환경의 yml파일을 뒤져보았다. 여기서 Tomcat의 Timeout 설정이 되어있지 않은 것을 발견하였다.
server:
tomcat:
connection-timeout: 600000(기본 값)
위 설정을 넣은 뒤 운영서버에 반영하고 테스트를 해보았지만 해결되지 않았고, 2시간을 삽질하던 중 차이점을 찾게 되었다.
테스트 도중 같은 크기의 파일이 개발서버에서는 정상적으로 다운로드 되는데 운영서버에서만 되지 않는 것이었다. 또한, 개발자 도구에서 몇 초 정도에 끊기는지 봤는데 60s에서 Timeout이 발생하였다.
로직의 문제가 아니라 AWS 서버 설정에 문제가 있을 수도 있지 않을까??
이 생각을 하게 된 이유는 로직문제도 아니고, Spring 설정문제도 아니면 어디선가 통신을 강제로 끊었기 때문에 발생했고 강제로 끊을 만한 곳은 AWS 밖에 없다고 생각했다.
본인은 운영 환경 관련 업무는 맡고 있지 않지만 S3에 파일 업로드 테스트 때문에 계정을 받은 적이 있어 로그인을 하였다.
물론..AWS가 익숙하지 않고, 함부로 건드릴 수 없기 때문에 EC2를 하나씩 조회했다. 그러던 중, Connection idle timeout 이라는 옵션을 발견하였다. 그리고 해당 옵션에 관해 구글링을 하였다.
AWS Load Balancer의 Connection Idle Timeout은 클라이언트와 로드 밸런서 사이의 연결이 유휴 상태로 유지되는 시간을 나타냅니다. 이 시간이 지나면 로드 밸런서는 해당 연결을 종료합니다. 일반적으로 이 값은 로드 밸런서의 설정에서 조정할 수 있습니다.
그리고 본인 회사의 Connection idle timeout 설정은 60s로 되어있었다.
빙고..아까 화면단에서 60s가 넘어갈 경우 끊겼고 이 설정이 60s로 되어 있으니 이 문제가 맞는 것 같다고 생각했다.
이 내용을 보고 설정 문제라고 90%는 확신한 상태에서 CTO님께 위 설정때문에 통신이 끊기는 것 같다고 말하였다. 이런 생각을 하게 된 이유를 위와 같이 말씀드리고 현재는 60초로 되어있는 것을 120초 정도로 테스트로 늘려달라고 요청하였다.
설정 후 테스트 결과는............대성공!!!!
그렇다 로직의 문제도 아니고, 스프링 설정 문제도 아닌 서버 설정문제였다.
마지막으로 CTO님께서 5분으로 설정을 해주시고, Spring 설정도 동일하게 5분으로 하였다.
server:
tomcat:
connection-timeout: 300000
대부분의 경우는 API 로직 문제로 인하여 오류가 발생하였지만 이 문제처럼 다른 부분이 원인일 수 있고, 이를 해결해본 좋은 경험이었다.