본문 바로가기
Android

[깡샘의 안드로이드 프로그래밍] 정리 27 - Volley API 를 이용한 HTTP 통신

by 들풀민들레 2018. 1. 6.

 

 

 

본 글은 [깡샘의 안드로이드 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

 

 

 

 

25장. HTTP 통신

 

25.2. Volley API 를 이용한 HTTP 통신

 

HTTP 통신을 이용한 서버 연동은 앞에서 살펴보았던 표준 라이브러리의 HttpURLConnection 클래스를 이용하여 구현할 수 있습니다. 하지만 HttpURLConnection을 사용하지 않고 다른 라이브러리를 이용하여 서버 연동을 구현할 수도 있습니다. 대표적인 라이브러리가 Volley API입니다.

 

Volley는 2013년 구글 IO 행사에서 공개된 API로 안드로이드 앱에서 HTTP 통신을 조금 더 쉽게 구현하는 데 목적이 있습니다.

 

HttpURLConnection 클래스를 이용한 HTTP 연동이 기본이기는 하지만, HttpURLConnection 클래스를 이용할 때 실제 데이터 송수신 이외에 여러 가지 상황을 고려해야 하고 그런 코드들이 모든 HTTP 연동 부분에서 중복되는 측면이 있습니다. 예를 들어 서버 연동 시 액티비티의 ANR 문제를 해결하기 위해 스레드-핸들러 혹은 AsyncTask를 이용하여 처리해야 하며, 화면 회전이 발생하였을 때 서버 요청을 취소해 주어야 합니다. 또한, 이미지 내려받기에서 같은 이미지를 반복해서 내려받지 않게 하고자 캐시(Cache)를 적용해야 합니다. 이런 부류의 코드들은 서버 연동에 의한 특정 업무 구현과 상관없이 같은 형태의 코드가 모든 HTTP 연동에서 반복됩니다. 이 부분을 대행해 개발자의 HTTP 연동 코드를 조금 더 간편하게 작성할 목적으로 개발된 API가 Volley입니다.

 

Volley API는 표준 라이브러리의 API가 아니므로 그레이들 파일에 dependency 관계를 설정하고 사용해야 합니다.

 

implementation 'com.android.volley:volley:1.0.0'

 

Volley API에서 제공하는 핵심 클래스는 다음과 같습니다.

 

  • RequestQueue: 서버 요청자. 다른 Request 클래스들의 정보대로 서버에 요청을 보내는 역할
  • StringRequest: 문자열을 결과로 받는 요청 정보
  • ImageRequest: 이미지를 결과로 받는 요청 정보
  • JsonObjectRequest: JSONObject를 결과로 받는 요청 정보
  • JsonArrayRequest: JSONArray를 결과로 받는 요청 정보

 

기본적인 구조는 StringRequest와 같은 Request 클래스들을 이용하여 서버 요청 정보와 결과 처리 방법을 표현하고, 이 Request 객체를 RequestQueue에 넘겨 서버 요청이 발생하는 구조입니다.

 

StringRequest stringRequest = new StringRequest(...);

RequestQueue queue = Volley.newRequestQueue(this);

queue.add(stringRequest);

 

RequestQueue 객체의 add( ) 함수에 Request 객체를 매개변수로 지정하여 호출하면 서버 연동이 발생합니다. 그리고 Volley API을 이용하면 내부적으로 스레드-핸들러 구조로 동작하므로 개발자가 ANR 문제를 고려해서 작성할 필요는 없습니다.

 

StringRequest는 서버로부터 문자열 데이터를 얻을 목적으로 사용하는 클래스입니다.

 

StringRequest stringRequest = new StringRequest(Request.Method.GET, url,

new Response.Listener<String>() {

@Override

public void onResponse(String response) {

//결과 처리

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

}

});

 

StringRequest 객체를 생성하면서 생성자 매개변수로 서버 요청 정보와 결과 처리 콜백을 등록합니다.

첫 번째 매개변수는 HTTP Method로서 GET이나 POST로 지정되고, 두 번째 매개변수는 서버 URL 정보입니다. 세 번째 매개변수가 결과 콜백이며, 네 번째 매개변수가 에러 콜백입니다. 서버로부터 수신된 문자열 데이터를 전달할 목적으로 세 번째 매개변수로 지정된 콜백의

onResponse( ) 함수가 자동으로 호출되며, 이 함수의 매개변수로 서버 수신 문자열이 전달됩니다.

 

이렇게 정의한 StringRequest 객체를 RequestQueue의 add( ) 함수의 매개변수로 지정하여 서버에 요청을 보냅니다.

서버 요청 시 클라이언트 데이터를 서버에 전송해야 할 때도 있습니다.

 

StringRequest stringRequest = new StringRequest(...){

protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {

Map<String, String> params = new HashMap<String, String>();

params.put("a1", "kkang");

return params;

}

};

 

서버에 전송할 데이터는 StringRequest를 상속받은 클래스를 정의하고, 이 클래스에서 getParams( ) 함수를 재정의하며 getParams ( ) 함수에서 서버에 전송할 데이터를 Map 객체에 담아 반환하면 됩니다. 이렇게 하면 getParams( ) 함수에서 반환한 Map 객체의 데이터를 웹의 질의 문자열 형식으로 만들어 RequestQueue에서 서버 요청 시 서버에 전송합니다.