• Firebase 를 이용해서 로그인을하고 해당아이디에 해당되는 메모를 작성할수있는 프로그램을 만들어봤다.

  • Firebase -> 모바일 서버를 개발하기 위해서는 인증, 데이터베이스, 푸시 알람, 스토리지, API 등 모든것을 개발해야 했다. 하지만 모바일 서버는 이런 모든 것을 구성하는데 구성하는 범위가 매번 새로운 앱들과 차이 나지 않기 때문에 리눅스를 설치하고, FTP를 설치하고, 데이터베이스를 설치하고, 노드 서버나 스프링 서버를 올리고, 방화벽을 올리고, 도메인을 구입하는 등 이런 반복적인 작업을 앱 개발 할 대마다 하는 것은 엄청난 시간낭비이다.

FireBase 는 이 모든 플랫폼을 프로젝트 구축 시 자동적으로 만들어준다.

MemoVo

package com.example.ex14;

import java.io.Serializable;

public class MemoVO implements Serializable {
    private String key;
    private String email;
    private String date;
    private String contents;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getContents() {
        return contents;
    }

    public void setContents(String contents) {
        this.contents = contents;
    }

    @Override
    public String toString() {
        return "MemoVO{" +
                "key='" + key + '\'' +
                ", email='" + email + '\'' +
                ", date='" + date + '\'' +
                ", contents='" + contents + '\'' +
                '}';
    }
}

Main 페이지Permalink

  • MainAcitivity.java ```java package com.example.ex14;

import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent; import android.os.Bundle; 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;

public class MainActivity extends AppCompatActivity { EditText email, pass; private FirebaseAuth mAuth;

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

    mAuth = FirebaseAuth.getInstance();

    getSupportActionBar().setTitle("로그인");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_login);

    email = findViewById(R.id.email);
    pass= findViewById(R.id.pass);

    //Register 버튼을 클릭한 경우
    Button register = findViewById(R.id.register);
    register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String strEmail = email.getText().toString();
            String strPass = pass.getText().toString();
            if(strPass.length()<8){
                Toast.makeText(MainActivity.this,
                        "비밀번호를 8자리 이상입력하세요!", Toast.LENGTH_SHORT).show();
            }else if(strEmail.equals("")) {
                Toast.makeText(MainActivity.this,
                        "이메일을 입력하세요!", Toast.LENGTH_SHORT).show();
            }else{
                //이메일, 비밀번호 등록
                mAuth.createUserWithEmailAndPassword(strEmail, strPass)
                        .addOnCompleteListener(MainActivity.this,
                                new OnCompleteListener<AuthResult>(){
                                    @Override
                                    public void onComplete(@NonNull Task<AuthResult> task) {
                                        if (task.isSuccessful()) {
                                            Toast.makeText(MainActivity.this, "등록완료!", Toast.LENGTH_SHORT).show();
                                        }else{
                                            Toast.makeText(MainActivity.this, "등록실패!", Toast.LENGTH_SHORT).show();
                                        }
                                    }
                                });
            }
        }
    });

    //로그인 체크
    Button login = findViewById(R.id.login);
    login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String strEmail= email.getText().toString();
            String strPass = pass.getText().toString();
            if(strPass.length()<8){
                Toast.makeText(MainActivity.this,
                        "비밀번호를 8자리 이상입력하세요!", Toast.LENGTH_SHORT).show();
            }else if(strEmail.equals("") || strEmail.indexOf("@")<0) {
                Toast.makeText(MainActivity.this,
                        "이메일에는 @가 꼭들어갑니다!", Toast.LENGTH_SHORT).show();
            }else{
                //로그인 체크
                mAuth.signInWithEmailAndPassword(strEmail, strPass)
                        .addOnCompleteListener(MainActivity.this,
                                new OnCompleteListener<AuthResult>() {
                                    @Override
                                    public void onComplete(@NonNull Task<AuthResult> task) {
                                        if (task.isSuccessful()) {
                                            Toast.makeText(MainActivity.this, "로그인 성공!", Toast.LENGTH_SHORT).show();
                                            System.out.println(".....로그인 성공");
                                            Intent intent = new Intent(MainActivity.this, MemoActivity.class);
                                            startActivity(intent);
                                        }else{
                                            Toast.makeText(MainActivity.this, "로그인 실패!", Toast.LENGTH_SHORT).show();
                                        }
                                    }
                                });
            }
        }
    });
} } ```
  • acivity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:padding="30sp"
    android:layout_marginTop="150sp">

    <EditText
        android:id="@+id/email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Email"
        android:fontFamily="@font/kang"
        android:text="test01@test.com"/>
    <EditText
        android:id="@+id/pass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:hint="Password"
        android:fontFamily="@font/kang"
        android:text="12341234"/>

    <Button
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:backgroundTint="#E2D0F9"
        android:text="Login"
        android:fontFamily="@font/ho"/>
    <Button
        android:id="@+id/register"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:backgroundTint="#E2D0F9"
        android:text="Register"
        android:fontFamily="@font/ho"/>

