Android

회원가입, 로그인, 로그아웃 기능 앱(app)을 Retrofit2 라이브러리로 만들기

567Rabbit 2024. 6. 13. 15:47

 

Restful API(메모 API)를 만들고, MySQL과 연동하여 Postman으로 개발한 후, 진행하였다.

 

 

 

 

 

액티비티 세 개 만들기

 

 

 


환경변수 설정하기

 



 

 

Retrofit 라이브러리 설치하기

 

build.gradle.kts(:app)에서

implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.retrofit2:converter-gson:2.11.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")

 

 

하고, Sync 눌러준다.

 

 

 

 

 

activity_login.xml 만들기

 

 

글자에 밑줄 생기게 하기

 

 

 

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="10dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="30dp"
            android:gravity="center"
            android:text="로그인"
            android:textSize="32sp" />

        <EditText
            android:id="@+id/editEmail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:ems="10"
            android:hint="이메일 입력..."
            android:inputType="textEmailAddress"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/editPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="50dp"
            android:ems="10"
            android:hint="비밀번호 입력..."
            android:inputType="textPassword"
            android:textSize="20sp" />

        <Button
            android:id="@+id/btnLogin"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="30dp"
            android:text="로그인"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/txtRegister"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/txt_register"
            android:textColor="#3F51B5"
            android:textSize="20sp" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

 

LoginActivity.java

 

화면연결 자바코드 작성하기 

 

package com.~.memo;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class LoginActivity extends AppCompatActivity {

    EditText editEmail;
    EditText editPassword;
    TextView txtRegister;
    Button btnLogin;

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

        editEmail = findViewById(R.id.editEmail);
        editPassword = findViewById(R.id.editPassword);
        txtRegister = findViewById(R.id.txtRegister);
        btnLogin = findViewById(R.id.btnLogin);

        txtRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //회원가입 액티비티 실행
                Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
                startActivity(intent);
                finish();
            }
        });
        
    }
}

 

 

 

 

activity_Register.xml 만들기

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="10dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="30dp"
            android:gravity="center"
            android:text="회원가입"
            android:textSize="32sp" />

        <EditText
            android:id="@+id/editEmail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:ems="10"
            android:hint="이메일 입력..."
            android:inputType="textEmailAddress"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/editPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:ems="10"
            android:hint="비밀번호 입력..."
            android:inputType="textPassword"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/editNickname"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="50dp"
            android:ems="10"
            android:hint="닉네임 입력..."
            android:inputType="text"
            android:textSize="20sp" />

        <Button
            android:id="@+id/btnRegister"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="30dp"
            android:text="회원가입"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/txtLogin"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/txt_login"
            android:textColor="#3F51B5"
            android:textSize="20sp" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

 

RegisterActivity.java

 

화면연결 자바코드 작성하기 

package com.~.memo;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;


public class RegisterActivity extends AppCompatActivity {
    
    EditText editEmail;
    EditText editPassword;
    EditText editNickname;
    Button btnRegister;
    TextView txtLogin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        
        editEmail = findViewById(R.id.editEmail);
        editPassword = findViewById(R.id.editPassword);
        editNickname = findViewById(R.id.editNickname);
        btnRegister = findViewById(R.id.btnRegister);
        txtLogin = findViewById(R.id.txtLogin);
        
        txtLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 로그인 액티비티 실행
                Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                startActivity(intent);
                finish();
            }
        });
        
    }

}

 

 

 

 

 

api, config 만들기

 

 

 

 

NetworkClient.java

package com.~.memo.api;

import android.content.Context;

