반응형

앱을 구현하다보면 네트워크 통신을 처리해야 할 경우가 일상다반사다.


네트워크 처리의 경우 보통 생각나는 대표 3가지를 적어보면 다음의 항목들이 대표로 사용하지 않을까 싶다.


내맘대로 대표 네트워크 라이브러리


1. HttpURLConnection

Android 기본 라이브러리. 제한된 환경(네트워크 차단 등)에서 주로 사용


2. Volley

구글에서 제공하는 라이브러리. 현재는 대부분 Retrofit으로 넘어가면서 많이 사용하지 않음.


3. Retrofit

Square사에서 제공하는 오픈소스 라이브러리. 빠른 속도와 다양하게 제공되는 빵빵한 스팩으로 현재 대부분의 앱 개발과정에서 사용.


위의 3 항목의 리스트와 각 항목의 세부 내용은 어떠한 지표 및 근거자료를 토대로 작성된 것이 아니며 100% 필자의 주관적인 생각으로부터 나온 것이니 너무 맹신하지 말고 그저 이런게 있다..... 정도의 참고용으로 보길 바란다.


이번 포스팅에서는 위의 항목중 Volley 사용법에 대해 작성해 보고자 한다.



Volley 사용법


뉘앙스 자체는 Retrofit에 대해 작성하려했으면서 왜 Volley에 대해 작성하냐? 라는 의문을 갖는 분들이 많을거라 생각한다.


특별한 이유는 없이 오늘은 그저 Volley 사용법에 대해 작성해보고 싶어서..... 이해해주리라 생각하며 Volley 사용법에 대해 작성해보고자 한다.



라이브러리의 사용은 dependency 처리부터....


Volley를 사용하기 위해 gradle에 dependencies 항목에 다음과 같이 Volley 라이브러리를 추가한다.

dependencies {
...

// volley library
implementation 'com.android.volley:volley:1.1.1'
...
}


어? 라이브러리 추가 방식이 다른데? 왜 compile이 아니고 implementation이지? 라고 궁금할 수 있다. 해당 의문에 대한 답은 차후 포스팅에서 다루도록 한다.


간다하게 Request 처리를 해보자


Volley를 이용한 Request 처리를 위해 Android Developers 에서는 다음과 같이 가이드하고 있다.


1. Instantiate the RequestQueue

2. Instantiate Request Field and Set a Url, Response Listener and Error Listener

3. set a Instantiated RequestField into RequestQueue


위의 3가지면 데이터가 정상적으로 옵니다... 라고 가이드 하고 있다.


번역해서 쉽게 설명하면 RequestQueue 인스턴스를 생성하고, 해당 인스턴스에 String, Json 등등의 Request 인스턴스를 생성하며 이 과정에 해당 인스턴스에 요청 Url과 Request Type, 성공시 리스너와 실패 시 리스너를 설정 후, 설정된 인스턴스를 RequestQueue 인스턴스에 넣어주면 됩니다... 라는 말이다.


필자의 경우, 1, 2번의 인스턴스 생성이 너무 번거롭고 반복되는 작업이라 생각하여, 빌터 패턴을 이용한 RequestData를 만들어 처리하고자 하였다.


/**
* Volley 네트워크 설정 데이터
* 빌더를 이용해서 처리
*/
public class RequestData {

public RequestQueue queue;
/**
* Request Method 타입
* GET, POST, PUT, DELETE ....
*/
public int requestType;
/**
* Request Url
*/
public String requestUrl;
/**
* Request Param
* 바디 형식으로 넣어줄때 사용
*/
public JSONObject requestParams;

public RequestData(RequestQueue queue, int requestType, String requestUrl, JSONObject requestParams) {
this.queue = queue;
this.requestType = requestType;
this.requestUrl = requestUrl;
this.requestParams = requestParams;
}

public static class Builder {
private RequestQueue queue;
private int requestType;
private String requestUrl;
private JSONObject requestParams;

public Builder() {
}

public Builder setQueue(RequestQueue queue) {
this.queue = queue;
return this;
}

public Builder setRequestType(int requestType) {
this.requestType = requestType;
return this;
}

public Builder setRequestUrl(String requestUrl) {
this.requestUrl = requestUrl;
return this;
}

public Builder setRequestParams(JSONObject requestParams) {
this.requestParams = requestParams;
return this;
}

public RequestData build() {
if (queue == null) {
throw new IllegalStateException("RequestQueue is null");
}
if (requestType < 0) {
throw new IllegalStateException("RequestType is null");
}
if (requestUrl == null) {
throw new IllegalStateException("RequestUrl is null");
}

return new RequestData(queue, requestType, requestUrl, requestParams);
}
}
}


