해당 프로젝트

https://github.com/jaybon1/androidwork/tree/master/getApiTest

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

인터넷 연결을 위해 AndroidManifest.xml 에 아래코드를 추가해준다

<uses-permission android:name="android.permission.INTERNET"/>

--

 

 

구조

--

 

 

앱 수준의 gradle에 레트로핏과 gson 컨버터를 추가해준다(일반 gson과 다르니 참고)

    // 레트로핏
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'

    // gson
    implementation group: 'com.squareup.retrofit2', name: 'converter-gson', version: '2.3.0'

--

 

 

데이터를 가져오기위한 간단한 뷰를 짠다

--

 

 

라이엇 api에서 가져온 데이터를 이용해서  http://www.jsonschema2pojo.org/  사이트를 통해 자바 객체로 만든다

 

변환 사이트

http://www.jsonschema2pojo.org/

 

만들어진 클래스

--

 

 

외부에서 데이터를 가져오기 위한 레트로핏2 서비스

--

 

 

아래처럼 하면 매개변수로 주소값을 설정 할 수 있다

--

 

 

mxl파일의 뷰들을 사용하기 위해 가져온다

--

 

 

1. 레트로핏 객체를 생성한다
- 바뀌지 않는 baseUrl 을 입력
- 가져온 데이터를 자바 객체로 만들기 위한 Gson 컨버터 입력

2. RiotService를 만들어준다
3. RiotService에서 데이터를 가져온다
4. 콜백이 오면 조건에 맟춰서 함수가 실행된다
5. response.body()에 담긴 자바객체를 가져온다 / 텍스트뷰에 뿌려준다
6. 통신에 실패할 경우 메시지를 띄운다

--

 

 

테스트

--

 

 

리얼타임데이터베이스 - 관계형

클라우드파이어스토어 - NoSql

 

 

 

 

 

 

 

 

 

 

 

컬렉션

자바의 컬렉션과 비슷하지만

데이터베이스의 개념으로 생각하면 테이블이라고 생각하면 된다

 

 

 

 

자동ID - 프라이머리키를 안만들어도 자동으로 만들어준다, 속도가 빠르니 사용

자동ID 클릭

 

 

 

 

컬렉션을 문서형태로 넣는다고 보면된다

문서는 각각 다를 수 있다 (필드가 다를 수 있음)
- 제약이 없다 
- 정합성 무결성 보장이 되지 않는다
- 순서 보장이 되지않는다

 

 

 

똑같이 만드는 경우

 

필드를 다른형태로 만드는 경우

 

테스트용으로 총 5개를 넣어보자

 

순서가 보장되지 않기 때문에 createDate 등 날짜로 정렬하거나, 번호를 직접 넣어줘야한다

문서의 ID값을 필드에 넣어줘야 좋다

 

 

포린키

하나의 유저를 팔로우 할 경우, 

 

 

 

 

 

id -  팔로우할 id

 

 

팔로우 할 때 6을 넣는 것이 아니라 컬렉션을 만들어서 팔로우 한 사람들의 문서를 한번 더 적는 것

입력할 때는 번거롭지만 SELECT 할 때는 성능이 좋다

 

검색할 때

/user/6

/user/7/follow

RestApi와 비슷하다

---------

 

컬렉션 삭제

 

 

 

  username: ssar,
  password: 123,
  email: ssar@nate.com,
  phone:0102222,
  address:부산


위에서 받은 데이터를 firebase 메일 가입으로 넣고
Authentication - email , password 

생성된 UID를 포함해서 firebase store에 입력한다

유저 {
  id:1,
  uid: ajsdfjalsdf,
  username: ssar,
  password: 123,
  email: ssar@nate.com,
  phone:0102222,
  address:부산,
  date: 10시
}

 

post{
  id : 1,
  userId : 1,
  title: 제목,
  content: 내용,
  ~~
}

 

 

-----------

 

 

 

 

처음오셨다면 아래링크를 먼저 확인하세요

https://ondolroom.tistory.com/741

 

안드로이드 // firebase로 구글로그인하기

