티스토리 뷰

안드로이드 개발자는 아니라 웹 개발자지만 회사에서 안드로이드 개발도 1건을 했었어가지고 그곳에서 얻었던 지식들을 나중에 혹시 모르니 기록해봐야겠다.

 

안드로이드 개발을 처음 맡았을 때 기본으로 있어야했던 기능은 바로 자동 로그인 기능이었다.

보통 모바일 앱들을 보면 로그인은 한 번만 하고 자동로그인을 체크해놓으면 자동 로그인이 구현되도록 되어 있다.

그래서 내가 개발해야했던 프로젝트에서도 자동 로그인을 꼭 구현해야했다. 그 때 사용했던게 SharedPreferences 인터페이스였다.

(참고로 나는 Kotlin이 아니라 Java로 안드로이드 앱 개발을 했다.)

 

 

SharedPreferences 이란

해당 앱의 파일에 저장되는 데이터를 다룰 수 있는 인터페이스이다.

즉, 자동로그인 기능에서 뿐만 아니라 앱을 종료하고 새로 시작했을 때 똑같이 가지고 있어야하는 데이터가 있을 경우 넣어서 사용할 수 있다. 데이터는 해당 앱을 삭제하거나 해당 앱의 데이터를 삭제하지 않는 이상 계속 유지된다.

 

key, value와 같은 Map 형태로 값을 넣을 수 있으며 넣을 수 있는 값의 타입은 Boolean, Float, Int, Long, String, StringSet이 있다.

 

 

SharedPreferences.Editor로 로그인 정보 저장하기

우선 자동 로그인 체크박스(autoLogin)가 체크되어 있을 경우 로그인 정보를 SharedPreferences를 통해 저장해야지 추후 자동 로그인 기능을 구현할 수 있다. (안 그럼 로그인 정보가 없으니)

나는 로그인에 필요한 정보인 userId와 passwordNo 그리고 로그인 후에 사용할 정보인 userRole, userName을 저장했다.

if(autoLogin.isChecked()) {
          // 자동 로그인 데이터 저장
          SharedPreferences auto = getSharedPreferences("autoLogin", Activity.MODE_PRIVATE);
          SharedPreferences.Editor autoLoginEdit = auto.edit();
          autoLoginEdit.putString("userId", userId);
          autoLoginEdit.putString("passwordNo", passwordNo);
          autoLoginEdit.putString("userRole", loginInfo.getUserRole());
          autoLoginEdit.putString("userName", loginInfo.getUserNm());
          autoLoginEdit.commit();
}

 

저장하는 방법은 매우 간단하다.

우선 SharedPreferences를 가져와서 거기서 Editor 객체를 가져와 put 메소드를 사용해주면 된다.

SharedPreferences sp = getSharedPreferences(${데이터 이름}, ${Activity 모드});
SharedPreferences.Editor spEdit = sp.edit();

 

Activity 모드

getSharedPreferences()에 들어가는 Activity 모드 값은 아래 4가지가 있다.

1. Activity.MODE_PRIVATE

기본 모드로 이렇게 설정할 경우 해당 데이터는 해당 앱에서만 사용할 수 있다.

 

2. Activity.MODE_WORLD_READABLE

다른 앱에서도 해당 데이터를 읽을 수 있도록 허용한다.

단, 다른 앱에서 데이터를 읽는다는 보안적인 문제가 있어서 API level 17부터는 지원되지 않는 모드이다.

 

3. Activity.MODE_WORLD_WRITEABLE

다른 앱에서도 해당 데이터를 쓸 수 있도록 허용한다.

이 또한, 다른 앱에서 데이터를 읽는다는 보안적인 문제가 있어서 API level 17부터는 지원되지 않는 모드이다.

 

4. Activity.MODE_MULTI_PROCESS

이 모드는 앱이 여러 개의 프로세스로 나뉘어져 있을 때 그런 여러 프로세스에서 해당 데이터를 공통으로 사용할 수 있도록 허용하는 것이다.

이 모드는 일부 안드로이드 버전에서는 잘 동작하지 않는 문제점이 있어 API level 24부터는 지원되지 않는 모드이다.

 

자동 로그인 데이터의 경우 LoginActivity내에서만 동작할 것이므로 기본 모드인 'Activity.MODE_PRIVATE'으로 설정해 사용한다.

 

 

