스팀 앱 개발기 #52 - 인터넷 미연결시 API 실행하면 어떻게 될까?

시작하며...

소프트웨어를 만들 때, 잊지 말고 고려해야 하는 것이 있습니다. 그것은 바로 언제든 발생할 수 있는 예외를 처리하는 것이지요. 제가 만들고 있는 스팀 앱에서도 예외가 발생할 수 있겠지요? 가장 흔한 케이스 중 하나는 모바일 기기에 인터넷이 연결되지 않은 경우입니다. 이번 포스트에서는 인터넷 미연결시 API를 실행하면 앱이 어떻게 되는지 알아볼겠습니다.


스크린샷

안드로이드 기기의 모바일 인터넷을 끄고 지갑 화면에서 계정을 입력하고 SEARCH 버튼을 클릭해 보았습니다. 그 결과, 애래 그림과 같이 앱이 종료 됩니다.

https://cdn.steemitimages.com/DQmXqfpbPZNC1MZGwpeiTidmrdPy5ver21YxVik7NtiMyse/IMAGE 2022-10-23 22:14:08.jpg


무슨 예외인가?

그렇다면 발생한 예외의 종류가 무엇인지 알아야겠지요? Logcat에서 확인해 보았습니다. 확인된 예외는 3가지입니다.

  • UnknownHostException 예외
  • OnErrorNotImplementedException 예외
  • GaiException 예외
UnknownHostException 예외

인터넷이 끊어진 이유로 api.steemit.com 도메인의 주소를 찾지 못 합니다. 이 때문에 UnknownHostException 예외가 발생합니다. 그런데 소스의 어디에서 그게 발생했는지는 찾을 수 없네요. RxJava 라이브러리 내부에서 예외를 던진 것으로 파악됩니다.

로그의 일부를 아래와 같이 남깁니다.

2022-10-23 22:40:28.769 22147-22147/lee.dorian.steem_ui W/System.err: java.net.UnknownHostException: Unable to resolve host "api.steemit.com": No address associated with hostname
2022-10-23 22:40:28.769 22147-22147/lee.dorian.steem_ui W/System.err:     at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:156)
2022-10-23 22:40:28.770 22147-22147/lee.dorian.steem_ui W/System.err:     at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
2022-10-23 22:40:28.770 22147-22147/lee.dorian.steem_ui W/System.err:     at java.net.InetAddress.getAllByName(InetAddress.java:1152)
2022-10-23 22:40:28.770 22147-22147/lee.dorian.steem_ui W/System.err:     at okhttp3.Dns.lambda$static$0(Dns.java:39)
...
OnErrorNotImplementedException 예외

지금까지 구현한 스팀 앱에서는 API 연동시 오류 처리를 구현하지 않았습니다. 이로 인해 OnErrorNotImplementedException 예외가 발생한 것으로 보입니다. API 연동시 오류 처리를 다음에 구현해야 합니다.

참고를 위해 로그 일부를 아래와 같이 남겨 둡니다.

2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err: io.reactivex.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | java.net.UnknownHostException: Unable to resolve host "api.steemit.com": No address associated with hostname
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at io.reactivex.internal.observers.ConsumerSingleObserver.onError(ConsumerSingleObserver.java:46)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at io.reactivex.internal.operators.single.SingleDoOnSuccess$DoOnSuccess.onError(SingleDoOnSuccess.java:65)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at io.reactivex.internal.operators.single.SingleDoOnError$DoOnError.onError(SingleDoOnError.java:63)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:79)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
GaiException 예외

앞서 발생한 UnknownHostException 예외와 관계된 것으로 보입니다. 관련 로그는 아래와 같습니다.

2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err: Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at libcore.io.Linux.android_getaddrinfo(Native Method)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:133)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:222)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:133)
2022-10-23 22:40:28.771 22147-22147/lee.dorian.steem_ui W/System.err:     at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:135)

다음 액션은?

서버 API 연동시 발생할 오류(예외도 오류의 일종)를 처리하는 코드를 추가로 작성해야 합니다. 다음 포스트에서 구현할 예정입니다.


마치며...

사용자들이 좋아할만한 기능들을 빨리 뚝딱뚝딱 만들고 싶지만, 견고한 프로그램을 만들어야 합니다. 그 과정이 쉽지 않음을 개인 프로젝트를 통해서도 경험하고 있네요. 이 또한 좋은 앱을 만들어 가는 과정이라고 생각합니다. 얼른 마치고 다음 개발 대상인 거래 내역 화면을 개발하고자 합니다.


지난 스팀 앱 개발기

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.

저는 파이썬으로 작업하는데 API 노드와 통신하는 부분은 전부 예외 처리 코드를 만들어 줘야겠더군요. 예전보다는 훨씬 나아졌지만 요즘에도 간혹 응답이 제대로 오지 않을 때가 있습니다.

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.029
BTC 57810.45
ETH 3116.57
USDT 1.00
SBD 2.43