firebase 프로그래머의 필수사항이 되고 있다 push 기술 - 원래는 pull 기술 push 기술은 부하 때문에 잘 만들기 어렵다(while을 클라이언트만큼 돌려야하기 때문에 부하가 크다) firebase는 부하가 적은 pu

ondolroom.tistory.com

 

아래 사이트를 먼저 확인

https://firebase.google.com/docs/auth/android/start?authuser=0

 

Android에서 Firebase 인증 시작하기

Firebase에 앱 연결 Android 프로젝트에 Firebase를 추가하지 않았다면 먼저 추가합니다. 프로젝트 수준 build.gradle 파일의 buildscript 및 allprojects 섹션에 Google의 Maven 저장소가 포함되어야 합니다. 앱에 Fir

firebase.google.com

 

--

 

 

AndroidManifest.xml

인터넷 권한 획득을 위해 아래코드 추가

<uses-permission android:name="android.permission.INTERNET"/>

--

 

 

프로젝트 단위 build.gradle

'com.google.gms:google-services:4.3.3' 코드를 추가(3.0.0도 가능)

    dependencies {
        classpath "com.android.tools.build:gradle:4.0.0"
        classpath 'com.google.gms:google-services:4.3.3' // 추가

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

--

 

 

앱 단위 build.gradle

맨 바깥에 아래코드 추가

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

dependencies 안에 아래코드 추가

    //firebase create account
    implementation 'com.google.firebase:firebase-auth:19.3.2'

--

 

 

activity_main.xml

아래와 같이 뷰를 짜준다

--

 

 

MainActivity

더보기
package com.jaybon.firebasecreateaccounttest;

import androidx.annotation.NonNull;
import androidx.appcompat.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.TextView;
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;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";
    private MainActivity mContext = MainActivity.this;

    private FirebaseAuth mAuth;
    private TextView tv;
    private TextView tv1;
    private EditText email1;
    private EditText password1;
    private Button sign;
    private Button login;
    private Button logout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Initialize Firebase Auth
        mAuth = FirebaseAuth.getInstance();

        tv = findViewById(R.id.tv);
        tv1 = findViewById(R.id.tv1);

        email1 = findViewById(R.id.email);
        password1 = findViewById(R.id.password);

        sign = findViewById(R.id.sign);
        sign.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createAccount(email1.getText().toString(), password1.getText().toString());
            }
        });



        login = findViewById(R.id.login);
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signIn(email1.getText().toString(), password1.getText().toString());
            }
        });


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

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
    }

    private void createAccount(String email, String password) {
        Log.d(TAG, "createAccount:" + email);
        if (!validateForm()) {
            return;
        }

        mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                Log.d(TAG, "onComplete: 들어옴");
                if (task.isSuccessful()) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "createUserWithEmail:success");
                    FirebaseUser user = mAuth.getCurrentUser();
                    tv.setText(user.getEmail());
                    tv1.setText("회원가입됨");
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "createUserWithEmail:failure", task.getException());
                    Toast.makeText(mContext, "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void signIn(String email, String password) {
        Log.d(TAG, "signIn:" + email);
        if (!validateForm()) {
            return;
        }

        mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                Log.d(TAG, "onComplete: 들어옴");
                if (task.isSuccessful()) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithEmail:success");
                    FirebaseUser user = mAuth.getCurrentUser();
                    tv.setText(user.getEmail());
                    tv1.setText("로그인됨");
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithEmail:failure", task.getException());
                    Toast.makeText(mContext, "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void logout() {
        mAuth.signOut();
        Log.d(TAG, "signOut: 사인아웃!!!!!!!!!!!!!"+mAuth.getCurrentUser());
    }

    private boolean validateForm() {
        boolean valid = true;

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

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

        return valid;
    }
}

--

 

입력한 이메일과 비번이 공백인지 확인

--

 

 

회원가입을 진행하는 함수

--

 

 

로그인을 진행하는 함수

--

 

 

로그아웃을 하는 로직

--

 

 

회원가입 테스트

 

 

firebase 프로그래머의 필수사항이 되고 있다

push 기술 -

원래는 pull 기술

