안드로이드 HTTP 통신
Tip : Socket 통신은 양방향 통신을 통해 특정 포트를 이용하여 지속적으로 통신하는 것이다. 동영상 스트리밍이나 온라인 게임등에서 사용되는 연결방식이다.
HTTP 통신이란?
가장큰 특징은 StateLess와 ConnectionLess의 특징을 가지고 있다.
동작 방식
- 클라이언트가 서버에 Header와 Body로 이루어진 메시지를 요청(Request)
- 서버는 이요청을 처리하고 응답코드와 함께 요청을 반환한다. Ex) HTTP/1.1 200 OK
StateLess
- stateful은서버가 클라이언트의 이전 상태를 보존한다는 의미이다. 반대로 무상태(stateless)는 서버가 클라이언트의 이전 상태를 보존하지 않는다는 의미이다. 따라서 기억을 보존하기위해 Client에 상태를 저장하는 쿠키 방식과 Server에 저장하는 Session 방식을 가지고 있다.
ConnectionLess
- 비연결성은 클라이언트가 서버에 요청을 하고 응답을 받으면 바로 TCP/IP 연결을 끊어 연결을 유지 하지 않는 것이다. 이를 통해 서버의 자원을 효율적으로 관리하고, 수 많은 클라이언트의 요청에도 대응할 수 있게 한다. HTTP는 연결을 유지하지 않는 모델을 기본으로 한다. 수 천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수 십개 이하로 작다(예를 들어 구글을 수 천명이 이용해도 검색을 수 천명이 동시에 이용하지는 않는다. TCP 통신 중 3-Way-handShake 같은 시간이 걸리게 된다.
HTTP 메소드 종류와 특징
HTTP 메소드의 종류는 총 9가지가 있다. 이 중 주로 쓰이는 메소드는 5가지가 있다. 이제 각각의 이름과 특징에 대해 알아보도록 하자.
주요 메소드 5가지
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 데이터 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스를 일부만 변경
- DELETE : 리소스 삭제
기타 메소드 4가지
- HEAD: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
- OPTIONS: 대상 리소스에 대한 통신 가능 옵션을 설명(주로 CORS에서 사용)
- CONNECT: 대상 자원으로 식별되는 서버에 대한 터널을 설정
- TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
여기서 주요 메서드 5가지에 대해 좀더 자세하게 알아보도록 하자.
GET은 보통 리소스를 조회할 때 사용하며, 서버에 전달하고 싶은 데이터는 query를 통해서 전달한다. 메시지 바디를 사용해서 데이터를 전달할 수는 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다.
POST는 데이터 요청을 처리하고, 메시지 바디를 통해 서버로 데이터를 전달한다. 주로 신규 리소스를 등록하거나 프로세스 처리에 사용된다.
PUT은 리소스가 있으면 대체하고 리소스가 없으면 생성한다. 쉽게 말해 데이터를 덮어쓴다.
PATCH는 PUT과 마찬가지로 리소스를 수정할 때 사용하지만, PATCH는 리소스를 일부분만 변경할 수 있다.
DELETE는 리소스를 제거할때 사용한다.
출처 : https://developer.mozilla.org/ko/docs/Web/HTTP/Methods
1. 클라이언트와 서버의 분리
2. StateLess
3. 캐시 처리가 가능해야함
4. 시스템이 계층화 돼있어야 함
5. 일관성 있는 인터페이스여야 한다.
안드로이드 에서 HTTP 다루기
1. Volly
- 특징
- 네트워크 요청의 자동 스케줄링
- 동시 네트워크 연결
- 요청 우선순위 지원
- 취소 요청 API, 단일 요청을 취소하거나 취소 블록 또는 범위를 설정할 수 있다.
- 재시도 및 백오프와 같은 사용자 지정 용이성
- 디버깅 및 추적 도구
구현
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TEST", "ERROR : " + error.getMessage());
}
});
2. OkHttp
- 특징
- 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.
- OKio와 코틀린을 활용하였음, Connection puuling과 redirection을 도입하여 속도를 높임,
우선 클라이언트 인스턴스 생성하고 Request객체를 만들어서 클라이언트에 전해주면 Response가 전환되는 방식,
구현
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();
}
}
3. Retrofit
- 특징
- HttpURLConnection : Volley
- OkHttp : Retrofit
- okhttp를 래핑하는 방식 가장 많이 사용하는 안드로이드 통신방법,
방법 : 우선 RestApi Call을 인터페이스 형식으로 준비한다. 이후 Retrofit 객체를 만들어서 interface의 Instance를 생성한다. 그 후 인터페이스를 동기적 혹은 비동기적으로 호출시켜서 Response를 반납받게 된다.
구현
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
GitHubService service = retrofit.create(GitHubService.class);
Call<List<Repo>> repos = service.listRepos("octocat");
4. Ktor
- 코틀린을 이용해 비동기 서버와 클라이언트를 구축할수 있게 해주는 라이브러리
구현
CoroutineScope(Dispatchers.IO).launch {
val client = HttpClient()
val response: HttpResponse = client.get("https://ktor.io/")
val stringBody: String = response.receive()
client.close()
}
정리
가장 많이 사용하는 Http 통신은 Volly와 Retorift이다. 이중 선택사항은 본인이 생각하면된다.
공통점
- 둘다 "Callback"을 재공할 수 있으며, 비동기 네트워크 호출이 완료되면 메소드 중 하나가 기본스레드에서 호출된다.
- API 엔드포인트를 지정하는 방법, 얻는 방법
- Volley 사용
- API 호출 시, 전체 엔드 포인트를 동적으로 지정할 수 있다.
- JSON Object 또는 JSON Array를 요청에 따라 반환한다.
- Retrofit 사용
- API 호출에 대한 기본 엔드포인트 url을 지정한 다음, JAVA annotaion을 이용해 엔드포인트를 지정하는 정적 인터페이스를 빌드
- GSON을 사용하여 자동으로 JSON 구문 분석을 수행
- 속도가 빠르다
- Volley 사용
- Retrofit이 API의 사용에서 오류, 캐싱, 페이징을 자동으로 처리하기 복잡하지 않다.
- 응답 시간 비교
'안드로이드 > 정리(Android)' 카테고리의 다른 글
Android) MVC, MVP, MVVM 아키텍처 비교 및 구현 (0) | 2022.10.29 |
---|---|
Android) WorkManager 워크매니저 (2) | 2022.09.11 |
Android) Databinding 정리 (0) | 2022.08.16 |
Android - Hilt(의존성주입) (0) | 2022.08.15 |
[Android] ViewModel 알아보기 (0) | 2022.08.04 |