본문 바로가기
Android Studio

API에서 데이터를 가져오는 DataFetcher

by ssury94 2025. 3. 5.

 

 

 

 

public class DataFetcher {
    Context context;
    ArrayList<Memo> memoArrayList;
    MemoAdapter adapter;

    public DataFetcher(Context context, ArrayList<Memo> memoArrayList, MemoAdapter adapter) {
        this.context = context;
        this.memoArrayList = memoArrayList;
        this.adapter = adapter;
    }

    public void fetchData(){
        NetworkClient.getRetrofitClient(context);
        MemoApi api = retrofit.create(MemoApi.class);
        Call<MemoResponse> call = api.getMemoList();
        call.enqueue(new Callback<MemoResponse>() {
            @Override
            public void onResponse(Call<MemoResponse> call, Response<MemoResponse> response) {
                //200 ok
                if(response.isSuccessful()){
                    MemoResponse memoResponse=response.body();
                    memoArrayList.addAll(memoResponse.data);
                    adapter.notifyDataSetChanged();
                }else {
                    //fail
                    Log.e("DataFetcher", "Failed with code: " + response.code());
                    Toast.makeText(context,"데이터를 가져오는데 실패했습니다.",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<MemoResponse> call, Throwable throwable) {
                Log.e("NetworkError", "API 호출 실패", throwable);
                Toast.makeText(context, "네트워크 요청에 실패했습니다.", Toast.LENGTH_SHORT).show();

            }
        });

    }
}

 

 

 

DataFetcher 클래스는 API에서 데이터를 가져오는 역할을 합니다.

이 클래스는 Retrofit을 사용하여 네트워크에서 데이터를 비동기적으로 가져오고, 가져온 데이터를 RecyclerView에 표시할 수 있도록 합니다. 아래에서 이 클래스의 각 부분을 자세히 설명드리겠습니다.

 

Retrofit은 REST API와의 통신을 간단하게 만들어 주며, 서버와의 데이터 교환을 쉽게 할 수 있도록 도와줍니다.

1. 클래스 멤버 변수

Context context;
ArrayList<Memo> memoArrayList;
MemoAdapter adapter;
  • context: Context 객체는 앱의 환경 정보를 포함하며, Toast 메시지를 표시하거나, 네트워크 요청에 필요한 설정 등을 위해 사용됩니다.
  • memoArrayList: Memo 객체들을 담는 리스트로, 네트워크에서 가져온 메모 데이터를 RecyclerView에서 표시하기 위해 사용됩니다.
  • adapter: MemoAdapter 객체는 RecyclerView에 데이터를 표시하는 어댑터입니다. 이 어댑터는 memoArrayList 데이터를 화면에 바인딩합니다.

2. 생성자

public DataFetcher(Context context, ArrayList<Memo> memoArrayList, MemoAdapter adapter) {
    this.context = context;
    this.memoArrayList = memoArrayList;
    this.adapter = adapter;
}
  • DataFetcher 클래스의 생성자는 context, memoArrayList, adapter를 파라미터로 받습니다. 이들은 각각:
    • context: 네트워크 통신과 UI 업데이트에 사용될 컨텍스트.
    • memoArrayList: 데이터를 담을 리스트.
    • adapter: 데이터를 화면에 표시하는 MemoAdapter입니다.

3. fetchData() 메서드

public void fetchData() {
    NetworkClient.getRetrofitClient(context);
    MemoApi api = retrofit.create(MemoApi.class);
    Call<MemoResponse> call = api.getMemoList();
    call.enqueue(new Callback<MemoResponse>() {
        @Override
        public void onResponse(Call<MemoResponse> call, Response<MemoResponse> response) {
            if(response.isSuccessful()){
                MemoResponse memoResponse = response.body();
                memoArrayList.addAll(memoResponse.data);
                adapter.notifyDataSetChanged();
            } else {
                Log.e("DataFetcher", "Failed with code: " + response.code());
                Toast.makeText(context,"데이터를 가져오는데 실패했습니다.",Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<MemoResponse> call, Throwable throwable) {
            Log.e("NetworkError", "API 호출 실패", throwable);
            Toast.makeText(context, "네트워크 요청에 실패했습니다.", Toast.LENGTH_SHORT).show();
        }
    });
}

이 메서드의 역할:

fetchData() 메서드는 API에서 데이터를 가져오고, 그 데이터를 memoArrayList에 추가한 뒤, RecyclerView의 어댑터에 이를 반영하여 UI를 갱신합니다.

 

 

Retrofit 클라이언트 초기화:

NetworkClient.getRetrofitClient(context);

NetworkClient.getRetrofitClient(context)를 호출하여 Retrofit 객체를 가져옵니다.

NetworkClient는 Retrofit을 초기화하고 네트워크 요청을 처리하는 클라이언트 객체를 반환합니다.

 

API 호출 준비:

MemoApi api = retrofit.create(MemoApi.class);
Call<MemoResponse> call = api.getMemoList();
  • retrofit.create(MemoApi.class)를 호출하여 MemoApi 인터페이스에서 정의한 API 요청 메서드를 사용합니다.
  • call.enqueue(new Callback<MemoResponse>() {...})를 사용하여 비동기 방식으로 API 요청을 큐에 넣고, 결과를 비동기적으로 처리합니다.

 

응답 처리 (onResponse):

if (response.isSuccessful()) {
    MemoResponse memoResponse = response.body();
    memoArrayList.addAll(memoResponse.data);
    adapter.notifyDataSetChanged();
} else {
    Log.e("DataFetcher", "Failed with code: " + response.code());
    Toast.makeText(context,"데이터를 가져오는데 실패했습니다.",Toast.LENGTH_SHORT).show();
}

 

  • response.isSuccessful()가 true이면 응답이 성공적이었다는 의미입니다. 이때 response.body()를 통해 API 응답 본문을 가져오고, 그 데이터(memoResponse.data)를 memoArrayList에 추가합니다.
  • adapter.notifyDataSetChanged()를 호출하여 RecyclerView의 데이터를 새로 고침합니다. 이렇게 하면 UI에서 데이터가 변경된 것을 반영하게 됩니다.
  • 응답이 실패했을 경우에는 에러 로그Toast 메시지를 통해 오류를 알립니다.

 

네트워크 실패 처리 (onFailure):

Log.e("NetworkError", "API 호출 실패", throwable);
Toast.makeText(context, "네트워크 요청에 실패했습니다.", Toast.LENGTH_SHORT).show();
  • 네트워크 요청이 실패했을 경우, onFailure() 메서드가 호출됩니다. 이 메서드에서는 예외 정보를 로그로 출력하고, Toast 메시지를 통해 사용자에게 네트워크 오류를 알립니다.

 

결론:

DataFetcher 클래스는 API 호출을 통해 메모 데이터를 가져와 이를 memoArrayList에 추가하고, RecyclerView어댑터를 갱신하여 UI에 데이터를 표시하는 역할을 합니다.

  • 네트워크 요청이 성공하면 데이터를 리스트에 추가하고, RecyclerView의 어댑터에 변경 사항을 반영합니다.
  • 응답 실패네트워크 실패 시, Toast로 사용자에게 알리고 로그에 오류 정보를 기록합니다.