push 기술은 부하 때문에 잘 만들기 어렵다(while을 클라이언트만큼 돌려야하기 때문에 부하가 크다)

firebase는 부하가 적은 push기술을 가지고 있다

구글이 서버가 되고 내 앱이 클라이언트

 

Paas - 플랫폼 애즈 어 서비스 (파이어베이스를 통해서 로그인)

트래픽이적으면 돈이 안들고 트래픽이 늘면 돈이 든다

--

프로젝트 생성

--

 

 

firebase로 가서 구글 로그인 하자

--

 

시작하기 클릭

--

 

프로젝트 만들기 클릭

--

 

 

--

 

 

애널리틱스 - 웹에 달아놓으면 사람들이 해당 웹에서 이동한 경로를 분석 할 수 있다

유튜브처럼 사용자가 이용한 내역을 분석 - 사용자 추적

지금 프로젝트에서는 달지 않음.

(추후 자바스크립트에 달아서 테스트 해보기)

--

 

 

--

 

 

ios 안드로이드 웹에 추가 가능

안드로이드 선택

--

 

 

나의 진짜 패키지명을 넣어야 한다

다른 패키지명을 넣었을 경우 google-services.json파일을 수정하여 패키지명을 변경하면 된다

--

 

 

디버그 서명인증서 만들기

안넣으면 안되는게 너무많아서 넣어주자

--

 

 

안드로이드 스튜디오로 가서 오른쪽 Gradle을 눌러 signingReport를 클릭하면

아래와 같이 해시값이 나온다

--

 

위의 디버그 서명인증서에 SHA1 값을 넣어준다

--

 

--

 

다운로드한다

--

 

오른쪽 위 Android를 눌러 Project로 바꾸고 app폴더에 파일을 넣어준다

--

 

프로젝트 단위 빌드 그래들로 이동

아래코드를 dependencies 하위에 넣어준다

        // firebase
        classpath 'com.google.gms:google-services:4.3.3' // 안되면 3.0.0 입력

--

 

앱 단위 빌드 그래들로 이동

 

맨 바깥에 아래 코드를 입력한다

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

dependencies 하위에 아래코드를 넣어준다

    //firebase
    implementation 'com.firebaseui:firebase-ui-auth:6.2.0'

--

 

 

콘솔로이동

--

 

문서로 이동

--

 

맨아래 왼쪽 인증버튼클릭

--

 

 

가이드를 확인한다

--

 

 

안드로이드에 firebase추가 하는법 설명 (가이드의 영상 및 설명을 참고하자)

https://firebase.google.com/docs/android/setup?authuser=0

 

Android 프로젝트에 Firebase 추가

기본 요건 Android 스튜디오를 설치하거나 최신 버전으로 업데이트합니다. Android 앱이 다음을 충족하는지 확인합니다. API 수준 16(Jelly Bean) 이상 타겟팅 Gradle 4.1 이상 사용 앱을 실행할 기기 또는 ��

firebase.google.com

--

 

로그인가이드 선택

--

 

 

앱 단위 빌드 그래들로 이동하여 dependencies 하위에 아래 코드를 추가해준다

implementation 'com.firebaseui:firebase-ui-auth:6.2.0'

--

 

 

구글로그인 선택

--

 

테스트할 레이아웃에 SignInButton과 로그아웃 버튼을 추가한다

--

 

메인 액티비티에 아래코드를 참고하여 추가

package com.jaybon.cosapp;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

