-->

[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 같은 암호화 라이브러리를 이용해 암호화되어있는 상태로 저장할 수 있도록 한다.

 

+ Recent posts