Retrofit
1. RestAPI 사용을 위한 interface를 선언
2. @METHOD(router) Annotation과
Retrofit2 라이브러리를 build.gradle에 추가해주어야 합니다
implementation 'com.squareup.retrofit2:retrofit:x.x.x'
데이터 직렬화 라이브러리
implementation 'com.google.code.gson:gson:x.x.x'
(작성일 기준 2.10.0 버전)
Client를 단 하나만 생성하기 위해 Singleton 패턴을 사용했습니다.
동시성 문제가 생길 가능성이 없다고 생각하여 기본패턴을 사용하여 retrofit 객체가 아직 생성되지 않았다면 생성하고 반환, 아니라면 바로 기존 객체를 반환합니다.
baseUrl에는 서버의 URL을 적어주면 되는데 Android의 가상 디바이스에서는 localhost 대신 10.0.2.2를 입력하여 서버에 접속 가능합니다.
가상 디바이스의 10.0.2.2가 PC의 localhost로 포트포워딩 되어 있는것 같습니다.(가상 디바이스의 localhost는 디바이스 본인이기 때문에 PC의 localhost를 가르킬 수 없다)
addConverterFactory는 Json 형태의 response를 Gson 형태로 변환하기 위한 변환자입니다.
Gson : JSON을 java object로 변환하기 위한 자바 라이브러리
//NetworkClient
public class NetworkClient {
private static Retrofit retrofit = null;
public static Retrofit getClient(Context context) {
if(retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl("http://10.0.2.2:8080/")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
위의 NetworkClient에서 설정한 baseUrl과 데이터 통신을 하기 위한 API를 나열하는 interface라고 생각하면 될것 같다.
@HTTPMethod(router)
Call methodName();
방식으로 메소드를 선언하면
// RetrofitAPI.java
public interface ServiceAPI {
@GET("/users")
Call<List<User>> getAllUserData();
@GET("/users/{id}")
Call<User> getUserData(@Path("id") int id)
@Post("/users")
Call<Data> createUser(@Body User user);
}
데이터를 JSON -> Class로 변환하기 위해 직렬화를 해준다 한다.
SerializedName("jsonKey")를 입력하면 key에 저장된 value가 class의 멤버변수에 저장된다.(Gson을 통해 변환)
//User.java
public class User {
@SerializedName("id")
@Expose
private int id;
@SerializedName("email")
@Expose
private String email;
@SerializedName("nickname")
@Expose
private String nickname;
public int getId() {
return id;
}
public String getEmail() {
return email;
}
public String getNickname() {
return nickname;
}
}
[record, Data를 간단히](https://velog.io/@gemutsruhe/Java-record-class)
Retrofit Client를 생성하고 retrofit에 RetrofitAPI를 사용하여 api를 만들고 interface에서 선언한 method로 호출한다.
method의 return은 Call<Data>형식이 되는데 이를 enqueue로 실행하면 실행하면 response를 받을 수 있으며 response.body()에 Data가 클래스 객체가 만들어져 온다.
```java
//MainActivity.java
Retrofit retrofit = NetworkClient.getClient(getApplicationContext());
LibraryAPI api = retrofit.create(LibraryAPI.class);
User user = new User();
Call<User> call = api.createUser(user);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(@NonNull Call<User> call, @NonNull Response<User> response) {
User userData = response.body();
}
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable throwable) {
Log.e("TEST", "failure");
}
});
부족한 부분은 추가 예정