본문 바로가기
SPRING BOOT

Spring boot <-> Android 연동하기 (2) MySQL에 있는 모든 데이터를 가져와서 Android 앱에 출력하기

by kmyobin 2022. 10. 9.

이전 글 : https://kmyobin.tistory.com/76

 

Spring boot <-> Android 연동하기 (1) 데이터 넣고 확인하기

이전 글 : https://kmyobin.tistory.com/75 MySQL 연동하기" data-og-description="spring boot 작업 환경 : intellij mysql 작업 환경 : mysql workbench https://www.youtube.com/c/GenuineCoder Genuine Coder..

kmyobin.tistory.com


전에는 데이터를 넣기만 했지만, 이번에는 가져와서 RecyclerView로 출력해보겠습니다.


1. UserListAcitivity 생성하기

2. list_user_item.xml 작성하기

3. adapter package 생성하기

  3-1. UserHolder 작성하기

  3-2. UserAdapter 작성하기

4. UserListAcitivity 작성하기

5. 실행하기


 

1. UserListAcitivity 생성하기

UserListAcitivity를 새로 만들어줍니다.

그러면 res/layout에 activity_user_list.xml 파일이 자동 생성됩니다.

여기에서 RecyclerView를 이용하여 이용자들의 정보를 출력할 것입니다.

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UserListActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/userList_recyclerView"/>

</androidx.constraintlayout.widget.ConstraintLayout>

RecyclerView의 id는 userList_recyclerView로 설정하였습니다.

 

 

2. list_user_item.xml 작성하기

이제 이 안에 정보들을 담아야 하기 때문에 list_user_item.xml 파일을 새로 만들어줍니다.

저는 User의 변수가 총 4개였습니다. [id, password, name, age]

그러므로 4개의 정보를 보기좋게 출력하겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="20dp"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <TextView
        android:id="@+id/userListItem_ID"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:text="User ID"
        android:textSize="16sp"
        android:textStyle="bold"
        android:textColor="@color/black"

        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

    <TextView
        android:id="@+id/userListItem_Password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:text="User Password"
        android:textSize="16sp"

        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/userListItem_ID"
        />

    <TextView
        android:id="@+id/userListItem_Name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:text="User Name"
        android:layout_margin="20dp"
        android:textSize="16sp"

        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        />

    <TextView
        android:id="@+id/userListItem_Age"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="20dp"
        android:text="User Age"

        android:textSize="16sp"
        app:layout_constraintTop_toBottomOf="@id/userListItem_Name"
        app:layout_constraintEnd_toEndOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

3. adapter package 생성하기

database에 있는 모든 user들의 정보를 가져오기 위해, 이전 글에서 UserAPI에 해당 함수를 작성하였습니다.

    @GET("/user/get-all") // 다 갖고 오기
    Call<List<User>> getAllUsers();

 

이 함수를 이용하여 모든 user들의 정보를 가져올 것입니다.

 

 

adapter package를 생성하고 그 안에 UserAdapter class, UserHolder class를 생성합니다.

 

3-1. UserHolder 작성하기

먼저 UserHolder입니다.

package org.techtown.spring_mysql_ex.adapter;

import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.techtown.spring_mysql_ex.R;

public class UserHolder extends RecyclerView.ViewHolder {

    TextView id, password, name ,age;

    public UserHolder(@NonNull View itemView){
        super(itemView);
        id=itemView.findViewById(R.id.userListItem_ID);
        password=itemView.findViewById(R.id.userListItem_Password);
        name=itemView.findViewById(R.id.userListItem_Name);
        age=itemView.findViewById(R.id.userListItem_Age);
    }
}

list_user_item.xml 파일에서 출력 형식을 다듬어줬었죠?

그거 id 받아오는 기초적인 작업을 UserHolder에서 합니다.

 

그럼 id를 받아온 UserHolder를 UserAdapter에서 써먹습니다.

 

 

3-2. UserAdapter 작성하기

package org.techtown.spring_mysql_ex.adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import org.techtown.spring_mysql_ex.R;
import org.techtown.spring_mysql_ex.model.User;

