반응형

웹서버에 요청하고 응답을 받을 때는 HttpURLConnection을 사용할 수 있습니다.

하지만 요청과 응답을 위한 코드의 양이 많은 데다가 스레드를 사용하면서 더 많은 코드를 넣어주게 됩니다.

그렇다면 코드의 양을 좀 더 적게 할 수 있는 방법은 없을까요?

안드로이드에서 제공하는 HTTP 라이브러리를 사용하면 쉽고 빠르게 네트워크 통신을 할 수 있습니다.

여러 라이브러리 중에 많이 사용되는 대표적인 라이브러리인 Volley 라이브러리를 이용해 HTTP로 요청 하고 응답을 받는 방법에 대해 알아봅시다.



Volley

Volley 라이브러리는 웹 요청과 응답을 단순화시키기 위해 만들어진 라이브러리들 중의 하나입니다.

꼭 이 라이브러리를 사용해야 하는 것은 아니지만 앱에서 가장 많이 사용되는 라이브러리들 중의 하나이므로 어떻게 이 라이브러리를 사용하는지 알아두는 것이 좋습니다.

Volley를 사용하는 방법은 그리 어렵지 않습니다.

먼저 요청(Request) 객체를 만들고 이 요청 객체를 요청 큐(RequestQueue)라는 곳에 넣어주기만 하면 됩니다.

그러면 요청 큐가 알아서 웹서버에 요청하고 응답까지 받아 여러분이 사용할 수 있도록 지정된 메소드를 호출해줍니다.

Volley 라이브러리를 사용할 때의 가장 큰 장점은 스레드를 신경 쓰지 않아도 된다는 것입니다.

Volley가 가지는 몇 가지 장점들은 다음과 같습니다.

  • 네트워크 요청(Request) 우선 순위를 자동으로 관리한다.
  • 동시에 여러 네트워크 요청을 할 수 있다.
  • 요청을 할 때 Cache 적용 여부를 의식하지 않아도 된다. 

요청 큐가 내부에서 스레드를 만들고 웹서버에 요청하고 응답을 받고 나면 메인 스레드에서 결과를 처리할 수 있도록 만든 후 여러분이 설정한 리스너의 메소드를 호출해줍니다.

따라서 화면에 결과를 표시할 때 핸들러를 사용하지 않아도 됩니다.

 

Volley 사용하기

Volley는 외부 라이브러리이므로 build.gradle(Module: app) 파일을 열고 dependencies 중괄호 안에 라이브러리 정보를 추가해줍니다.

implementation 'com.android.volley:volley:1.1.0'

라이브러리를 사용할 준비가 되면 AndroidManifest.xml 파일 안에 인터넷 권한을 추가하는 일도 잊지 않고 해줍니다.

<uses-permission android:name="android.permission.INTERNET" />

사용자가 버튼을 클릭했을 때 요청 객체를 만들고 요청 큐에 넣어줍니다.

요청 객체는 다음과 같이 StringRequest 클래스를 이용해 만들 수 있습니다.

문자열을 주고받기 위해 사용하는 요청 객체이며 Volley 라이브러리 안에는 이외에도 다른 유형의 요청 객체가 몇 가지 제공됩니다.

일반적으로는 StringRequest 클래스만으로도 충분합니다.

StringRequest request = new StringRequest(
        Request.Method.GET,
        url,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                println("응답 -> " + response);

                processResponse(response);
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                println("에러 -> " + error.getMessage());
            }
        }
) {
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String,String> params = new HashMap<String,String>();

        return params;
    }
};

요청 객체를 new 연산자로 만들 때는 네 개의 파라미터를 전달할 수 있습니다.

첫 번째 파라미터로는 GET 또는 POST 메소드를 전달합니다. 요청 방식을 지정하는 것이죠.

두 번째 파라미터로는 웹서버의 URL 정보를 전달합니다.

세 번째는 리스너 객체인데 응답을 성공적으로 받았을 때 이 리스너의 onResponse 메소드를 자동으로 호출해줍니다.

네 번째는 에러가 발생했을 때 호출될 리스너 객체입니다.

만약 POST 방식에서 전달할 요청 파라미터가 있다면 getParams 메소드에서 반환하는 HashMap 객체에 넣어줍니다.

이렇게 만든 요청 객체는 요청 큐에 넣어주는 것만 해주면 됩니다.

AppHelper.requestQueue.add(request);

요청 큐는 앱이 시작되었을 때 초기화되어 있기만 하면 되고 한 번 만들어두면 계속 사용할 수 있습니다.

따라서 Application 클래스를 정의하고 앱에 등록하여 사용하는 경우에는 이 Application 클래스 안에 넣어둘 수도 있고 AppHelper와 같은 별도의 클래스를 만들어 그 안에 넣어둘 수도 있습니다.

AppHelper 클래스 안에는 static 키워드를 이용해 앱의 어느 곳에서도 접근할 수 있도록 만들어줍니다.

public class AppHelper {
    public static RequestQueue requestQueue;
}

응답 받은 데이터가 정상적으로 화면에 보이나요?

 


반응형

'안드로이드 개발 > 부스트코스(안드로이드 프로그래밍)' 카테고리의 다른 글

이미지 다운로드  (0) 2019.03.19
JSON GSON  (0) 2019.03.19
웹으로 요청하기  (0) 2019.03.18
HTTP 이해하기  (0) 2019.03.16
소켓 사용하기  (0) 2019.03.16
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기