요렇게 만들어 놓으면 실제 사용할때는 다음의 코드로 처리하면 된다.

RequestData.Builder builder = new RequestData.Builder();
builder.setQueue(Volley.newRequestQueue(getContext()))
.setRequestType(Request.Method.GET)
.setRequestUrl(UrlUtils.getUrlMovieRankApi("1"));


여기까지만 하면 기본적인 네트워크 통신에 필요한 작업은 70% 된 것 이다.

앞서 이미 기술했었지만, Volley의 경우 Retrofit과 다르게 Response Listener와 Error Listener를 개별적으로 설정해줘야 하는 번거로움이 있다.


그래서, 필자의 경우 인터페이스 리스너를 별도 만들어서 사용자는 인터페이스 리스터만을 통해서 성공, 실패 처리가 가능하도록 하였다.

아래 코드를 참조해 보자.

/**
* 네트워크 헬퍼
* 사용자를 대신하여 Volley 네트워크 처리를 해주며, 사용자는 RequestData와 리스너만 연동하면 된다.
*/
public class NetworkHelper {

public static void apiCall(RequestData requestData, ResponseListener responseListener) {
RequestQueue queue = requestData.
queue;
JsonObjectRequest request = new JsonObjectRequest(requestData.requestType, requestData.requestUrl,
requestData.requestParams, getNetworkSuccessListener(responseListener),
getNetworkErrorListener(responseListener));
queue.add(request);
}

/**
* Network 성공 리스너.
* @param responseListener 네트워크 리스너
*/
private static Response.Listener<JSONObject> getNetworkSuccessListener(final ResponseListener responseListener) {
return new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// TODO: 2018-09-16 do something

responseListener.onSuccess(resultData);
}
}
;
}

/**
* Network 실패 리스너.
* 네트워크 과정에서 에러 또는 데이터가 내려오지 못했을 때 처리한다.
* @param responseListener 네트워크 리스너
*/
private static Response.ErrorListener getNetworkErrorListener(final ResponseListener responseListener) {
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

// TODO: 2018-09-16 do something
responseListener.onFail(error);
}
}
;
}
}


필자가 만들어본 네트워크 핼퍼를 통해 사용자는 성공, 실패 시 데이터를 받게 되며, Response Listener의 경우, Http Response Code를 통해 분기 처리가 가능하다.




예제는 다음과 같이...


위에서 작성해본 RequestData와 NetworkHelper를 이용한 예제 코드는 다음과 같다.

private void tesNetworkProcess() {
RequestData.Builder builder = new RequestData.Builder();
builder.setQueue(Volley.newRequestQueue(getContext()))
.setRequestType(Request.Method.GET)
.setRequestUrl("http://test.co.kr");

NetworkHelper.apiCall(builder.build(), new ResponseListener() {
@Override
public void onSuccess(JSONArray data) {
Log.i("TEST","SUCCESS");
}

@Override
public void onFail(VolleyError error) {
Log.i("TEST","FAIL");
}
});
}


이렇게 하면 데이터가 정상적으로 들어온다.



마치며


금번 포스트에서는 네트워크 통신의 대표 라이브러리 중 Volley 라이브러리에 대해 알아 보았다.

Volley의 경우, 기존 Retrofit 사용자에게는 속도면에서 느리다는 느낌을 받을 수 있으나, Volley 라이브러리도 기타 옵션을 설정하고 최적화 한다면, 충분히 Retrofit과 필적할 만한 라이브러리라고 생각한다.


또한 Volley의 경우, 네이버에서 공개한 Volley Extension이라는 커스텀 라이브러리도 있기에 해당 라이브러리를 이용하여 처리한다면 훨씬 더 편하고 쉽고 빠르게 네트워크 통신 처리가 가능하지 않을까 생각한다.

반응형

+ Recent posts