마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

서버점검로직 어떻게하면좋을까요

0 추천
서버를 내리는게아닌 API호출형태로 서버점검일때 다이얼로그를 띄우려고하는데

인터셉터에서 하려했더니 거기서 다이얼로그를 못띄우더라구요..

그러면 서버점검 API를 호출하려면 모든화면에 다박아야될거같은데 이건 너무 좋지않은방식같고

(특정화면에서 홈키 눌렀다가 다시 재진입시 다시 그화면이 나오고 그러면 서버점검인지 체크가 안되서..)

보통 어떻게 하는지 궁금합니다
수원통학러 (3,570 포인트) 님이 2021년 7월 9일 질문

1개의 답변

0 추천

서버의 모든 API 마다 서버 점검일 때는 서버 점검 응답을 주나요, 아니면 서버 점검 API는 별도로 존재하고 님이 알아서 주기적으로 호출해야 하는 건가요?

첫번째는 처리가 명료하니까 두번째의 경우라고 가정하고 말씀드릴게요.

API를 호출하는 wrapper 클래스를 하나 만드세요. (함수를 만드셔도 가능할 것 같네요) 아래처럼 wrapper 안에서 서비스를 호출하기 전에 서버 점검 API를 먼저 호출하세요. 서버 점검 중이라면 서버 점검에러를 먼저 리턴하도록 해보세요. 

class ApiInvokeWrapper(
    private val checkSystemService: SystemCheckService,
    private val apiService: ApiService
) {
     fun callService(action: (ApiService) -> Unit) {
          val systemCheckResult = checkSystemService.invoke()
          if (checkSystemService.invoke() == SystemCheckResult.InMaintenance) {
                  return systemCheckResult
          }
         
         action(apiService)
     }
}

class SystemCheckService {
       fun invoke(): SystemCheckResult
}

class ApiService {
      
}

대략적으로 위와 비슷하게 할 수 있을 것 같습니다만, 님이 구체적인 상황에 따라 구현내용도 달라질겁니다.

OkHttp를 사용하실 경우는 
Authenticator라는 것을 이용하시면 다른 API호출 전에 서버 점검  API를 호출하시면 체크하실 수 있을 듯합니다. https://square.github.io/okhttp/3.x/okhttp/okhttp3/Authenticator.html

그리고 찾아보니 Interceptor 안에서 Dialog를 띄울 수 있는 방법은 
 

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

선언하시고 ApplicationContext를 사용하시는 방법이 있습니다.   다른 방법으로는 BroadCastReceiver 를 이용할 수도 있겠네요.

그리고 ApplicationContext를 사용하실 거면 바로 interceptor에서 사용하시지 마시고 인터페이스나 wrapper로 한번 감싸서 사용하세요.

interface SystemMaintenanceAlert {
     fun handleMaintenanceMessage() 
}

class SystemMaintenanceAlertImpl(
     private appContext: Context
) {

     override fun handleMaintenanceMessage() {
           // Show dialog
     }
}


class SystemMaintenaceInterceptor (
      private val systemMaintenaceAlert: SystemMaintenanceAlert
) implements Interceptor {

      if (systemMaintenaceInProgress()) {
            return systemMaintenaceAlert.handleMaintenanceMessage()
      }
}

 

다른 가능한 방법으로는 Interceptor를 Singleton으로 만들고 MainActivity같이 백스택에 계속 유지는 곳에서 Listner를 달아서 이벤트를 받는 방법도 생각해 볼 수 있을 것 같습니다.

object SystemMaintenaceInterceptor implements Interceptor {

      interface Listener {
          fun onSystemMaintenane() 
      }

      var listener: Listener?= null
    
      override fun intercept(Interceptor.Chain chain): Response {
         if (systemMaintenaceInProgress() && listener != null) {
             return listener.onSystemMaintenane()
         }
      }

}

class MainActivity: AppCompatActivity, SystemMaintenaceInterceptor.Listener {

     fun onCreate(saveInstance: Bundle) {
         super.onCreate(saveInstance)
         
         SystemMaintenaceInterceptor.listener = this
     }

    override fun onSystemMaintenane() {
         // show message
    }
}

 

spark (228,010 포인트) 님이 2021년 7월 9일 답변
spark님이 2021년 7월 10일 수정
서버 점검일 때는 어떤 API를 호출하더라도 서버점검에 대한 응답이 오는게, 여러가지로 문제점을 최소화할 수는 방법입니다. 이런 식으로 서버 API가 동작을 해야 어떤 클라이언트가 접속을 하더라도 서버에서 원하는 대로 동작을 할 수 있을 겁니다.
...