본문으로 바로가기
반응형

즘은앱을 만들때 혼자 인 것은 만들기가 어렵습니다. 데이타와 연결이 되어야 된다는 이야기 입니다.

그럴때  유용하게 나오는 것이 BaaS 라는 것 입니다.

BaaS  는 'Backend as a Service'를 줄여 놓은 말인데, 백엔드 플랫폼을 서비스 형태로 지원해 주는것을 말합니다.


요즘인 구글의 firebase 가 이 부분에서 잘 만들어 놓은 거 같습니다.


firebase 는 성능이나 실행 면에서 뛰어 납니다.

json 으로 저장이 되면서 순간적으로 바뀌면 모든 기기에  전달이 됩니다. 같은 디비를 바라 보면서 말이죠

무척 빠른 속도를 자랑 하구 말입니다.


firebase 는 스트로지 공간도 있면 ssl 커녁션을 이용해서 모든 데이타가 전송 되면 로그인 시스템도 구글,트위터,페이스북,깃허브 등을

지원 합니다.


일단 100 개 동시 커넥션 까지  무료 입니다.

재미난 이야기를 적으면 되고 로그인 시스템도 있고 좋아요도 있습니다 이 모든걸 firebase 를 이용 해서 만들어 보겠습니다.





  • 계정 생성 하기


  • 이메일과 패스워드로 로그인


  • 로그아웃


  • 새로운 농담 쓰기


  • 리스트뷰에 지은이와 투표 카운트 표시하기


  • 재미난 농담에 투표 하기



이런식으로 해 보겟습니다.



먼저 firebase 사이트로 들어 갑니다.

구글이 인수 했다고 하네요


https://www.firebase.com/

로 들어 가시면 됩니다.





새 프로젝트 만들기를 눌러서 적당한 이름으로 만드시면 됩니다. 저는 myNote 라고 정했습니다.


저 프로젝트로 들어 가서 앱 추가를 누르면 google-service.json 파일이 생깁니다.




안드로이드 스튜디오로 가서 프로젝트로 펼쳐 보기 해서 app 폴더 밑에 저 파일을 위치 시키면 됩니다.




이제 다시 firebase 의 프로젝트로 들어 가시면 database 라는 항목이 나타납니다.


json 형태의 데이타 베이스 입니다.


{

"jokes" : {

"kjf": {

"jokeText" : "이런상황?"

}

}

}



이런 형태 라고 보시면 됩니다.



이메일 패스워드 형식의 로그인을 할려면 auth 영역에서 작업을 해 주셔야 합니다..








왼쪽의 auth 를 눌러서 email/password 방식을 사용 설정으로 바꾸어 주시면 됩니다.



이제 firebase 안드로이드 sdk 를 설치 해야 합니다.


build.gradle 파일을


apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
applicationId "yookn.kr.firebasesample"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE-FIREBASE.txt'
exclude 'META-INF/NOTICE'
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.firebase:firebase-client-android:2.5.2'
compile 'com.google.firebase:firebase-auth:9.0.0'
compile 'com.mcxiaoke.volley:library-aar:1.0.0'
compile 'com.android.support:design:23.4.0'
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:recyclerview-v7:23.4.0'
compile 'com.github.clans:fab:1.6.2'

}

apply plugin: 'com.google.gms.google-services'



이렇게 지정 해 주시면 됩니다.


빨간색 부분이 중요 포인트 입니다.




이제 sdk 를 이용 해 보겠습니다.


먼저 DataService.java 부터 만들어 보겠습니다.

DataService.java

public class DataService {

    final static String BASE_URL = "https://<yourprojectid>.firebaseio.com";
   
    final static Firebase _BASE_REF = new Firebase(BASE_URL);
    final static Firebase _USER_REF = new Firebase(BASE_URL + "/users/");
    final static Firebase _JOKE_REF = new Firebase(BASE_URL + "/jokes/");
    
    // private static 로 선언.
    private static DataService instance = new DataService();
    private static MyPreferenceManager pref = MyApplication.getInstance().getPrefManager();

    // 조회 method
    private static class Singleton {
        private static final DataService instance = new DataService();
    }

    public static DataService getInstance () {
        System.out.println("create instance");
        return Singleton.instance;
    }


    public static Firebase CURRENT_USER_REF() {
        String userID = pref.getValue(MyPreferenceManager.UID,"");
        //Firebase currentUserRef = new Firebase(DataService._USER_REF + "/" + pref.getValue(MyPreferenceManager.UID,""));
        return _BASE_REF.child("users").child(userID);

    }

