[Firebase] 4. 파이어베이스(Firebase) 실시간 데이터베이스. Token값으로 UserProfile 관리하기

in #kr-dev8 years ago (edited)


안녕하세요! @gbgg입니다.
이번 포스팅에서는 앱 설치시 모바일에 부여되는 고유의 토큰(Token)값을 이용하여
개인 사용자에 맞는 데이터를 저장하고 불러오는 작업을 진행해 보겠습니다.

제가 전문가가 아니다보니 부족한 점이나 잘못된 부분이 있을 수 있습니다. 피드백 주시면 즉시 반영하겠습니다.


실시간 데이터베이스

개발할 앱/웹 등이 정보를 제공하거나 받아와야 할 경우, 또는 데이터를 주고 받아야 할 경우 등등 데이터베이스 기능은 개발에 있어 필수라고 생각합니다. 파이어베이스에서는 다양한 백엔드 서비스를 제공하고 있는데 그 중 가장 대표적인 기능이 '실시간 데이터베이스' 입니다.

이번 포스팅에서는 토큰(token) 값을 사용한 child를 만들어 개인 프로필을 저장하는 기능을 구현해보겠습니다.


준비물
1. Google 계정
2. Android Studio 1.5 이상

앱 개발을 위해 안드로이드 스튜디오를 설치하였습니다.
위 링크로 들어가셔서 다운받으시면 됩니다.


Token

앱이 최초로 로드될 때 모바일에서 토큰값이 생성됩니다.
이 값은 기기마다 모두 다른 값을 가지고 있어 개개인의 사용자 정보를 관리할 수 있습니다.

토큰 값은 지난 포스팅에서 .push() 기능을 사용했을 때 처럼 특정한 규칙을 가진 문자/숫자열로 이루어져 있습니다.


이 토큰 값을 가지고 child를 생성할 때 이름으로 사용하여 저장하고 내용이 수정될 경우 업데이트합니다.

반대로 모바일이 실행되었을 때는 UserProfile 이라는 child 내에 있는 토큰값 중 자신의 토큰값과 일치하는 부분을 찾아서 업데이트 시켜줍니다.

먼저 모바일 기기의 토큰 값을 안드로이드 스튜디오 모니터에 띄워보겠습니다.


token값 살펴보기

토큰값을 읽어오는 방법은 간단합니다. 파이어베이스 인스턴스에 .getToken();을 붙여주면 가져올 수 있습니다.

String test = FirebaseInstanceId.getInstance().getToken();
 Log.d("Token Value", test);

string형식으로 test를 정의한 뒤 test에 getToken으로 토큰값을 넣어줍니다.
그 값을 log창에 띄워보겠습니다.

지난 포스팅에서 onDataChange는 데이터가 변경될 때 작동하는 리스너라고 말씀드렸었는데 이 부분에 임의로 넣어보도록 하겠습니다.

해당 child에 있는 값 갯수만큼 반복하므로 아마 데이터베이스에 들어가있는 메세지 만큼 반복하게 될겁니다.

안드로이드 스튜디오 하단에 있는 logcat 창을 확인해봅시다.


모바일 고유의 토큰값이 생성되어 있는 것을 확인할 수 있습니다.

이 값은 앱을 지우고 다시 만들지 않는 한 변하지 않습니다.


기본 셋팅

레이아웃을 따로 생성하면 좋겠지만 그 부분은 따로 다뤄보도록 하고 기존에 있던 리스트 뷰 크기를 줄여 공간을 조금 확보해 보겠습니다.


간단하게 ID와 버튼, 체크박스를 생성해 보겠습니다.
버튼을 누르게 되면 ID값과 KR 체크박스의 선택 여부가 전송되게 될 겁니다.


버튼을 생성했으니 뷰를 정의해줍니다.
이름은 sendbt_profile, editdt_profile, Cb_1로 임의지정하겠습니다.

    private Button sendbt_profile;
    private EditText editdt_profile;
    private CheckBox Cb_1;