import com.~.memo.config.Config;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class NetworkClient {

    public static Retrofit retrofit;

    public static Retrofit getRetrofitClient(Context context){
        if(retrofit == null){
            // 통신 로그 확인할때 필요한 코드
            HttpLoggingInterceptor loggingInterceptor =
                    new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

            // 네트워크 연결관련 코드
            OkHttpClient httpClient = new OkHttpClient.Builder()
                    .connectTimeout(1, TimeUnit.MINUTES)
                    .readTimeout(1, TimeUnit.MINUTES)
                    .writeTimeout(1, TimeUnit.MINUTES)
                    .addInterceptor(loggingInterceptor)
                    .build();
            // 네트워크로 데이터를 보내고 받는
            // 레트로핏 라이브러리 관련 코드
            retrofit = new Retrofit.Builder()
                    .baseUrl(Config.DOMAIN)
                    .client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

 

 

 

UserApi.java

package com.~.memo.api;

import com.~.memo.model.User;
import com.~.memo.model.UserRes;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;

public interface UserApi {  //인터페이스로 바꿔준다.

    // HTTP Method 써주고, 그 안에는 경로를 써준다.
    // 함수의 리턴 데이터 타입은, Call 안에 응답으로 받을 클래스를 넣어준다.
    // 함수명을 작성해주고, 보낼 데이터는 파라미터에 작성, 받을 데이터는 리턴에 작성.
    
    // 회원가입 API
    @POST("/dev/user/register")
    Call<UserRes> register(@Body User user);

    // 로그인 API
    @POST("/dev/user/login")
    Call<UserRes> login(@Body User user);
    
}

 

 

 

Config.java

package com.yujinoh.memo.config;

public class Config {
    public static final String YOUTUBE_KEY = "자신의 key 입력";
    public static final String DOMAIN = "자신의 아마존 api 주소 입력";
    
    //public static final String DOMAIN = "https://vrskmc6b8c.execute-api.ap-northeast-2.amazonaws.com";

}

 

 

 

 

 

model 패키지 만들고, User 와 UserRes 클래스 만들기

 

User 클래스 만들기

package com.~.memo.model;

public class User {

    public String email;
    public String password;
    public String nickname;

    public User(){

    }

    public User(String email, String password){
        this.email = email;
        this.password = password;
    }

    public User(String email, String password, String nickname) {
        this.email = email;
        this.password = password;
        this.nickname = nickname;
    }
}

 

 

 

UserRes 클래스

package com.~.memo.model;

public class UserRes {

    public String result;
    public String accessToken;
}

 

 

 

 

 

 

RegisterActivity.java

 

회원가입 버튼 누르면, 회원가입 되도록 postman과 연결하기

 

package com.~.memo;

import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.google.android.material.snackbar.Snackbar;
import com.~.memo.api.NetworkClient;
import com.~.memo.api.UserApi;
import com.~.memo.config.Config;
import com.~.memo.model.User;
import com.~.memo.model.UserRes;

import java.util.regex.Pattern;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;


public class RegisterActivity extends AppCompatActivity {

    EditText editEmail;
    EditText editPassword;
    EditText editNickname;
    Button btnRegister;
    TextView txtLogin;

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

        editEmail = findViewById(R.id.editEmail);
        editPassword = findViewById(R.id.editPassword);
        editNickname = findViewById(R.id.editNickname);
        btnRegister = findViewById(R.id.btnRegister);
        txtLogin = findViewById(R.id.txtLogin);

        txtLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 로그인 액티비티 실행
                Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                startActivity(intent);
                finish();
            }
        });

        btnRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 1. 유저가 입력한 데이터들을 가져온다.
                String email = editEmail.getText().toString().trim();
                String password = editPassword.getText().toString().trim();
                String nickname = editNickname.getText().toString().trim();

                if(email.isEmpty() || password.isEmpty() || nickname.isEmpty()){
                    Snackbar.make(btnRegister, "필수항목입니다. 모두입력하세요.", Snackbar.LENGTH_SHORT).show();
                    return;
                }
                // 2. 이메일 형식이 올바른지 체크
                // 자바의 이메일 형식 체크하는 라이브러리 Pattern
                Pattern pattern = Patterns.EMAIL_ADDRESS;
                if(pattern.matcher(email).matches() == false){
                    Snackbar.make(btnRegister,"이메일 형식을 바르게 작성하세요.",Snackbar.LENGTH_SHORT).show();
                    return;
                }

                // 회원가입 API를 호출한다.

                // 0. 다이얼로그를 보여준다.
                showProgress();

                // 1. 레트로핏 변수 생성 : api 패키지에 NetworkClient.java 파일이 있어야 한다.
                Retrofit retrofit = NetworkClient.getRetrofitClient(RegisterActivity.this);

                // 2. api 패키지에 있는 인터페이스를 객체로 생성 : api 패키지에 인터페이스가 있어야 한다.
                UserApi api = retrofit.create(UserApi.class);

                // 3. 보낼 데이터를 만든다.
                User user = new User(email, password, nickname);

                // 4. api 함수를 만든다.
                Call<UserRes> call = api.register(user);

                // 5. api를 호출한다.
                call.enqueue(new Callback<UserRes>() {
                    @Override
                    public void onResponse(Call<UserRes> call, Response<UserRes> response) {
                        Log.i("MEMO REGISTER", ""+response.code());

                        //다이얼로그를 먼저 없앤다.
                        dismissProgress();

                        // 200 OK 일때,
                        if(response.isSuccessful()){

                            UserRes userRes = response.body();
                            Log.i("MEMO REGISTER",userRes.accessToken);

                            // 서버로부터 받은 토큰을 저장해야 한다.
                            SharedPreferences sp = getSharedPreferences(Config.SP_NAME,MODE_PRIVATE);
                            SharedPreferences.Editor editor = sp.edit();
                            editor.putString("token", userRes.accessToken);
                            editor.commit(); //앱을 삭제하기 전까지는 영구저장해준다

                            // 회원가입 액티비티는 종료를 하고 메인액티비티띄운다.
                            Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
                            startActivity(intent);
                            finish();
                            return;


                        }else if(response.code() == 500){
                            Snackbar.make(btnRegister, "이미 회원가입한 이메일입니다. 로그인하세요.",
                                    Snackbar.LENGTH_SHORT).show();
                            return;
                        }else {
                            Snackbar.make(btnRegister, "서버에 문제가 있습니다. 잠시 후 다시 시도하세요.",
                                    Snackbar.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<UserRes> call, Throwable throwable) {
                        //다이얼로그를 먼저 없앤다.
                        dismissProgress();

                    }
                });
            }
        });

    }

    // *** 서버에 데이터를 저장하거나, 수정하거나, 삭제하는 경우에 사용한다!
    Dialog dialog;
    void showProgress(){
        dialog = new Dialog(this);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setContentView(new ProgressBar(this));
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
    }
    void dismissProgress(){
        dialog.dismiss();
    }

}

 

 

 

 