    public static void createNewJoke(HashMap<String, Object> joke) {
        Firebase firebaseNewJoke = _JOKE_REF.push();
        firebaseNewJoke.setValue(joke);

    }

}
 


_BASE_REF 가 기본 베이스 입니다.

_USER_REF 가 사용자 정보 , _JOKE_REF 가 농담 정보의  firebase url 입니다.


CURRENT_USER_REF 함수를 만들어서 현재 로그인한 사람의 정보를 얻어 올때 쓰여집니다.



LoginActivity.java 


package yookn.kr.firebasesample;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

import yookn.kr.firebasesample.app.MyApplication;

public class LoginActivity extends AppCompatActivity {
    Button btnLogin,btnNewAccount,btnAddJoke;
    private FirebaseAuth mAuth;
    MyPreferenceManager pref;
    EditText txtEmailAdress,txtPassword,txtUserName,txtJoke ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        pref = MyApplication.getInstance().getPrefManager();
        mAuth = FirebaseAuth.getInstance();


        txtPassword = (EditText) findViewById(R.id.txtPassword);
        txtEmailAdress = (EditText) findViewById(R.id.txtEmailAdress);
        txtUserName = (EditText) findViewById(R.id.txtUserName);

        btnLogin = (Button) findViewById(R.id.btnLogin);
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                FirebaseUser user = mAuth.getCurrentUser();
              
                if (!pref.getValue(MyPreferenceManager.UID,"").equals("") && user != null) {
                    //이미 로그인 되어져 있습니다.
                    Toast.makeText(MyApplication.getInstance().getApplicationContext(), "로그인되어 있습니다.", Toast.LENGTH_SHORT).show();

                    return;
                }
                signIn(txtEmailAdress.getText().toString(),txtPassword.getText().toString());
            }
        });

        btnNewAccount = (Button) findViewById(R.id.btnNewAccount);
        btnNewAccount.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("entrv","jokeText-1" );

                // createUser();
                //createAccount(txtEmailAdress.getText().toString(),txtPassword.getText().toString(),txtUserName.getText().toString());
                Intent createAccountIntent = new Intent(MyApplication.getInstance().getApplicationContext(), CreateAccount.class);
                startActivity(createAccountIntent);
            }
        });
    }

    private void signIn(String email, String password) {
        Log.d("entrv", "signIn:" + email);
        if (!validateForm()) {
            return;
        }
        MyApplication.getInstance().showProgressDialog(this);

        // [START sign_in_with_email]
        mAuth.signInWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        Log.d("entrv", "signInWithEmail:onComplete:" + task.isSuccessful());
                        // [START_EXCLUDE]
                        MyApplication.getInstance().hideProgressDialog();
                        // [END_EXCLUDE]
                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            Log.w("entrv", "signInWithEmail", task.getException());
                            onLoginFailed();
                            return;
                        }



                        new android.os.Handler().postDelayed(
                                new Runnable() {
                                    public void run() {
                                        // On complete call either onSignupSuccess or onSignupFailed
                                        // depending on success
                                        onLoginSuccess();

                                    }
                                }, 1000);
                    }
                });
        // [END sign_in_with_email]
    }

    public void onLoginSuccess() {
        btnLogin.setEnabled(true);
        setResult(RESULT_OK, null);
        finish();
    }

    public void onLoginFailed() {
        Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show();

        btnLogin.setEnabled(true);
    }

    private boolean validateForm() {
        boolean valid = true;

        String email = txtEmailAdress.getText().toString();
        if (TextUtils.isEmpty(email)) {
            txtEmailAdress.setError("Required.");
            valid = false;
        } else {
            txtEmailAdress.setError(null);
        }

        String password = txtPassword.getText().toString();
        if (TextUtils.isEmpty(password)) {
            txtPassword.setError("Required.");
            valid = false;
        } else {
            txtPassword.setError(null);
        }

        return valid;
    }
}


기본 문서에 나와 있는 


  1. Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
  2. ref.addAuthStateListener(new Firebase.AuthStateListener() {
  3. @Override
  4. public void onAuthStateChanged(AuthData authData) {
  5. if (authData != null) {
  6. // user is logged in
  7. } else {
  8. // user is not logged in
  9. }
  10. }
  11. });

  

이 방식 으로는 성공이나 실패 아무것도 안 되었다.


그래서 firebaseauth 를 하나 만들고 이벤트 넘겨 줘서 로그인을 성고 시킬 수 있다.























반응형