마찬가지로 View도 연결하겠습니다.

        sendbt_profile = (Button) findViewById(R.id.button3);
        editdt_profile = (EditText) findViewById(R.id.editText2);
        Cb_1 = (CheckBox) findViewById(R.id.checkBox);

개인정보 보내기

셋팅이 완료되었으면 첫 번째 작업을 진행해 보겠습니다.
버튼을 누르면 TOKEN값을 가진 child를 개인정보와 함께 전송되도록 구현하겠습니다.

가장 먼저 새로 만든 버튼에 대한 리스너를 생성해야겠죠?

sendbt_profile.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                
            }
        });

지난 강의에서 만든 메세지 전송 버튼 아래에 생성해보았습니다.
이제 구현할 부분을 정리해 보겠습니다.

  • DATA 클래스 생성
  • token값을 읽어와 child명으로 사용
  • kr 체크박스 여부 확인(true, false)

지난 강의에서는 한 가지 값만 전송했지만 이번에는 ID와 토큰값, 체크박스 여부를 전송해야 합니다.
이 과정을 좀 더 편하게 하기 위해 구조체를 만들어 사용해 보겠습니다.


Class를 생성해줍니다.

이름은 senddata로 지정하겠습니다.

public class senddata {
    public String firebaseKey; // Firebase Database 에 등록된 Key 값
    public String userName; // 사용자 이름
    public String message1; // 작성한 메시지
}

key값 즉 토큰값과 사용자 이름, 메세지 총 3개의 항목으로 구성합니다.

                String tokenID = FirebaseInstanceId.getInstance().getToken();

                mReference = mDatabase.getReference("UserProfile");
                Boolean ms1 = Cb_1.isChecked();

                if (!TextUtils.isEmpty(tokenID)) {
                    senddata Senddata = new senddata();
                    Senddata.firebaseKey = tokenID;
                    Senddata.userName = editdt_profile.getText().toString();
                    Senddata.message1 = ms1.toString();

                    mReference.child(tokenID).setValue(Senddata);
                }

만약 'tokenID'값이 Null이 아니라면 'UserProfile' 하위에 'tokenID'값을 가진 child를 만들고 값을 전송합니다.
실시간 데이터베이스에 어떤식으로 전송되는지 확인해보겠습니다.

위 그림과 같이 정상적으로 데이터가 넘어간 것을 확인할 수 있습니다.

UserProfile의 하위 child명을 토큰값으로 지정한 이유는 setValue()를 통해 값을 넣었을 때 다른 토큰 값을 가진 사람이 데이터를 입력했을 경우 기존 값이 업데이트 되는 것이 아니고 새로 생성되어야 하기 때문에 위와 같은 방식으로 구성하였습니다.


개인정보 동기화

