정리사항(피드백) 50 - Retrofit2에서 API 요청 처리 방법(동기/비동기)
*Retrofit2에서 API 요청 처리 방법(동기/비동기)
-레트로핏2(Retrofit2)는 안드로이드 앱에서 RESTful API를 호출하기 위한 라이브러리입니다.
-동기(Synchronous)와 비동기(Asynchronous)
동기 방식은 호출된 함수가 반환되기 전까지는 다음 코드를 실행하지 않고 대기합니다. 이 방식은 코드가 간단하고 직관적이지만, API 호출이 느리거나 느릴 가능성이 있는 경우 앱 전체의 성능에 영향을 미칠 수 있습니다. 동기 방식은 Retrofit2에서 execute() 메소드를 사용하여 API 요청을 수행합니다.
(동기방식을 메인 UI에서 호출 시 android.os.NetworkOnMainThreadException의 java.lang.RuntimeException 발생)
반면, 비동기 방식은 호출된 함수가 즉시 반환되고, API 호출의 응답은 나중에 처리됩니다. 이 방식은 대규모 앱에서 빠른 응답 시간을 보장하고, UI가 블로킹되는 것을 방지합니다. Retrofit2에서는 비동기 방식으로 API 요청을 처리하기 위해 enqueue() 메소드를 사용합니다. enqueue() 메소드는 콜백을 이용하여 비동기적으로 API 호출 결과를 처리합니다.
따라서, 동기 방식은 단순한 API 호출에 적합하며, 비동기 방식은 대규모 앱 및 느린 API 호출에 적합합니다. Retrofit2에서는 두 가지 방식 모두를 지원하므로, 앱의 요구사항에 따라 적절한 방식을 선택할 수 있습니다.
*Retrofit2에서 execute() 메소드는 API 요청을 동기적으로 처리하는 방법 중 하나입니다. 이 메소드는 호출된 함수가 반환되기 전까지 다음 코드를 실행하지 않고 대기합니다. API 요청이 완료되면, 요청 결과를 담은 Response 객체를 반환합니다.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService service = retrofit.create(ApiService.class);
Call<User> call = service.getUser("user123");
try {
Response<User> response = call.execute();
if (response.isSuccessful()) {
User user = response.body();
// API 호출 결과를 처리합니다.
} else {
// API 호출이 실패한 경우 처리합니다.
}
} catch (IOException e) {
// IOException 예외 처리
}
위의 코드에서 Call<User> 객체는 ApiService 인터페이스에서 정의된 메소드 getUser()에 대한 호출을 나타냅니다.
execute() 메소드는 Call<User> 객체를 호출하여 API 요청을 동기적으로 처리하고, Response<User> 객체를 반환합니다. 이 Response<User> 객체는 API 요청의 결과를 담고 있으며, isSuccessful() 메소드를 사용하여 API 호출이 성공했는지 여부를 확인할 수 있습니다.
execute() 메소드는 호출된 함수가 반환될 때까지 대기하기 때문에, 메인(UI) 스레드에서 실행하면 앱이 블로킹되는 문제가 발생할 수 있습니다. 따라서, execute() 메소드는 앱의 요구사항에 맞게 적절하게 사용해야 합니다.
*Retrofit2에서 enqueue() 메소드는 API 요청을 비동기적으로 처리하는 방법 중 하나입니다. 이 메소드는 호출된 함수가 즉시 반환되고, API 요청의 응답은 나중에 처리됩니다. enqueue() 메소드는 콜백(callback)을 이용하여 비동기적으로 API 호출 결과를 처리합니다.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService service = retrofit.create(ApiService.class);
Call<User> call = service.getUser("user123");
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
User user = response.body();
// API 호출 결과를 처리합니다.
} else {
// API 호출이 실패한 경우 처리합니다.
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
// API 호출이 실패한 경우 처리합니다.
}
});
위의 코드에서 Call<User> 객체는 ApiService 인터페이스에서 정의된 메소드 getUser()에 대한 호출을 나타냅니다.
enqueue() 메소드는 Call<User> 객체를 호출하여 API 요청을 비동기적으로 처리하고, Callback<User> 객체를 사용하여 API 호출 결과를 처리합니다. onResponse() 메소드는 API 호출이 성공한 경우 호출되며, onFailure() 메소드는 API 호출이 실패한 경우 호출됩니다.
enqueue() 메소드는 비동기적으로 API 요청을 처리하기 때문에, 메인(UI) 스레드에서 실행해도 앱이 블로킹되지 않습니다. 따라서, 대규모 앱에서 enqueue() 메소드를 사용하여 API 요청을 비동기적으로 처리하는 것이 권장됩니다.