라떼는말이야

[Android] 로그인과 메인 액티비티 플로우 (with NoDisplay theme) 본문

안드로이드

[Android] 로그인과 메인 액티비티 플로우 (with NoDisplay theme)

MangBaam 2022. 1. 19. 15:58
반응형

앱 개발에서 가장 일반적인 패턴 중 하나는 LoginActivity에서 로그인 후 MainActivity로 전환되는 것이다.

사용자가 LoginActivity에서 올바른 자격 증명을 입력하면 앱은 LoginActivity를 종료하고 MainActivity를 시작한다.

일반적으로 사용자가 이후에 다시 앱을 실행시켰을 때 로그인을 다시 할 필요 없게 하는 것을 원할 것이다.

 

이를 실현하기 위해서 몇 가지 접근법이 있는데, 가장 쉬운 것은 사용자가 앱을 사용할 때마다 매번 로그인을 강제하는 것이다. 하지만 이 방법은 유저 경험(UX)에 아주 끔찍한 방법이다.

일반적으로 사용자가 로그인하면 몇 종류의 토큰을 반환하고, 그것을 앱의 생명주기 외부 어딘가에 저장하면 된다.

 

일단 토큰을 받았다면, 토큰의 기간이 만료되기 전까지 사용자의 로그인을 유지시켜줄 수 있다.

과거에 사용되던 방법은 LoginActivity나 MainActivity를 Manifest에서 메인(시작 화면)으로 설정하는 것이다.

만약 LoginActivity가 메인으로 설정됐다면, 토큰이 저장되어있는지 확인하고, 만약 그렇다면 MainAcitivty를 실행시킨 후 (LoginActivity를) 종료시킨다.

MainActivity가 메인으로 설정됐다면, 토큰이 저장되어 있는지 확인 후 저장되어있지 않다면 LoginActivity를 실행시킨 후 (MainActivity를) 종료시킨다.

 

이런 접근 방식은 효과는 있지만 약간 투박하고 느리다. 

 

여기서는 NoDisplay Theme이란 것을 소개할 것이다. MainEmptyActivity라는 액티비티를 만들고 이 액티비티를 메인으로 설정한다.

MainEmptyActivity
class MainEmptyActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // go straight to main if a token is stored
        val activityIntent: Intent = if (Util.getToken() != null) {
            Intent(this, MainActivity::class.java)
        } else {
            Intent(this, LoginActivity::class.java)
        }
        startActivity(activityIntent)
        finish()
    }
}

 

그리고 Manifest에서 메인으로 설정한다.

AndroidManifest.xml
<activity
    android:name=".activity.MainEmptyActivity"
    android:theme="@android:style/Theme.NoDisplay">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

 

이 플로우에서는 토큰이 만료되었는지 고려하는 것도 중요하다. 만료되었다면 LoginActivity로 다시 보내고, 저장소에서 토큰을 삭제해야 한다.

일반적으로는 모든 요청에서 응답 코드를 확인하고, 401이라면 토큰이 만료된 것으로 간주하지만 응답은 서비스마다 다를 수 있다.

 

로그인과 메인 이렇게 2개의 상태를 가지는 것이 가장 일반적인 형태이지만 더 많은 상태에 대해서도 적용할 수 있는 방법이다. 

 

다른 대안으로는 NoDisplay theme 대신에 스플래시 화면을 사용할 수도 있겠다. (최근 안드로이드 12에서는 스플래시 api가 강제되어 이제는 이 방법을 사용하게 될 듯싶다)

하지만 어떤 방법을 사용하더라도 플로우는 비슷한 방법으로 진행될 것이다.

 

출처 : https://medium.com/android-news/login-and-main-activity-flow-a52b930f8351

 

반응형
Comments