이제 내 토큰값과 일치하는 데이터를 찾아 모바일 앱 내의 체크박스와 아이디를 업데이트 시켜줘야합니다.
지난 강의에서 강조했던 'onDataChange' 리스너를 사용하여 구현할것입니다.

                String tokenID = FirebaseInstanceId.getInstance().getToken();

                for (DataSnapshot messageData : dataSnapshot.getChildren()) {

                    if(msg.equals(tokenID)) {
                        String Textvalus = messageData.child("userName").getValue().toString();
                        editdt_profile.setText(Textvalus);

                        if (messageData.child("message1").getValue().toString().equals("true")) {
                            Cb_1.setChecked(true);
                        } else if (messageData.child("message1").getValue().toString().equals("false")) {
                            Cb_1.setChecked(false);
                        }
                    }

코드 내용을 순서대로 확인해 보겠습니다.

데이터베이스 내에 값 변동이 감지될 경우
tokenID에 현재 모바일 기기의 토큰 값을 저장합니다.

for문에 의해 모든 데이터 값 만큼 반복되게 되는데
이때마다 getkey()를 사용하여 child값을 가져옵니다.

이 값을 string형으로 지정한 msg에 저장하고
IF문을 사용하여 처음에 저장한 tokenID값과 비교합니다.

일치할 경우 앱에 있는 editText값과 체크박스 값을 갱신합니다.
일치하지 않을 경우 아무런 동작도 수행하지 않습니다.


결과

자! 완료되었습니다.
ID와 체크박스를 선택하고 버튼을 누르면 데이터베이스에 정보가 전달됩니다.
반대로 그 값이 앱과 연동되어 값이 변경되어있더라도 동기화시켜주게 될겁니다.


모바일 앱 개인설정 화면

파이어베이스 데이터베이스 값


Firebase 실시간 데이터베이스
토큰 값을 사용하여 개인 프로필 정보를 저장하고 앱과 동기화시켜보았습니다.
앱을 제작할 때 개인이 선택한 설정에 맞춰 정보가 제공되는 경우가 많으므로 매우 중요한 부분입니다.
더 좋은 방법이 있을수는 있겠지만 이렇게 토큰값을 사용하면 간단하게 구현할 수 있으므로 도움이 되었으면 좋겠습니다.

@dakeshi 님께서 지난포스팅에서 피드백 주신 부분입니다.
실시간데이터베이스의 데이터 입력 수정시 JSON에서 처리가능한 데이터 타입에 대한 종류가 정해져 있습니다.
데이터 구성할 때 꼭 참조하셔야 할 부분입니다.

문서 바로가기

위 형식에 맞는 데이터 형을 가진 값들만 입력이 가능하므로 참조하시기 바랍니다.

다음 포스팅에서는 다양한 사용자들의 토큰값을 하나씩 체크하여 맞춤형 기능들을 사용할 수 있도록 구현해보겠습니다.

다음 포스팅에서 찾아뵙겠습니다! @gbgg


지난 포스팅
[Firebase] 1. 혁신적인 백엔드플랫폼 파이어베이스(Firebase)
[Firebase] 2. 파이어베이스(Firebase) 실시간 데이터베이스에 데이터 쓰기 (app)
[Firebase] 3. 파이어베이스(Firebase) 실시간 데이터베이스 불러오기, 리스트에 내용 표시하기

Sort:  

firebase로 fcm(push)할때만 잠깐 써봤는데... 용도가 다양하네요.^^
좋은 자료 감사합니다.

네 써보면 써볼수록 굉장히 유용한것 같습니다^^ 감사합니다

뭔지 잘모르겠지만 배우고 싶어요~

읽어주셔서 감사합니다!

정말대단하십니다.
전 뭔말인지 아예 이해가 되지 않네요
ㅎㅎ
즐거운 하루 시작하세요

kojiyoung님 기술에 비하면 아무것도 아닙니다ㅎㅎㅎ 즐거운 하루되세요! ^_^

오 좋은 글 감사합니다.

감사합니다 좋은하루되세요! ^_^

와........ 뭐가 뭔지 하나도...ㅋㅋㅋㅋㅋ 댓글도 뭐라고 달아야할지...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ이런거 하시는분들 정말 존경스럽습니다!!!^^/

저도 배우면서하는거라 초보입니다 ㅋㅋㅋㅋ;;

헉!!!
이과지만 컴퓨터관련 교양을 C+맞은 관계로...
ㅠㅠ 너무 어렵네요.
하지만 모르는 제가 봐도 열정과 지식이 대단하십니다!!
존경스럽네요 :)

잘 봐주셔서 감사합니다!~! 나중에 스팀잇이 좀더 활성화되면 써둔것들이 도움이 많이 될것같네요!

짱짱맨은 스티밋이 좋아요^^ 즐거운 스티밋 행복한하루 보내세요!

항상 감사합니다!

Coin Marketplace

STEEM 0.04
TRX 0.33
JST 0.077
BTC 62136.92
ETH 1631.41
USDT 1.00
SBD 0.40