[kotlin] 로그인

이미리·2022년 7월 2일
0

[kotlin] Android

목록 보기
4/5

로그인은 이전의 회원가입 과정과 매우 유사하다.
하나 다른 점은 로그인했을 때 발급받은 jwt(json WebToken)을 저장해주어야 된다는 점이 다르다.

1. LogInView interface

실패, 성공 함수를 관리하기 위해 logInView interface를 만들어준다.

package com.example.dologinout

interface LogInView {
    fun onLogInSuccess()
    fun onLogInFailure()
}

add login fuc to AuthService

view, api를 관리하는 authService에 login 기능을 추가한다.

	private lateinit var logInView: LogInView
	
    fun setLogInView(logInView: LogInView){
        this.logInView = logInView
    }
    
    fun login(user : User)
    {
        val authService = getRetrofit().create(AuthRetrofitInterface::class.java)
        authService.login(user).enqueue(object: Callback<AuthResponse> {
            override fun onResponse(call: Call<AuthResponse>, response: Response<AuthResponse>) {
                Log.d("LOGIN/SUCCESS", response.toString())
                val resp:AuthResponse = response.body()!!
                when(resp.code)
                {
                }
            }

            override fun onFailure(call: Call<AuthResponse>, t: Throwable) {
                Log.d("LOGIN/FAILURE", t.message.toString())
            }
        })
    }

AuthRetrofitInterface

이때 Call<>의 괄호 안에 들어가는 값은 우리가 reponse 받을 값의 데이터클래스 형태로 정의된 것이다.
회원가입 요청 시 "isSuccess", "code", "message" "result" 값을 리턴받으므로 이 형태의 데이터 클래스를 만들어준다. 위의 코드에서는 데이터 클래스의 이름을 AuthResponse로 명시했기 때문에 그대로 만들어준다.

    	@POST("/users/login")
    	fun login(@Body user: User): Call<AuthResponse>

LogInActivity

LogInActivity에서 인터페이스인 LogInView를 상속받아 적용시켜야한다.

2. saveJwt

로그인 성공 시 받은 jwt를 저장하는 함수를 만들어준다.
jwt(json WebToken)을 저장하는 이유는 매번 로그인을 진행할 수 없기 때문에 access token을 주고 받음으로써 사용자를 식별할 수 있기 때문이다.

private fun saveJwt(jwt : String)
    {
        val spf = getSharedPreferences("auth", MODE_PRIVATE)
        val editor = spf.edit()

        editor.putString("jwt", jwt)
        editor.apply()
    }

3. AuthResponse

로그인 성공 시 받는 response와 맞추어주어야 한다.
따라서 추가적으로 필요한 result를 선언해준다.

json으로 request를 보내줄 때에는 @SerializedName(value = "email") val email: String의 형태로 만들어주어야 한다.

package com.example.dologinout

import com.google.gson.annotations.SerializedName

data class AuthResponse(
    @SerializedName(value = "isSuccess") val isSuccess:Boolean,
    @SerializedName(value = "code") val code:Int,
    @SerializedName(value = "message") val message:String,
    @SerializedName(value = "result") val result : Result?
    )

data class Result(
    @SerializedName(value = "userIdx") val userIdx : Int,
    @SerializedName(value = "jwt") val jwt : String
)

로그인api와 회원가입api가 authResponse라는 같은 데이터시트를 사용하기 때문에 회원가입 사용 되지 않을 result값은 ?으로 null 처리해주어야 한다.

4. Success/Failure

LogInView

fun onLogInSuccess(code : Int, result: Result)
code -> 1000, 2000, etc ...
result -> userId & jwt
를 사용하기 위해서 매개변수로 넣어준다.

AuthService

		when(val code = resp.code)
       {
              1000 -> logInView.onLogInSuccess(code, resp.result!!)
              else -> logInView.onLogInFailure()
       }

이렇게 만들어진 onLogInSuccess(), onLogInFailure()를 logInActivity에서 구현한다. (현재 우리는 MainActivity를 로그인 창으로 활용하고 있다.)

onLogInSuccess() 구현

saveJwt 함수를 이용해 성공 시 jwt를 sharedPreference에 저장하도록 한다.

0개의 댓글