LoginActivity.java

 

로그인 버튼 누르면, 로그인 되도록 postman과 연결하기

package com.yujinoh.memo;

import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.google.android.material.snackbar.Snackbar;
import com.yujinoh.memo.api.NetworkClient;
import com.yujinoh.memo.api.UserApi;
import com.yujinoh.memo.config.Config;
import com.yujinoh.memo.model.User;
import com.yujinoh.memo.model.UserRes;

import java.util.regex.Pattern;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class LoginActivity extends AppCompatActivity {

    EditText editEmail;
    EditText editPassword;
    TextView txtRegister;
    Button btnLogin;

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

        editEmail = findViewById(R.id.editEmail);
        editPassword = findViewById(R.id.editPassword);
        txtRegister = findViewById(R.id.txtRegister);
        btnLogin = findViewById(R.id.btnLogin);

        txtRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //회원가입 액티비티 실행
                Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
                startActivity(intent);
                finish();
            }
        });

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String email = editEmail.getText().toString().trim();
                String password = editPassword.getText().toString().trim();

                if(email.isEmpty() || password.isEmpty()){
                    Snackbar.make(btnLogin, "필수항목입니다. 모두 입력하세요.",Snackbar.LENGTH_SHORT).show();
                    return;
                }

                // 이메일 형식 체크 (회원가입의 코드 C&P)
                // 자바의 이메일 형식 체크하는 라이브러리 Pattern
                Pattern pattern = Patterns.EMAIL_ADDRESS;
                if(pattern.matcher(email).matches() == false){
                    Snackbar.make(btnLogin,"이메일 형식을 바르게 작성하세요.",Snackbar.LENGTH_SHORT).show();
                    return;
                }

                // 로그인 API 호출!

                // 0. 다이얼로그 표시한다.
                showProgress();

                // 1. 레트로핏 변수 만든다.
                Retrofit retrofit = NetworkClient.getRetrofitClient(LoginActivity.this);

                // 2. API 객체 생성한다
                UserApi api = retrofit.create(UserApi.class);

                // 3. 보낼 데이터를 만든다.
                User user = new User(email, password);

                // 4. api 함수를 만든다.
                Call<UserRes> call = api.login(user);

                // 5. 네트워크로 호출한다
                call.enqueue(new Callback<UserRes>() {
                    @Override
                    public void onResponse(Call<UserRes> call, Response<UserRes> response) {
                        dismissProgress();

                        if(response.isSuccessful()){

                            UserRes userRes = response.body();

                            // 서버로부터 받은 토큰을 저장해야 한다.
                            SharedPreferences sp = getSharedPreferences(Config.SP_NAME,MODE_PRIVATE);
                            SharedPreferences.Editor editor = sp.edit();
                            editor.putString("token", userRes.accessToken);
                            editor.commit(); //앱을 삭제하기 전까지는 영구저장해준다

                            // 회원가입 액티비티는 종료를 하고 메인액티비티띄운다.
                            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                            startActivity(intent);
                            finish();
                            return;

                        }else{
                            Snackbar.make(btnLogin, "서버에 문제가 있습니다. 잠시 후 다시 시도하세요.",
                                    Snackbar.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<UserRes> call, Throwable throwable) {
                        dismissProgress();
                        // 유저에게 알리고 로그남기고 리턴

                    }
                });


            }
        });

    }

    // *** 서버에 데이터를 저장하거나, 수정하거나, 삭제하는 경우에 사용한다!
    Dialog dialog;
    void showProgress(){
        dialog = new Dialog(this);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setContentView(new ProgressBar(this));
        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
    }
    void dismissProgress(){
        dialog.dismiss();
    }

}

 

 

 

 

 

