안드로이드/Android

[Android] 안드로이드 HTTP 통신

block_626 2022. 7. 29. 12:10

앱에서 가장 많이 수행하는 처리중 하나는 서버에 데이터를 요청하고 받아온 데이터를

클라이언트 화면에 표시하는 것입니다.

이때 클라이언트와 서버가 통신하는 방식은 크게 소켓연결과 http연결 두가지 방법이 있습니다.

 

소켓 연결

 - 소켓: 네트워크 상의 두 프로그램 사이에서 일어나는 양방향 통신중 한 쪽의 엔드 포인트

 - 주로 동영상 스트리밍이나 온라인 게임 등에서 사용되는 방식

 - 클라이언트와 서버가 특정 포트를 통해 연결을 계속 유지

 

HTTP 연결

 - 정의

   Hyper Text Transfer Protocol의 약자

   80번 포트를 사용하여 웹 상에서 정보를 주고받을 수 있는 프로토콜

 - 동작방식

    클라이언트가 서버에 헤더(header)와 바디(body)로 이루어진 메시지를 요청(request)

    서버는 이 요청을 처리하고 응답코드와 함께 응답(response)을 반환

 - 특징

    비연결성(Connectionless)

     - 처음 연결을 맺은 후 요청(request)과 한 번의 응답(response)이후 연결이 종료됩니다.

       이것을 connectionless라고 표현합니다.

       이렇게하면 서버에 여유가 생겨서 더 많은 접속요구에 대응할 수 있게 됩니다.

       매번 연결을 맺어 느려지는 것을 보완하기 위해 KeepAlive와 같은 속성을 활용할 수 

       있습니다.

 

    무상태성(Stateless)

     - 통신이 일어날때마다 새로운 접속을 생성하고 삭제하는 Connectionless특징 때문에

       프로토콜에서 클라이언트의 상태를 기억하지 않습니다.

       이것을 무상태성,  Stateless라고 합니다.

       서버가 클라이언트를 기억해야 할 경우 cookie, session, token등을 이용하여 클라이언트의

       상태를 유지합니다.

 

 

HTTP Method

HTTP Method란 클라이언트가 서버에 메시지를 보낼 때 어떤 목적을 가졌는지 밝히는 것입니다.

일반적으로 많이 사용되는 GET, POST, PUT. DELETE이외에도 여러가지 명령어가 있습니다.

냉동코더님 블로그 참조


RESTful API

구글, 페이스북, 네이버, 카카오 등등 많은 IT회사는 자기 회사의 서비스를 이용할 수 있도록 REST API를 제공합니다.

여기서 REST API란?

REST( Representational State Transfer)의 약자로 자원의 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든것을 의미합니다.

1. HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시

2. HTTP Method(POST, GET, PUT, DELETE)를 통해

3. 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미합니다.

 

일반적으로 다음과 같은 특징이 있고 이 특징들을 만족하면 RESTful하다고 하며 RESTful하게 작동하도록 만든

API를 RESTful API라고 합니다.

1. Server-Client (서버 - 클라이언트 구조, 클라이언트와 서버의 분리)

2. Stateless (무상태성)

3. Cacheable (캐시 처리 가능)

4. Layered System(시스템의 계층화)

5. Uniform Interface(일괄성있는 인터페이스)

 

Http Method와 RESTful API의 대응표

냉동코더님 블로그 참조

Android HTTP 통신 라이브러리

안드로이드에는 HTTP통신을 구현하는 여러가지 라이브러리가 있는데, 주요하게 사용된 몇가지 라이브러리에 대해 알아보겠습니다.

HTTPClient

Http통신을 용이하게 수행하기 위해 Apache에서 제작한 라이브러리입니다.

안드로이드 초기에 주로 사용되었으며 실제로는 HttpClient를 래핑한 DefaultHttpClient나, 안드로이드에 맞게 개수한 AndroidHttpClient가 사용되었습니다.

 

HttpClient는 안드로이드와 독립적으로 개발되는 라이브러리인지라 변경점을 android SDK에 일괄적으로 즉시 반영할 수 없었습니다.

결국 버전이 뒤처지면서 버그가 계속 발생하게 되었고, HttpClient는 Android5.1에서 Deprecated되며 6.0에서는 아예 삭제되었습니다.

 

HTTPUrlConnection

HttpClient를 삭제하면서 구글에서 제시한 대한이 HttpUrlConnection인데, 기존의 URLConnection에 HTTP를 다루는데 필요한 메서드를 추가한 클래스입니다.