</LinearLayout>

-> 메인페이지의 엑티비티와 레이아웃이다. 로그인과 회원가입을 할수있는 페이지다.

엑티비티메인

Memo 메인Permalink

  • MemoAcitivity.java
package com.example.ex14;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.ArrayList;

public class MemoActivity extends AppCompatActivity {
    FirebaseUser user;
    ArrayList<MemoVO> array = new ArrayList<>();
    FirebaseDatabase db;
    DatabaseReference ref;
    MemoAdapter memoAdapter = new MemoAdapter();

    @Override
    protected void onRestart() {
        array.clear();
        callList();
        super.onRestart();
    }

    public void callList(){
        ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                MemoVO vo = snapshot.getValue(MemoVO.class);
                System.out.println(vo.toString());
                array.add(vo);
                System.out.println(".....데이터갯수: "+array.size());
                memoAdapter.notifyDataSetChanged();

            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                array.clear();
                callList();
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

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

            }
        });
    }

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

        user=FirebaseAuth.getInstance().getCurrentUser();
        db= FirebaseDatabase.getInstance("https://my-project-c0f17-default-rtdb.firebaseio.com/");
        ref=db.getReference("memos").child(user.getUid());
        callList();

        RecyclerView list = findViewById(R.id.list);
        list.setAdapter(memoAdapter);
        list.setLayoutManager(new LinearLayoutManager(this));

        user= FirebaseAuth.getInstance().getCurrentUser();
        getSupportActionBar().setTitle(user.getEmail());
        getSupportActionBar().setDisplayShowTitleEnabled(true);

        FloatingActionButton edit = findViewById(R.id.edit);
        edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MemoActivity.this, InsertActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    //메모어댑터
    class MemoAdapter extends RecyclerView.Adapter<MemoAdapter.ViewHolder>{

        @NonNull
        @Override
        public MemoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view =getLayoutInflater().inflate(R.layout.item, parent , false);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull MemoAdapter.ViewHolder holder, int position) {
            MemoVO vo= array.get(position);
            holder.contents.setText(vo.getContents());
            holder.date.setText(vo.getDate());
            holder.item.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MemoActivity.this,ReadActivity.class );
                    intent.putExtra("vo",vo);
                    startActivity(intent);

                }
            });

        }

        @Override
        public int getItemCount() {
            return array.size();
        }

        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView date, contents;
            CardView item;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                date = itemView.findViewById(R.id.date);
                contents= itemView.findViewById(R.id.contents);
                item = itemView.findViewById(R.id.item);
            }
        }
    }
}
  • activity_memo.xml ```xml <?xml version=”1.0” encoding=”utf-8”?>
-> 로그인하고 들어갔을때 보이는 페이지이다. 해당 아이디의 메모 정보를 살펴볼수있다.

![메모리스트](/assets/images/메모리스트.JPG)


## Memo 등록

- InsertActivity.java

```java
package com.example.ex14;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.text.SimpleDateFormat;
import java.util.Date;

