*/Android

[안드로이드] Retrofit, Shared Preferences 객체 싱글톤 패턴으로 사용하기

sssbin 2023. 2. 19. 18:24

 

Shared Preferences, Retrofit과 같은 객체들은 싱글톤 패턴으로 앱이 실행될 때 한번만 생성해놓고 사용하는 것이 효율적이다.

(+ 데이터베이스 등등)

 

// 앱이 실행될때 1번만 실행
class ApplicationClass : Application() {
    val API_URL = "-"
    
    // 전역변수
    companion object {
        lateinit var prefs: SharedPreferences
        lateinit var sRetrofit: Retrofit
    }

    // 앱이 처음 생성될 때
    override fun onCreate() {
        super.onCreate()
  
        prefs =
            applicationContext.getSharedPreferences("prefs", MODE_PRIVATE)

        initRetrofitInstance()
    }

    private fun initRetrofitInstance() {
        val client: OkHttpClient = OkHttpClient.Builder()
            .readTimeout(5000, TimeUnit.MILLISECONDS)
            .connectTimeout(5000, TimeUnit.MILLISECONDS)
            .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .addNetworkInterceptor(XAccessTokenInterceptor()) // 자동 헤더 전송
            .build()


        sRetrofit = Retrofit.Builder()
            .baseUrl(API_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

    }
}

 

이렇게 ApplicationClass를 작성한 후, manifest 파일의 appliction 요소에

android:name=".ApplicationClass"

추가해주는 것 잊지 말기!!!

 

class XAccessTokenInterceptor : Interceptor {

    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        val builder: Request.Builder = chain.request().newBuilder()
        val accessToken: String? = prefs.getString("accessToken", "")
        if (accessToken != null) {
            builder.addHeader("Authorization", "Bearer $accessToken")
        }
        return chain.proceed(builder.build())
    }
}

 

그리고 로그인 시 액세스토큰을 shared preferences에 저장해놓고

서버에 요청을 보낼 때 자동으로 헤더를 붙여 토큰을 전송하도록 인터셉터를 달아줬다.