JavaScript에서 사용되는 ajax, axios 같은 API 서버와 통신하는 로직을 Retrofit2를 사용하여 안드로이드에서 구현해 보자.
1. Retrofit2란?
안드로이드 환경에서 클라이언트와 서버 간의 HTTP 통신을 위한 라이브러리이다.
Square에서 개발되었으며, Restful API 통신을 단순화하여 앱의 성능을 개선해 주는 것이 특징이다.
OkHttp 라이브러리 위에 구축이 된 모델이며, 다양한 JSON Parser 들을 사용하여 서버의 응답을 처리할 수 있고 비동기적인 네트워크 호출 처리와 서버 오류에 대한 부분을 쉽고 간단하게 대처하여 처리할 수 있다.
2. Retrofit2 사용하기
우선 필요한 의존성을 Gradle에 추가해 주자.
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.11.0'
implementation 'com.google.code.gson:gson:2.8.5'
// JSON 타입의 응답결과 변환
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'
// String 타입의 응답결과 변환
implementation 'com.squareup.retrofit2:converter-scalars:2.6.4'
// Retrofit2 통신간의 로그 추출
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
}
다음으로 Manifests 파일에 http 통신과 인터넷에 대한 권한을 추가해 주자.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
// 인터넷 권한 추가
<uses-permission android:name="android.permission.INTERNET" />
<application
// 통신 도착지의 프로토콜이 http일 때 추가
android:usesCleartextTraffic="true"
...
>
</application>
</manifest>
이제 간단하게 안드로이드에서 'HELLO' 와 'WORLD' 데이터를 API 서버와 통신하여 두 데이터를 합친 뒤 응답받는 로직으로 구현해 보겠다. 각각 String과 JSON으로 요청/응답하는 샘플 로직을 작성해 보겠다.
우선 Retrofit2 Interface와 JSON 객체 처리를 도와주는 클래스 파일을 작성해 준다.
// RetrofitInterface.java
package com.example.practiceandroid.retrofit;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
public interface RetrofitInterface {
// JSON으로 통신
@Headers("Content-Type: application/json; charset=utf-8")
@POST("ServletTest/commServlet")
Call<ResData> reqJson (
@Body ReqData reqData
);
// String으로 통신
@Headers("Content-Type: application/x-www-form-urlencoded; charset=utf-8")
@POST("ServletTest/commServlet")
Call<String> reqString (
@Body String reqData
);
}
// ReqData.java
// JSON 객체 생성
package com.example.practiceandroid.retrofit;
public class ReqData {
String parameter1;
String parameter2;
public ReqData(String test1, String test2) {
this.parameter1 = test1;
this.parameter2 = test2;
}
}
// ResData.java
// JSON 응답 처리
package com.example.practiceandroid.retrofit;
public class ResData {
// JSON 키 값
private String result;
public String getResult() {
return result;
}
}
추가로 나는 API 서버를 Servlet으로 구현하였으며, 해당 서버에 대한 코드는 아래 링크에서 확인할 수 있다.
2025.04.10 - [JAVA] - [JAVA] 서블릿(Servlet) 구현하기
[JAVA] 서블릿(Servlet) 구현하기
1. 서블릿(Servlet)이란?서블릿이란 자바 어플리케이션에서 클라이언트의 요청을 처리하고 응답을 반환하는 역할을 하는 서버 측의 프로그램 형식이다. 주로 HTTP 요청/응답 처리를 할 때 사용을 하
rlawo32.tistory.com
이제 서버와 통신하는 로직을 구현해 보자. 참고로 localhost로 API 통신 테스트를 진행할 때 안드로이드 환경에서는 localhost:8080이 아닌 10.0.2.2:8080으로 진행해 주어야 통신이 된다.
우선 String으로 요청/응답에 대한 처리이다.
// TestActivity.java
// String 요청/응답
package com.example.practiceandroid;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.example.practiceandroid.retrofit.RetrofitInterface;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
public class TestActivity extends AppCompatActivity {
private static final String LOG_TAG = TestActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_main);
String url = "http://10.0.2.2:8080/";
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logInterceptor).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(client)
.addConverterFactory(ScalarsConverterFactory.create())
.build();
RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);
String send = "¶meter1=HELLO¶meter2=WORLD";
Call<String> callString = retrofitInterface.reqString(send);
callString.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if(response.isSuccessful()) {
Log.d(LOG_TAG, "onResponse : Success");
Log.d(LOG_TAG, "Data : " + response.body());
} else {
Log.d(LOG_TAG, "onFailure : " + response.message());
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.d(LOG_TAG, "onFailure : " + t.getMessage());
}
});
}
}
Logcat으로 확인한 통신에 대한 결과는 아래와 같다.
JSON으로 요청/응답 처리는 아래와 같다.
// TestActivity.java
// JSON 요청/응답
package com.example.practiceandroid;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import com.example.practiceandroid.retrofit.ReqData;
import com.example.practiceandroid.retrofit.ResData;
import com.example.practiceandroid.retrofit.RetrofitInterface;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class TestActivity extends AppCompatActivity {
private static final String LOG_TAG = TestActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_main);
String url = "http://10.0.2.2:8080/";
Gson gson = new GsonBuilder().setLenient().create();
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logInterceptor).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);
ReqData reqData = new ReqData("HELLO", "WORLD");
Call<ResData> callJson = retrofitInterface.reqJson(reqData);
callJson.enqueue(new Callback<ResData>() {
@Override
public void onResponse(Call<ResData> call, Response<ResData> response) {
if(response.isSuccessful()) {
Log.d(LOG_TAG, "onResponse : Success");
ResData resData = response.body();
Log.d(LOG_TAG, "Data : " + resData.getResult());
} else {
Log.d(LOG_TAG, "onFailure : " + response.message());
}
}
@Override
public void onFailure(Call<ResData> call, Throwable t) {
Log.d(LOG_TAG, "onFailure : " + t.getMessage());
}
});
}
}
Logcat으로 확인한 통신에 대한 결과는 아래와 같다.
복잡한 로직없이 안드로이드에서 간단하게 API 서버와 http 통신 로직을 구현해 보았다.
각 상황에 맞게 String 또는 JSON으로 요청/응답 처리를 하여 앱을 구현하면 되겠다.