public class InsertActivity extends AppCompatActivity {
    FirebaseUser user;
    EditText contents;
    FirebaseDatabase db;
    DatabaseReference ref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);
        contents = findViewById(R.id.contents);

        user = FirebaseAuth.getInstance().getCurrentUser();
        getSupportActionBar().setTitle("메모작성 | " +user.getEmail());
        getSupportActionBar().setDisplayShowTitleEnabled(true);

        db=FirebaseDatabase.getInstance("https://my-project-c0f17-default-rtdb.firebaseio.com/");


        //저장버튼을 클릭한경우
        FloatingActionButton edit = findViewById(R.id.edit);
        edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String strContents = contents.getText().toString();
                if(strContents.equals("")){
                    Toast.makeText(InsertActivity.this,
                            "메모내용을 입력하세요!", Toast.LENGTH_SHORT).show();
                }else {
                    //메모저장
                    MemoVO vo= new MemoVO();
                    vo.setContents(strContents);
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    vo.setDate(sdf.format(new Date()));
                    vo.setEmail(user.getEmail());
                    ref=db.getReference("memos").child(user.getUid()).push();
                    vo.setKey(ref.getKey());
                    ref.setValue(vo);
                    finish();

                }
            }
        });

    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()) {
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}
  • activity_insert.xml ```xml <?xml version=”1.0” encoding=”utf-8”?>

-> 메모를 insert 할수있는 버튼을 만들고, 메모등록을 할수있다. 아래 사진처럼 페이지가 나온다.


![메모작성](/assets/images/메모작성.JPG)


## 메모정보

ReadActivity.java
```java
package com.example.ex14;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.text.SimpleDateFormat;
import java.util.Date;

public class ReadActivity extends AppCompatActivity {
    FirebaseUser user;
    MemoVO vo;
    EditText contents;
    FirebaseDatabase db;
    DatabaseReference ref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);
        db= FirebaseDatabase.getInstance("https://my-project-c0f17-default-rtdb.firebaseio.com/");


        user= FirebaseAuth.getInstance().getCurrentUser();
        getSupportActionBar().setTitle("정보수정 | "+user.getEmail());
        getSupportActionBar().setDisplayShowTitleEnabled(true);

        Intent intent = getIntent();
        vo=(MemoVO)intent.getSerializableExtra("vo");
        System.out.println("read :" +vo.toString());

        contents= findViewById(R.id.contents);
        contents.setText(vo.getContents());

        FloatingActionButton edit =findViewById(R.id.edit);
        edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String strContent =contents.getText().toString();
                if(!vo.getContents().equals(strContent)){
                    AlertDialog.Builder box = new AlertDialog.Builder(ReadActivity.this);
                    box.setTitle("질의");
                    box.setMessage("변경된 내용을 수정하실래요?");
                    box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //메모수정
                            vo.setContents(strContent);
                            SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                            vo.setDate(sdf.format(new Date()));
                            ref=db.getReference("memos").child(user.getUid()+ "/"+vo.getKey());
                            ref.setValue(vo);
                            finish();
                        }
                    });
                    box.setNegativeButton("아니오", null);
                    box.show();
                }
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch ( item.getItemId()){
            case android.R.id.home:
                finish();
                break;
            case R.id.delete:
                AlertDialog.Builder box = new AlertDialog.Builder(this);
                box.setTitle("질의");
                box.setMessage("메모를 삭제하실래요?");
                box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ref=db.getReference("memos").child(user.getUid()+ "/"+vo.getKey());
                        ref.removeValue();
                        finish();
                    }
                });
                box.setNegativeButton("아니오",null);
                box.show();
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.read, menu);
        return super.onCreateOptionsMenu(menu);
    }
}

-> 메모정보를 읽어온다.

메모리드


끝! Firebase 를 처음사용해봤는데 사용하기 편리했다 ! 처음하는거라 조금 헷갈리는 점도있었지만 db직접연결해서 하는 것보다 훨 편리해서 좋았다.

댓글남기기