즉 서버 클라이언트가 공통으로 알아들을 수 있는 교환방식인 HTTP 메시지(request Message/ Response Message)로 통신이 이루어집니다.
// Get URL
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
// Post to a Server
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
interface ApiService {
@GET("users/2")
fun getUser(): Call<User>
}
data class User(
val id: Int,
val name: String,
val email: String
)
// Activity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val retrofit = Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService = retrofit.create(ApiService::class.java)
apiService.getUser().enqueue(object : Callback<User> {
override fun onResponse(call: Call<User>, response: Response<User>) {
if (response.isSuccessful) {
val user = response.body()
// TODO: user 객체를 이용한 작업
}
}
override fun onFailure(call: Call<User>, t: Throwable) {
// TODO: 에러 처리
}
})
}
}
🔫 정리하자면
Retrofit이 OkHttp보다 좋은점은,
- 어노테이션(Annotation) 사용으로 코드의 가독성이 좋고, 직관적인 설계가능.
- 통신 결과값을 JSON으로 변환해줄 필요가 없음
- 결과값을 메인스레드에서 바로 사용할 수 있음
🌟 BUT 둘을 같이 쓰는 이유는,
OkHttp의 Interceptor 기능: OkHttp 라이브러리는 HTTP 호출을 중간에서 가로챌 수 있는 Interceptor 기능을 제공합니다. 이를 통해 API 호출 전후에 특정 로직을 실행할 수 있으며, 예를 들어 로깅, 헤더 추가, 캐싱 정책 설정 등이 가능합니다.
서버 통신 시간 조절: OkHttp를 사용하면 네트워크 호출의 타임아웃 시간을 조절할 수 있습니다. 이는 서버와의 통신을 더욱 안정적으로 만들어 줍니다.
Retrofit은 이러한 OkHttp의 기능을 더욱 쉽게 사용할 수 있게 해주며, 자동으로 JSON 또는 다른 데이터 형식을 자바 객체로 변환해주는 기능, API 호출의 간편화 등 다양한 추가 기능을 제공합니다.
📝 결과적으로, OkHttp의 세밀한 네트워크 제어 기능과 Retrofit의 사용자 친화적인 API 호출 기능을 결합하여 최고의 성능과 편의성을 동시에 얻을 수 있습니다. 이러한 이유로 두 라이브러리를 함께 사용하는 것이 보편적입니다.
Connection pooling: 네트워크 연결을 효율적으로 관리하기 위한 기술입니다. HTTP 요청을 보내기 위해서는 클라이언트와 서버 간에 네트워크 연결을 맺어야 하는데, 이러한 연결을 매번 새로 생성하고 해제하는 과정은 상당히 비용이 큽니다. 연결을 맺고 끊는 데 드는 시간과 자원을 절약하기 위해, 이미 사용된 연결을 재사용할 수 있는 구조를 'Connection Pool'이라고 합니다.
Okio: Okio는 Square사에서 개발한 자바 라이브러리로, 기본 자바 I/O 라이브러리의 한계를 극복하고 더 효율적인 I/O 작업을 위해 설계되었습니다. Okio는 특히 바이트 코드의 효율적인 읽기 및 쓰기를 위해 만들어졌으며, 그 외에도 다양한 기능을 제공합니다.