- 안드로이드와 스프링부트 연동하기
- 안드로이드(클라이언트) 화면에서 회원데이터 create, read 해보기
Retrofit은 서버와 클라이언트 간 http 통신을 위한 라이브러리이다.
통신을 편하게 해주는 라이브러리에 OKhttp가 널리 쓰였었는데 이를 더 편하고 쉽게 사용하기 위해 만든 것이 Retrofit이다.
Okhttp를 기반으로 만들어서 Retrofit 라이브러리를 추가하면 Okhttp 메서드도 사용할 수 있다.
최신 버전은 github 에서 확인할 수 있다! 🧚♀️
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
두 번째 줄에 있는 convert-gson은 응답 결과가 Json일 때 객체로 변환해주는 기능을 한다.
<uses-permission android:name="android.permission.INTERNET" />
<application
android:usesCleartextTraffic="true"
/>
public interface RetrofitAPI {
@GET("/users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
요런식으로 REST API의 요청에 해당하는 interface를 생성해주면 된다.
참고로 예시 코드의 인터페이스는 user를 파라미터로 받아 API URL을 완성하여 GET 방식으로 조회 요청하는 인터페이스이다.
반환 타입은 Call<객체타입>으로 나타낸다. Call 객체를 선언해서 HTTP 요청을 웹서버로 보낸다. <> 안의 자료형은 JSON 데이터를 <>안에 자료형으로 받겠다는 뜻이다.
public class Post{
@SerializedName("userId")
private int userId;
@SerializedName("id")
private Long id;
//+ getter, setter 등등..
}
여기서 @SerializedName으로 JSON 객체와 해당 변수를 매칭시켜준다
따라서 @SerializedName 괄호 안에는 해당 JSON 객체의 변수 명을 적어주면 된다
POST 매핑으로 받아올 값은 굳이 어노테이션 안붙이고 그냥 JSON 객체의 변수 명과 일치하는 변수만 선언해주면 된다
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
📌 Retrofit retrofit = new Retrofit.Builder()
.baseUrl(데이터가 있는 홈페이지의 baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
📌RetrofitAPI retrofitAPI = retrofit.create(RetrofitAPI.class);
// 위에서 구현한 api interface 구현
retrofitAPI.getData("1").enqueue(new Callback<List<Post>>(){ // 생성한 인터페이스 getData 에 찾을 id를 넣고 enqueue 해주기
@Override
public void onResponse(Call<List<Post>> call, Response<List<Post>> response){ // 성공적으로 응답하면 실행
if(response.isSuccessful()){
List<Post> data = response.body();
//data 에서 필요한 내용 꺼내 쓰기
}
}
@Override
public void onFailure(Call<List<Post>> call, Throwable t){
//실패하면 실행
t.printStackTrace();
}
}
}
}
이렇게 해도 되지만 만약 서버 호출이 필요할 때마다 인터페이스를 구현해야 한다면 너무 비효율적이기 때문에 Client 파일은 싱글톤으로 따로 Retrofit 객체를 제작하는 것이 바람직하다.
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient {
private static final String BASE_URL = "http:// api주소/";
public static RetrofitAPI getApiService(){return getInstance().create(RetrofitAPI.class);} // api 콜
private static Retrofit getInstance(){
Gson gson = new GsonBuilder().setLenient().create();
return new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
}
//모델 경로는 각자 다르므로 주석처리
//import com.example.Model__CheckAlready;
import android.util.Log;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class CallRetrofit {
public boolean callPhoneAlreadyCheck(String phoneNumber){
boolean isRight = false;
//Retrofit 호출
Model__CheckAlready modelCheckAlready = new Model__CheckAlready(phoneNumber);
Call<Model__CheckAlready> call = RetrofitClient.getApiService().postOverlapCheck(modelCheckAlready);
call.enqueue(new Callback<Model__CheckAlready>() {
@Override
public void onResponse(Call<Model__CheckAlready> call, Response<Model__CheckAlready> response) {
if(!response.isSuccessful()){
Log.e("연결이 비정상적 : ", "error code : " + response.code());
return;
}
Model__CheckAlready checkAlready = response.body();
Log.d("연결이 성공적 : ", response.body().toString());
if(modelCheckAlready.getMessage() == "can use this number"){
Log.d("중복검사: ", "중복된 번호가 아닙니다");
modelCheckAlready.setRight(true);
}
}
@Override
public void onFailure(Call<Model__CheckAlready> call, Throwable t) {
Log.e("연결실패", t.getMessage());
}
});
return modelCheckAlready.isRight();
}
}
이는 위의 Main Activity 내용과 중복되는 부분이 있으니 둘 다 참고하자!
여기서는 POST 매핑을, 위에서는 GET 매핑을 다룬다.
오늘은 졸업프로젝트 회의도 있고 끝나고 술도 마시느라..ㅎㅎ 많이 못했다
이론 정리만 대부분 하고 실질적인 개발은 하지도 못했네
내일의 내가 오늘의 내가 못한 만큼 더 열심히 해주길 바라면서 ㅠㅠㅠ 파이팅..!