android

Firebase Realtime Database 의 활용

Billcoreatech Billcoreatech 2021. 3. 6. 15:16

온라인으로 동시에 여러사람이 사용할 앱을 만들고 싶다. 그런데 동시에 데이터를 볼 수 있어야 한다면

내가 운영할 서버를 만들어야 한다. 

 

방법으로는 호스팅 서비스를 이용해서 업무를 주고 받을 서버를 구축하고 사용하거나, 

내가 관리할 수 있는 위치에 서버을 구성하는 방법이 있을 것 같다.

 

그러나, 이렇게 운영하기에는 해야할 일이 많고, 관리할 수 있는 여력이 안될 수 도 있다.

그떄 나오는 것이 Firebase 가 아닐까 싶은데...

 

이번에 Firebase 을 이용한 앱을 만들면서  사용했던 부분에 대한 정리를 해 둘까 ?

 

1. record 의 구성

Sqlite 을 사용할 때도 table 을 구성해야 하기 떄문에 반드시 데이터로 들어갈 항목에 대한 설계는 필요하다.

이와 마찬가지로 Firebase 을 사용하고자 할 떄도 항목은 정해야 한다.  예을 들면 아래 처럼

public class UserBean {

    String userEmail ;
    String userPassword ;
    String userName ;
    String userDept ;
    String userDept1 ;
    String deptCode ;
    String deptCode1 ;
    String masterTy ;
    String useYn ;


    public void Userbean() {

    }

    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }

    public String getUserEmail() {
        return userEmail;
    }

    public void setUserPassword(String userPassword) {
        // 패스워드는 암호화해서 기록하기
        this.userPassword = StringUtil.makeSHA256(userPassword);
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserDept(String userDept) {
        this.userDept = userDept;
    }

    public String getUserDept() {
        return userDept;
    }

    public void setDeptCode(String deptCode) {
        this.deptCode = deptCode;
    }

    public String getDeptCode() {
        return deptCode;
    }

    public void setUserDept1(String userDept1) {
        this.userDept1 = userDept1;
    }

    public String getUserDept1() {
        return userDept1;
    }

    public void setDeptCode1(String deptCode1) {
        this.deptCode1 = deptCode1;
    }

    public String getDeptCode1() {
        return deptCode1;
    }
    public void setMasterTy(String masterTy) {
        this.masterTy = masterTy;
    }

    public String getMasterTy() {
        return masterTy;
    }

    public void setUseYn(String useYn) {
        this.useYn = useYn;
    }

    public String getUseYn() {
        return useYn;
    }
}

2 이제 데이터를 조회해 볼까 하는 데

Sqlite 라고 하다면...

	public Cursor selectUserInfo() {
		StringBuffer sb = new StringBuffer() ;
		sb.append(" select userEmail, userPassword, userName, userDept, userDept1, deptCode, deptCode1, masterTy, useYn ");
		sb.append(" from userInfo ");
		sb.append(" order by userEmail ") ;
		Cursor cursor = db.rawQuery(sb.toString(), null) ;
		return cursor ;
	}

이렇게 구현을 해서 MainActivity 안에서 Cursor 을 활용해서 데이터를 조회한다고 할 수 있다.

 

그럼 Firebase 의 ReailTime Database 는 어떻게 ?

DatabaseReference mDatabase;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    ...
	
    mDatabase = FirebaseDatabase.getInstance().getReference("users");
    
    ...
    
    }
       
    
    public void getDisplayData() {

          mDatabase.orderByChild("userEmail").addListenerForSingleValueEvent(new ValueEventListener() {
              @Override
              public void onDataChange(@NonNull DataSnapshot snapshot) {
                  userBeanListArray.clear();
                  for(DataSnapshot dataSnapshot : snapshot.getChildren()) {
                      userBeanListArray.add(dataSnapshot.getValue(UserBean.class));
                      Log.i(TAG, dataSnapshot.getValue(UserBean.class).getUserEmail());
                  }
              }

              @Override
              public void onCancelled(@NonNull DatabaseError error) {

              }
          }) ;
    	}

이런 모양으로 구성이 될 수 있다.

 

여기서 한가지 알고 가야할 것은 

 

addListenerForSingleValueEvent() 와 addValueEventListener() 의 차이가 아닐까 하는 생각이 든다. 

어떤게 더 유리하게 동작을 할 지는 알 수 없지만.

 

addValueEventListener() 을 이용하는 경우는 항목이 변화되는 경우(추가/삭제/수정) 실시간으로 데이터가 반영되는 역활을 하고 있고, addListenerForSingleValueEvent() 을 이용하게 되면, 조회를 시도하는 경우에만 새로운 데이터를 가지고 온다는 것이다. 

 

addValueEventListener()는 이벤트가 생길떄 마다 다시 데이터를 갱신하기 때문에 데이터 조회하는 양이 많아지게 되는 단점이 있기는 하지만, 장점은 실시간으로 변하는 데이터를 화면에 보여주는 등의 기능을 구현할 수 있기 때문에 여려사용자가 동시에 같은 내용을 보고 있다면 도움이 될 수 있을 것으로 보인다.

 

addListenerForSingleValueEvent() 는 실시간 갱신이 되지 않고 조회시마다만 갱신을 하기 때문에 데이터 조회하는 양은 조절이 될 수 있다, 단점으로는 사용자가 데이터 갱신여부를 계속해서 확인을 해야 한다는 것이다.

 

두 가지 차이점에 대해서는 적용하기에 따라 달라 질 수 있으니 개발시에 주의가 되어야 할 것 같다.

 

 

 

 

1 2 3 4 5 6 7 8 ··· 19