회사에서 개발한 앱들에는 MMS 문자 전송 기능이 있는데 앱에서 SMS를 보내는 경우에는 약간의 코드로 전송이 가능하지만 MMS를 전송하려면 라이브러리를 사용 해야 했다. 그래서 MMS 라이브러리를 제공 하는 업체를 통해 문자 전송 기능을 구현 하여 사용 중이였으나, 라이브러리 자체가 오래된 Java 코드로 만들어져 있기도 하고 문제가 생겨도 해당 업체에 담당자 및 코드가 없어졌다는 이유로 수정도 안 되는 상황이였다. 회사에서는 이런 상황을 대처하기 위해 외주 개발자를 통해 MMS 라이브러리 제작을 했고 내가 입사한 후 얼마 지나지 않아 라이브러리가 완성 되어 테스트를 하는 단계에 왔다.
MMS 라이브러리 내부에는 통신사 API를 사용하여 문자 전송을 하는 기능이 있는데 Usim 정보를 통해 어느 통신사를 사용 하는지 확인 후 해당 통신사에 맞는 MMS 전송 API를 호출 한다. 테스트 결과 단 건의 경우 문제가 없었으나 복수 건을 전송 하는 경우에 tooManyRequestException이 발생하며 앱이 종료 되는 문제가 발생 했다. 해당 문제를 MMS 라이브러리을 제작한 외주 개발자에게 전달한 후 문제 해결을 위해 여러 시도를 했으나 해결 되지 않았고 결국 해결이 어려울거 같다는 대답이 돌아와 직접 수정하기 위해 라이브러리 코드를 확인 했다.
MMS 복수 건 전송 시 tooManyRequestException 발생
라이브러리 내부 코드를 확인 하던 중 문자의 내용을 지정 하는 함수 안에 addToAddress() 라는 함수가 있었고 이 함수에서 수신자 번호를 설정 하고 있었다 내부 코드를 확인해 보니 수신자 번호를 Vector에 수신자 번호를 add 하고 있었고 해당 부분을 수정 하여 복수 건의 수신자 번호를 한번에 추가 하여 1회 전송 시 일괄전송 되도록 수정한 후 테스트 했다
수정 후 테스트를 해보니 tooManyRequestException은 발생 하지 않으나 통신사 별로 요청한 수 만큼 전송이 되지 않는 경우가 있었고 더 큰 문제는 문자 내용을 각각 설정할 방법이 없어서 첫번째 방법은 실패 했다
tooManyRequestException 이라는게 결국 짧은 시간 내에 많은 요청을 보냄으로써 생기는 문제이니 delay를 설정하며 API 호출 주기를 늘린 후 테스트 했다
딜레이 없이 보낼 때 보다는 잘 전송 되기는 하다 tooManyRequestException은 여전히 발생 했다
기존의 코드를 보면 만약 50건의 문자 전송을 한다면 내부적으로는 connection을 50번 생성 후 disconnection을 하는 구조로 되어 있었다 이게 문제의 원인인지는 정확히 알기 어려웠으나 일단 connection이 null일 때 초기화 한 후 마지막 수신자에게 전송 후 disconnection이 되도록 코드를 수정 후 테스트 했다
같은 문제가 발생 됐다
MMS 라이브러리에서 문자 전송을 위한 네트워크 연결 시 ConnectivityManager.NetworkCallback() 을 통해 사용 가능 여부를 Callback으로 받는데 이 부분도 connection 과 마찬가지로 50건을 전송한다면 50번 Callback이 생성 되고 있었다 복수 건에도 1번만 생성하도록 수정을 한 후 테스트 했다
드디어 tooManyRequestException 문제가 해결 됐다 이전 시도에서도 문제가 해결된듯 보이다가 발생 되는 경우가 많아서 여러 번 테스트를 했고 테스트 도중 unregisterNetworkCallback() 코드가 없다는 걸 발견 해서 1번만 생성하도록 수정한 부분을 다시 원래대로 돌리고 전송 시 마다 생성하고 unregisterNetworkCallback로 Callback을 해제하도록 변경 했다
더이상 tooManyRequestException 문제는 일어나지 않았다