import java.util.List;

public class UserAdapter extends RecyclerView.Adapter<UserHolder> {

    private List<User> userList;

    public UserAdapter(List<User> userList) {
        this.userList = userList;
    }

    @NonNull
    @Override
    public UserHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // list size만큼 반복될 것임
        View view= LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_user_item, parent, false);
        return new UserHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull UserHolder holder, int position) {
        User user=userList.get(position); //
        holder.id.setText(user.getId());
        holder.password.setText(user.getPassword());
        holder.name.setText(user.getName());
        holder.age.setText(String.valueOf(user.getAge()));

    }

    @Override
    public int getItemCount() {
        return userList.size(); // userList 크기 반환
    }
}

onCreateViewHolder는 userList의 size만큼 user들의 정보 view를 출력합니다. 

onBindViewHolderUserHolder를 이용하여 setText 함수로 id, password, name, age를 담습니다.

이 때 age는 User에서 int로 설정했기 때문에 getAge()의 반환형이 int입니다.

그러므로 String.valueOf로 String을 반환하게 하였습니다.(그래야 출력됨)

 

 

 

4. UserListAcitivity 작성하기

최종적으로 UserListActivity를 작성합니다.

package org.techtown.spring_mysql_ex;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.widget.Toast;

import org.techtown.spring_mysql_ex.adapter.UserAdapter;
import org.techtown.spring_mysql_ex.model.User;
import org.techtown.spring_mysql_ex.retrofit.RetrofitService;
import org.techtown.spring_mysql_ex.retrofit.UserAPI;

import java.util.List;

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

public class UserListActivity extends AppCompatActivity {

    private RecyclerView recyclerView;

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

        // 기본적인 recyclerview 설정
        recyclerView = findViewById(R.id.userList_recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        loadUsers();
    }

    private void loadUsers(){
        RetrofitService retrofitService=new RetrofitService();
        UserAPI userAPI=retrofitService.getRetrofit().create(UserAPI.class);
        userAPI.getAllUsers()
                .enqueue(new Callback<List<User>>() {
                    @Override
                    public void onResponse(Call<List<User>> call, Response<List<User>> response) {
                        populateListView(response.body());
                    }

                    @Override
                    public void onFailure(Call<List<User>> call, Throwable t) {
                        Toast.makeText(UserListActivity.this, "Failed to load users", Toast.LENGTH_LONG).show();

                    }
                });
    }

    private void populateListView(List<User> userList){
        UserAdapter userAdapter=new UserAdapter(userList);

        recyclerView.setAdapter(userAdapter);

    }
}

recyclerView를 생성해주고, loadUsers 함수를 통해 recyclerView에 출력되게 합니다.

loadUsers()에서는 getAllUsers 함수를 호출합니다.

 

참고로 getAllUsers 함수는

UserAPI에 있었고, 이건 spring boot에서

UserController와 연결됩니다.

성공하면 populateListView 함수를 이용해 출력하고, 실패하면 Toast message를 띄웁니다.

 

 

 

5. 실행하기

실행해보겠습니다. 그전에 AndroidManifest.xml 파일로 가서 intent-filterUserListAcitivity로 바꿔줍니다.

앱을 실행했을 때 제일 첫번째로 띄우는 Acitivity 창을 설정하는 것입니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.techtown.spring_mysql_ex">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Springmysql_ex"
        android:usesCleartextTraffic="true">
        <activity
            android:name=".UserListActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            
        </activity>
    </application>

</manifest>

 

 

spring boot 서버를 키고, 안드로이드 앱을 실행합니다.

정상적으로 data가 받아와졌습니다. 끝!


다음 글 : https://kmyobin.tistory.com/78

 

Spring boot <-> Android 연동하기 (3) FAB 추가하여 data 등록 창 띄우기

이전 글 : https://kmyobin.tistory.com/77 Android 연동하기 (2) MySQL에 있는 모든 데이터를 가져와서 Android 앱에 출력하기" data-og-description="이전 글 : https://kmyobin.tistory.com/76 Android 연동하..

kmyobin.tistory.com

댓글