import com.firebase.ui.auth.AuthUI;
import com.firebase.ui.auth.IdpResponse;
import com.google.android.gms.common.SignInButton;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SignInButton btnGoogleLogin = findViewById(R.id.btn_google_login);
        Button btnGoogleLogout = findViewById(R.id.btn_google_logout);


        btnGoogleLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // Choose authentication providers
                List<AuthUI.IdpConfig> providers = Arrays.asList(
                        new AuthUI.IdpConfig.GoogleBuilder().build());

                // 새로운 화면을 띄우는 것 (통신 아님)
                // 띄운후 로그인 하면 통신 (알아서 처리됨)
                startActivityForResult( // 화면이 꺼지면 리턴값을 받는것
                        AuthUI.getInstance()
                                .createSignInIntentBuilder()
                                .setAvailableProviders(providers)
                                .build(),
                        3648);
            }
        });

        btnGoogleLogout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseAuth.getInstance().signOut();
                Log.d(TAG, "onClick: 로그아웃" + FirebaseAuth.getInstance().getCurrentUser());
            }
        });
    }

    // 구글 로그인 화면 꺼지면 실행
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 3648) {

            // 응답받은 데이터를 받는다
            // 동시에 오브젝트객체를 메모리에 띄워준다
            // firebaseAuth 힙영역으로 만들어서 사용자의 모든 정보를 담아준다
            IdpResponse response = IdpResponse.fromResultIntent(data);

            if (resultCode == RESULT_OK) {

                // FirebaseAuth 힙영역으로 만들어서 사용자의 모든 정보를 담아준다
                // 세션
                // 스태틱으로 만들어져있음- 모든 액티비티에서 접근가능 (앱은 나혼자 쓰니까)
                // 쉐어드프리퍼런스 안만들려면 이런식으로 만들어야함
                // Successfully signed in 로그인성공
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

                // 로그인되었으니 인텐트해서 다른 액티비티로 이동하면 된다.
                Log.d(TAG, "onActivityResult: 로그인완료 : " + user.getEmail());
                Log.d(TAG, "onActivityResult: 로그인완료 : " + FirebaseAuth.getInstance().getCurrentUser());
                Log.d(TAG, "onActivityResult: 로그인완료 : " + response);


            } else {

                Log.d(TAG, "onActivityResult: 실패 : " + response.getError());
            }
        }
    }
}

 

 

메니페스트 파일에 인터넷을 권한 획득을 위한 코드를 넣는다

--

 

실행하여 구글 로그인 해보자

 

--

 

 

--

 

 

로그인해보면 아래 Users에 정보가 확인된다

--

 

 

 

 

 

 

 

 

 

 

세팅완료

----

 

 

 

 

 

 

'App > Android' 카테고리의 다른 글

안드로이드 // firestore 연습  (0) 2020.08.13
안드로이드 // firebase - email 가입 및 로그인  (0) 2020.08.12
안드로이드 // 툴바 헬퍼 공부 참고  (0) 2020.08.06
안드로이드 // MVVM  (0) 2020.08.06
안드로이드 // AAC  (0) 2020.08.06

 

https://github.com/codingspecialist/InstagramClone-Android-Firestore

 

여러액티비티에서 툴바 + 드로어블 사용하려면

헬퍼를 이용해야한다

 

메인

    private void setupBottomNavigationView(){
        BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView);
        BottomNavigationViewHelper.enableNavigation(mContext, bottomNavigationView);
        Menu menu = bottomNavigationView.getMenu();
        MenuItem menuItem = menu.getItem(ACTIVITY_NUM);
        menuItem.setChecked(true);
    }

 

layout_bottom_navigation_view.xml

  
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottomNavigationView"
            android:background="@drawable/white_grey_border_top"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:labelVisibilityMode="unlabeled"
            app:menu="@menu/bottom_navigation_menu">

        </com.google.android.material.bottomnavigation.BottomNavigationView>

    </RelativeLayout>
</merge>

 

 

 

새로운 아키텍쳐나 신기술을 알려줌

 

 

 

안드로이드 패턴은 종류가 다양하다

기본적인 패턴은 MVC

MVC - 웹

MVP - 앱 - 프레젠테이션

MVVM - 데이터변경하면 자동으로 뷰에 데이터가 들어간다

MVVM + 레트로핏 + (스프링 5.0 리액티브 (톰캣이 아닌 네티서버))

톰캣 - 리퀘스트 - 쓰레드 생성(리퀘스트수만큼 생성) - 실행

네티 - 쓰레드를 하나로 프로미스를 이용해서 동시실행 (노드js가 사용한다)

쓰레드 여러개 - 컨텍스트 스위칭시 버퍼에 저장해서 순차 실행 

혹시 네티 공부한다면 네티서버가 왜 좋은지 분석

클라우드 서버도 리액티브 서버이다 (몽고DB)