URL.openConnection()으로 얻어진 URLConnection객체를 HttpUrlConnection으로 캐스팅하여 데이터를 송수신하고 disconnect로 접속을 종료하는 방식으로 사용합니다.

냉동코더님 블로그 참조


Volley

HttpUrlConnection을 사용할 때는 Application Not Responding(ANR)을 피하기 위해 백그라운드 스레드도 만들어어야하고, 버퍼를 통한 입출력도 준비해야 하고, 캐시나 예외처리도 하나하나 다 처리해 주어야 하는 불편함이 있습니다.

 

그래서 구글에서는 HTTP연결을 만들때마나 이런 귀찮은 일을 안해도 되는 라이브러리인 Volley를 2013년 GoogleI/O에서 발표했습니다.

Volley는 다음과 같은 특징이 있습니다.

 - Automatic scheduling of network requests.

 - Multiple concurrent network connections.

 - Transparent disk and memory response caching with standard HTTP cache coherence.

 - Support for request prioritization.

 - Cancellation request API. You can cancel a single request, or you can set blocks or scopes of requests to cancel.

 - Ease of customization, for example, for retry and backoff.

 - Strong ordering that makes it easy to correctly populate your UI with data fetched asynchronously from the network.

 - Debugging and tracing tools.

 

사용법은 HTTP메소드와 url정보를 가진 Request를 만들어서 RequestQueue에 넣어둡니다.

그러면 Volley가 알아서 스레드를 만들고 HttpUrlConnection으로 통신을 수행한 뒤 response를 반환해줍니다.

예제코드를 보게되면 HttpUrlConnection을 직접 사용할 때보다 코드가 더 읽기 쉬워진 것을 알 수 있습니다.

냉동코더님 블로그 참조


OkHttp

2013년 5월 6일에 Square에서 OkHttp라는 Http클라이언트 라이브러리를 발표합니다.

이 라이브러리는 Okio와 코틀린을 활용해 쓰여졌고 다음과 같은 특징이 있습니다.

Connection pooling과 Redirection을 도입해 접속을 더 안정적이게 하면서도, 속도를 개선시킬 수 있는 여러가지 기술이 적용되었습니다.

 - HTTP/2 support allows all requests to the same host to share a socket.

 - Connection pooling reduces request latency (if HTTP/2 isn’t available). 

 - Transparent GZIP shrinks download sizes.

 - Response caching avoids the network completely for repeat requests.

 

사용법은 클라이언트 인스턴스를 생성하고 request객체를 만들어 클라이언트에 전해주면 response가 반환되는 구조를 가지고 있습니다.

냉동코더님 블로그 참조


Retrofit

Retrofit은 OkHttp를 개발한 Square에서 2013년 5월 14일에 발표한 라이브러리입니다.

HttpURLConnection을 사용하기 편하도록 랩핑하게Volley라면 Retrofit은 OkHttp를 랩핑한 것입니다.

 

사용방법은 우선 REST API콜을 인터페이스 형식으로 준비합니다.

그리고 Retrofit객체를 만들어서 인터페이스의 인스턴스를 생성합니다.

마지막으로 인터페이스를 동기 혹은 비동기적으로 구동시켜 response를 반환받게 되어 있습니다.

냉동코더님 블로그 참조


Ktor

Jetbrains에서 개발한 Ktor는 코틀린을 이용해 비동기 서버와 클라이언트를 구축할 수 있게 해주는 라이브러리입니다.

1.6.3버전까지 발표되어 있으며 현재도 활발한 업데이트가 이루어지고 있습니다.

안드로이드에서 사용법은 코루틴 스코프 안에서 Http클라이언트를 만들어서 request를 보내고 response를 확인한 뒤,

클라이언트의 리소스를 close로 반환하면 됩니다.

냉동코더님 블로그 참조


Volley of Retrofit?

안드로이드의 통신 라이브러리로는 주로 Volley나 Retrofit을 이용하게된다.

그렇다면 둘 중 어느것을 사용하는게 좋을까?

 

volley오 Retrofit은 지금도 꾸준히 갱신되고 있는 라이브러리인데, 두 라이브러리의 기능차이는 다음과 같이 정리할 수 있습니다.

냉동코더님 블로그 참조

API콜을 인터페이스로 정의해서 사용하는 Retrofit이 전체 구조를 파악하기 더 좋은거 같아 Retrofit을 선호합니다.

그리고 구글의 권장 앱 아키텍처에서는 HTTP통신에 Volley가 아닌 Retrofit을 추천하고 있습니다.