🍂

FTP 서버 연결이 끊기는 현상

데이터를 보내는 전송하는 방식 중 하나로 FTP 서버를 활용한다. 단순히 파일을 주고 받는 서버로 개발자라면 누구나 한번 즈음은 사용해봤을 것이다. 대학 강의에서 사용했던 기억이 있는데 요즘에는 잘 모르겠다.

파일 업로드 시 예외 발생

평소에 잘 동작했던 파일 업로드 배치 작업이 실패했다. 두 번, 세 번 실패하다가 성공을 하거나 계속 실패했다. 원인을 찾기 위해서 로그를 찾아봐도 명확하지 않았다. FTP 서버에 파일을 업로드 하기 전에 작업할 디렉토리로 가는 로직이 있는데, 이 부분에 예외가 발생했다. 파일을 업로드하지 않았음에도 불구하고 예외가 발생해서 원인을 파악하기 어려웠다.

Idle 상태의 연결

에러 로그로 명확하게 원인을 찾을 수 없어서 팀원들과 코드를 분석하기 시작했다. 그러던 중 연결을 맺고 너무 업로드까지의 시간이 너무 오래 걸리는 것이 문제의 원인이 아닐까라는 강한 추측이 제기되었다. 업로드 흐름을 보면 다음과 같다.

  1. FTP 서버와 연결을 맺는다.
  2. S3에 저장한 다수의 파일을 가져온다.
  3. 가져온 다수의 파일을 하나의 큰 파일로 합친다.
  4. 합친 파일을 FTP 서버로 업로드한다.

2번과 3번 단계에서 파일의 데이터가 커서 작업 시간이 오래 걸린다면 1번에서의 FTP 서버와의 연결이 idle 상태로 남아 있는다. FTP 서버가 이 idle 상태의 연결을 끊었기 때문에 애플리케이션이 4번 작업을 진행할 수 없다. 그 동안 이 흐름에서 문제가 발생하지 않았던 이유는 간단하다. 파일의 데이터가 작았기 때문이다. 데이터가 확장되면서 이 흐름에 결함이 발생한 것이다.

업로드 시 FTP 서버 연결하기

이 문제를 해결하기 위해서는 실제 파일을 업로드 하기 전에 FTP 서버와 연결을 하도록 하는 것이다.

  1. S3에 저장한 다수의 파일을 가져온다.
  2. 가져온 다수의 파일을 하나의 파일로 합친다.
  3. FTP 서버와 연결을 맺는다.
  4. 합친 파일을 FTP 서버로 업로드한다.

이전 흐름에서 1번 단계를 4번 단계 전으로 바꾸는 것만으로도 이 문제를 손쉽게 해결할 수 있었다.

사실 문제가 없었다면 이 개선 작업은 이뤄지지 않았을 것이다. 사실 많은 부분에서 이와 비슷한 문제를 가진 코드가 존재한다. 항상 최고로 좋은 코드를 작성할 수 없지만, 최선을 다하여 좋은 코드를 지향해야 한다. 그러나 가끔은 이 마음가짐과 다른 작업 결과가 보여 아쉬울 때가 많다. 다시 한번 영화 한 장면에서 나왔던 대사를 떠오른다.

문제 삼지 않으면 문제가 안되는데 문제를 삼으면 문제가 된다고 그랬어요