조인하면 연관된 데이터 다뽑아냄

 

NOSQL (몽고DB)
- JSON을 사용한다
- 관계형 데이터베이스에서는 속성에 단일속성을 넣는데,
NOSQL (몽고DB) JSON이라서  속성에 오브젝트 또는 오브젝트 배열
- 처리속도가 빠르다
- SELECT 시 빠르다
- INSERT UPDATE DELETE 시 느리다
- 일관성이 깨진다
- 수정의 속도를 버리고 SELECT의 퍼포먼스를 올린다

 

은행은 신뢰성이 중요하기 때문에 관계형데이터베이스를 사용한다

 

참고

https://github.com/codingspecialist/Android-MVVM-AAC-V1

 

codingspecialist/Android-MVVM-AAC-V1

Contribute to codingspecialist/Android-MVVM-AAC-V1 development by creating an account on GitHub.

github.com

 

----

뷰모델 - 뷰 연결하기

 

뷰모델 만들기

 

옵저버로 구독하기

 

위 코드는 선언만 해놔서 오류가난다(DB에 연결하면 해결)

 

// 라이브데이터는 new해서 만드는게 아니다
// DB에 연결되어있으면 선언만 하면 되는데, 지금은 그게 안되기 때문
// LiveData는 함수가 getter만 있음
// MutableLiveData는 함수가 getter setter 둘 다 있음
// DB에 연결해서 쓸 때는 무조건 LiveData
// 레트로핏2 등을 사용할 때에는 MutableLiveData

 

데이터가 변경되면 옵저버가 관찰하고 있다가 뷰의 데이터를 변경한다

이까지로 프로젝트 하면된다

 

 

----------

VM뷰모델 - Repository - 레트로핏2 - 서버

--------------

DB에서 리파지토리로 받는 타입이 중요하다

레파지토리가
MutableLiveData (변하는데이터)
DB에서 다운받은 데이터를 연결시키면
Room이랑 연결된다

인서트 딜리트 등을 비동기 쓰레드 asynctask로 돌림

------------

예제 따라해보기

https://junghun0.github.io/2019/05/22/android-viewmodel/

 

[Android] LiveData + ViewModel 사용해보기 - Junghoon's Blog

Android Architecture Components - ViewModel

Junghun0.github.io

-----------

 

 

 

 

 

 

 

 

구독패턴(LiveData, ViewModel 등을 공부)

https://medium.com/@maryangmin/android-architecture-components-%EC%86%8C%EA%B0%9C-1-8e04491be1f6

 

Android Architecture Components 소개 (1)

Google I/O 2017에서 새로운 라이브러리들을 Android Architecture Components(AAC)로 묶어서 발표하였습니다. Google은 AAC를 안드로이드 앱을 개발하면서 자주 만날 수 있는 문제들을 쉽게 해결할 수 있는…

medium.com

 

 

Lifecycles - 

액티비티의 상태데이터는 액티비티가 들고 있다

화면을 움직인다는 것은 요소를 파괴하고 재생성

데이터 관리가 안됨

그래서 데이터 보관을 뷰모델이 한다 -  즉 액티비티의 데이터를 뷰모델이 들고 있다 - 생명주기의 영향을 받지 않는다

액티비티가 뷰모델을 구독하게 함

 

----------------

 

 

 

 

 

 

 

프로그래밍의 목적은 데이터베이스의 내용과 동기화 하는 것을 따라감

// DB내용변경 -> 어댑터 데이터 변경 -> UI 갱신
// MVVM의 경우 DB내용변경 -> 어댑터 데이터 변경시 UI 자동갱신
// 리액티브 프로그래밍의 경우 DB내용변경시 어댑터 데이터 자동갱신 +UI 자동갱신

--------

'App > Android' 카테고리의 다른 글

안드로이드 // MVVM  (0) 2020.08.06
안드로이드 // AAC  (0) 2020.08.06
안드로이드 // 액션바 바꾸기  (0) 2020.08.06
안드로이드 // Room 사용법  (0) 2020.08.06
안드로이드 // 음악 파일 등 받을 때  (0) 2020.08.06

+ Recent posts