SharedPrefereneces.Editor를 통해 editor를 가져왔다면 아래와 같이 put 메소드를 통해 데이터를 키 값과 함께 넣을 수 있다.

spEdit.putString(${key string}, ${value});

 

SharedPrefereneces.Editor에는 아래 put 메소드들이 존재한다.

- putBoolean()

- putFloat()

- putInt()

- putLong()

- putString()

- putStringSet

 

데이터들을 key 값과 매칭시켜서 다 넣었으면 마지막으로 commit()을 해 데이터를 저장한다.

autoLoginEdit.commit();

 

 

SharedPreferences에서 로그인 정보를 가져와 자동 로그인 처리하기

SharedPreferences.Editor를 통해 데이터를 저장했다면 이제 저장된 데이터가 있다면 자동 로그인을 할 수 있다.

데이터는 아래 코드로 가져올 수 있다.

SharedPreferences sp = getSharedPreferences(${데이터 이름}, ${Activity 모드});

 

위 코드에서 SharedPreferences를 가져오면 이제 아래 코드로 값을 가져올 수 있다.

String data = suto.getString(${key string}, ${default value});

 

키 값으로 데이터를 가져올 때 만일 해당 데이터가 존재하지 않을 경우를 위해서 default value를 설정하도록 되어 있다. 이 부분에 null을 넣어도 되고 타입에 따른 default value를 지정해주면 된다.

 

이를 이용해 자동 로그인을 처리하면 아래와 같다.

// 자동로그인 처리
SharedPreferences auto = getSharedPreferences("autoLogin", Activity.MODE_PRIVATE);
userId = auto.getString("userId", null);
passwordNo = auto.getString("passwordNo", null);

...
// 로딩 바 로직
....

if(userId != null && passwordNo != null){
    ...
    // 로징 바 종료
    login(); // 로그인 로직
    ...
}else{
    ...
    // 로그인 버튼 클릭 이벤트 등 로그인을 위한 기본 설정
    ...
}

 

로그인에 필요한 userId와 passwordNo를 가져와서 해당 값들이 둘다 null이 아닌지(default value가 아닌지) 체크를 하고 값이 있을 경우 로그인 로직을 돌리고 그렇지 않을 경우에는 일반 로그인 로직을 위해 로그인 버튼 클릭 이벤트 설정 등 필요한 로직을 구현해준다.

 

 

로그아웃 시 자동로그인 정보 지우기

자동 로그인 기능을 구현했다면 로그아웃을 했을 때 자동 로그인 정보들을 지우도록 로직 구현도 해놔야한다.

안 그러면 계속 자동 로그인을 수행하게 되고 앱 사용자는 다른 계정으로 로그인을 위해서는 앱의 데이터를 지우는 방법 밖에 없다.

 

SharedPreferences.Editor로 저장한 데이터는 마찬가지로 SharedPreferences.Editor로 제거할 수 있다.

우선 위에서 사용했던 방식해돌 editor를 가져온다.

SharedPreferences sp = getSharedPreferences(${데이터 이름}, ${Activity 모드});
SharedPreferences.Editor spEdit = sp.edit();

 

editor.clear()를 하면 해당 이름의 데이터는 모두 지워지게 된다.

editor.clear();

 

editor.clear()를 한다고 반영되는 것이 아니므로 아래와 같이 editor.commit()을 꼭 해줘야한다.

editor.commit();

 

 

웹 개발자인데 안드로이드 개발을 해야해서 막막했을 때 이 간단한 자동 로그인도 어떻게 구현하지 하고 엄청 걱정했었다. 그나마 사용하던 Java라서 빨리 개발을 끝냈지 Kotlin으로 개발을 하라고 했다던가 하이브리드 앱으로 개발을 하라고 했으면 이미 그 때 회사를 나가지 않았을까 생각한다ㅋㅋㅋ

그래도 추후 여유가 생기면 Kotlin과 하이브리드 앱도 한 번 배워보고 싶다.

 

 

 

✋ SharedPreferences 공식 문서

https://developer.android.com/reference/android/content/SharedPreferences

 

SharedPreferences  |  Android 개발자  |  Android Developers

 

developer.android.com

✋ SharedPreferences.Editor 공식 문서

https://developer.android.com/reference/android/content/SharedPreferences.Editor

 

SharedPreferences.Editor  |  Android Developers

 

developer.android.com

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함