로그아웃 기능 만들기

 

menu 패키지를 만들어주고, xml 파일을 만들어서 액션바에 아이콘을 넣으려고 한다.

 

 



 

https://codebunny99.tistory.com/139

 

액션바(Actionbar) 이름, 색, 백버튼, 아이콘 디자인과 삭제 방법

액션바 색 바꾸기    name도 자신이 지정하여 바꿀 수 있다.      액션바 이름 바꾸기 MainActivity.java 에서getSupportActionBar().setTitle("포스팅 리스트");  + // 액션바에 화살표 백버튼을 표시하는

codebunny99.tistory.com

 

액션바 아이콘 추가를 참고한다.

 

 

 

 

UserApi 에 로그아웃 API를 입력해준다.

 

 

 

 


MainActivity에 작성해주기

 

package com.~.memo;

import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.~.memo.adapter.MemoAdapter;
import com.~.memo.api.MemoApi;
import com.~.memo.api.NetworkClient;
import com.~.memo.api.UserApi;
import com.~.memo.config.Config;
import com.~.memo.model.Memo;
import com.~.memo.model.MemoList;
import com.~.memo.model.UserRes;

import java.util.ArrayList;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;


public class MainActivity extends AppCompatActivity {

    ProgressBar progressBar;
    Button btnAdd;
    RecyclerView recyclerView;
    ArrayList<Memo> memoArrayList = new ArrayList<>();
    MemoAdapter adapter;


    String token;

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

        // 로그인을 한 유저인지 아닌지를 체크한다.
        // 로그인을 안했으면, 로그인 액티비티를 띄우고,
        // 로그인을 했으면, 인증토큰을 가져온다.

        SharedPreferences sp = getSharedPreferences(Config.SP_NAME, MODE_PRIVATE);
        token = sp.getString("token", "");

        if(token.isEmpty()){
            // 로그인 액티비티를 띄운다.
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
            return;
        }

        progressBar = findViewById(R.id.progressBar);
        btnAdd = findViewById(R.id.btnAdd);
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));

        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override

            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AddActivity.class);
                startActivity(intent);
            }
        });

        // 내 메모 리스트를 가져온다.
        getNetworkData();

    }

    private void getNetworkData() {

        Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);

        MemoApi api = retrofit.create(MemoApi.class);

        Call<MemoList> call = api.getMemoList("Bearer "+token);

        call.enqueue(new Callback<MemoList>() {
            @Override
            public void onResponse(Call<MemoList> call, Response<MemoList> response) {
                progressBar.setVisibility(View.GONE);

                if(response.isSuccessful()){

                    MemoList memoList = response.body();

                    // 비어있는 어레이리스트에, 받아온 리스트를 담아준다!

                    memoArrayList.addAll( memoList.getItems() );

                    // 데이터가 준비 완료 되었으니,
                    // 어뎁터 만들어서, 리사이클러뷰에 적용한다.
                    adapter = new MemoAdapter(MainActivity.this, memoArrayList);
                    recyclerView.setAdapter(adapter);


                }else {

                }

            }

            @Override
            public void onFailure(Call<MemoList> call, Throwable throwable) {
                progressBar.setVisibility(View.GONE);
            }
        });

    }

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

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        if( item.getItemId() == R.id.menuLogout ){

            showAlertDialog();

        }


        return super.onOptionsItemSelected(item);
    }

    void showAlertDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setCancelable(true);
        builder.setTitle("로그아웃");
        builder.setMessage("정말 로그아웃 하시겠습니까??");
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                // 로그아웃 API 호출!

                Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);

                UserApi api = retrofit.create(UserApi.class);

                Call<UserRes> call = api.logout("Bearer " + token);

                call.enqueue(new Callback<UserRes>() {
                    @Override
                    public void onResponse(Call<UserRes> call, Response<UserRes> response) {
                        if(response.isSuccessful()){

                            SharedPreferences sp = getSharedPreferences(Config.SP_NAME, MODE_PRIVATE);
                            SharedPreferences.Editor editor = sp.edit();
                            editor.putString("token", "");
                            editor.commit();

                            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
                            startActivity(intent);

                            finish();
                            return;


                        }else{

                        }
                    }

                    @Override
                    public void onFailure(Call<UserRes> call, Throwable throwable) {

                    }
                });


            }
        });
        builder.setNegativeButton("No", null);
        builder.show();
    }
}