[Android / Java]
앱에 필요한 정보를 저장하는 SharedPreferences
* 목표 : SharedPreferences의 개념, 사용방법, 주의사항에 대해 알아보자.
우리가 앱이나 웹에서 체크박스를 이용해 ID, Password를 저장하는 것을 많이 봤을 것이다.
바로 이런식으로 말이다. 흰 네모칸의 체크박스를 클릭하면 내가 입력한 계정 정보가 저장되는 식이다. 근데 어떠한 원리로 저장이 되는 걸까?
먼저 로그인 단 화면을 열 때 서버와 통신해서 세팅하는 방법이 있다. 그 편이 사실 안전하긴 하지만 일단 네트워크 연결 상태여야 하고 수많은 유저의 정보를 저장해두기엔 용량 문제도 있다. 그래서 우리는 이 로그인 정보를 저장하기 위해 SharedPreferences를 이용해 보기로 한다.
기본적으로 애플리케이션은 하나의 프로그램이다. 이 프로그램이 종료되면 저장하지 않은 정보들은 사라진다. 이 프로그램 안에 파일을 만들어 저장하는 방식이 바로 SharedPreferences이다.
기본적으로 SharedPreferences를 사용하면 다음 경로의 앱 내부저장소에 파일 형태가 생성된다.
data/data/[package_name]/shared_prefs/[SharedPreferences의 파일 이름]
자 바로 실습을 진행해보자.
/**
* 현재 로그인 정보를 저장하기
*/
public void setLoginInfo(){
SharedPreferences sfLogin = getSharedPreferences("SF_LOGIN", MODE_PRIVATE);
SharedPreferences.Editor editor = sfLogin.edit();
editor.putBoolean("CHK_LOGIN", true);
editor.putString("ID", id);
editor.apply();
}
"SF_LOGIN"을 Key로 하는 SharedPreferences 클래스를 MODE_PRIVATE으로 호출한 후에 Editor를 열어 수정 모드로 들어간 뒤, "CHK_LOGIN"이라는 Key값의 boolean 타입 데이터를 true로 저장해줬다. "ID"를 키값으로 하는 String 타입의 데이터도 저장했고 마지막에 apply()를 통해 적용시켜준다. (commit()은 deprecated 된 듯)
/**
* 저장되어있는 로그인 정보 가져오기
*/
private void getLoginInfo(){
IdEt = findViewById(R.id.login_id); //Id EditText
chkLogin = findViewById(R.id.chk_login_save); //로그인 CheckBox
SharedPreferences sfLogin = getSharedPreferences("SF_LOGIN", MODE_PRIVATE);
boolean isLoginChecked = sfLogin.getBoolean("CHK_LOGIN", false); //로그인 체크박스의 상태, default : false
chkLogin.setChecked(isLoginChecked); //로그인 체크박스 세팅
IdEt.setText(sfLogin.getString("ID", "")); //Id EditText에 ID값 불러오기
}
SharedPreferences 클래스를 선언하고 getSharedPreferences("파일 이름", 모드) 메서드를 이용해 기존에 등록되어 있는 정보를 가져오도록 했다. String, boolean, long, float, int 등 지정한 타입의 데이터를 키값으로 가져온다. "CHK_LOGIN"이라는 Key값을 가지고 지정한 boolean 값을 가져오는 것이다. default를 기본적으로 세팅해야 한다. Null 처리를 하기 위해서로 보인다.
기본적으로 SharedPreferences 파일은 map형태의 xml형식으로 저장되어있다.
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="ID">userName</string>
<boolean name="FIRST" value="true" />
<boolean name="CHK_LOGIN" value="true" />
</map>
체크박스의 상태를 저장하여 갖고 오고 체크되어있다면 ID 값을 String 타입으로 저장한다. 또 앱의 최초 실행인지 판단하기 위해 FIRST라는 boolean 값도 만들어 뒀다.
이런 방법으로 체크한 로그인 정보를 저장하고 로드할 수 있다. 그러나 내부저장소에 저장되는 파일인 만큼 보안에 취약한 단점이 있으므로 절대 Password도 같이 저장하면 안 된다. base64 방식을 이용한다 하더라도 복호화할 수 있는 상태로 저장되면 누구나 해킹할 수 있다. 따라서 패스워드는 저장하지 않는 방법을 권고하고 혹여나 하더라도 jasypt 같은 암호화 라이브러리를 이용해 암호화되어있는 상태로 저장할 수 있도록 한다.
'Andorid' 카테고리의 다른 글
[Android] Package, Project, Module 이름 바꾸기 (4) | 2021.01.07 |
---|---|
[Android / Java] TextWatcher를 통한 EditText의 입력 변화 이벤트 (1) | 2020.12.24 |
[Android / Java] 재귀함수를 이용한 캐시삭제 (0) | 2020.12.18 |
[Android / Java] Camera Pad 만들기 (1) | 2020.12.17 |
[Android] Layout / View Group의 종류 2. Frame Layout (1) | 2020.12.11 |