자, 저번 글에선 Client-Server Architecture에 대해 배웠다. 이제 우리의 클라이언트와 서버가 자원을 주고 받기 위해 필요한 작업, REST에 대해 알아보자.
REST
Representational State Transfer의 약자이다.
- 클라이언트-서버간 데이터 전송 아키텍처이다.
- 자원을 이름으로 표현하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다.
- 인터넷에서 정보 공유를 위해 정의되었다.(표현형식 HTML | 식별자 URI | 전송 프로토콜 HTTP)
- HTTP URI (Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고
- HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
HTTP URI : Uniform Resource Identifier
문서, 그림, 영상 등 자원 식별용 이름(경로)
CRUD Operation
Create : 생성(POST)
Read : 조회(GET)
Update : 수정(PUT)
Delete : 삭제(DELETE)
HEAD: header 정보 조회(HEAD)
"HTTP URI와 HTTP method를 이용한 클라이언트와 서버 간 통신 아키텍처"
REST API
- REST 아키텍처 스타일로 구현한 API를 REST API라 부른다.
- REST는 HTTP 표준을 기반으로 구현한다. 따라서 HTTP를 지원하는 언어인 자바, C#, 웹 등을 이용해 클라이언트 및 서버를 구현할 수 있다.
HTTP의 메소드(POST, GET, PUT(or PATCH), DELETE)를 사용해서 나의 클라이언트로부터 서버와 데이터를 CRUD하는 API를 만들어 놓고, 사용하는 것이다.
이 때 REST API 작성 시 지켜야 할 사항들이 있다.
글을 쓰기엔 양이 많고, 대신 정말 괜찮은 글을 하나 링크로 남기겠다.
설명이 매우 친절하시다.. 참고
실제 앱 개발에서 retrofit
- Retrofit
TypeSafe한 HttpClient 라이브러리이다.
"서버-클라이언트 간 http 통신을 위한 코드를 편하게 작성하게 해주는" 라이브러리이다.
"REST API 방식을 사용"한다.
기존 OKHttp를 기반으로 만들어진 라이브러리이다.
- TypeSafe
TypeSafe하면 Type Check를 할 수 있기 때문에, Runtime 시가 아닌 컴파일 시 문제를 잡을 수 있다. 네트워크로부터 전달된 데이터를 우리 프로그램에서 필요한 형태의 객체로 받을 수 있게 된다.
- OKHttp를 기반으로 만들었음 | Retrofit ⊂ OKHttp
Okhttp는 REST API, HTTP 통신을 간편하게 구현할 수 있도록 다양한 기능을 제공해주는 라이브러리이다. Retrofit의 하위 호환 라이브러리이다. 지금은 거의 안 쓰이지만, Retrofit은 이 OKhttp를 기반으로 만들어졌다. 따라서 Retrofit 라이브러리를 적용하면 OKhttp의 메서드도 사용할 수 있다.
- OKHttp
Java.net에 내장돼있는 HttpURLConnection을 사용하면 Http 네트워크 통신 처리를 할 수 있다. 하지만 Http를 사용하기 위해 연결, 캐싱, 실패한 요청의 재시도, 스레딩, 응답 분석, 오류 처리 등등을 설정해줘야 하는데, 이러한 과정을 OKhttp라는 라이브러리가 해준다. 당연히 이 모든 기능을 상위 호환인 Retrofit이 제공한다. 성능 또한 더 좋다.
- Retrofit vs. Volley
Retrofit과 비슷한 라이브러리로 Volley가 있지만, 인터페이스 내에서 어노테이션(@)으로 HTTP 메소드를 정의하기 때문에 가독성이 더 높은 Retrofit이 사용 만족도가 더 높다. 코드 가독성도 좋은데 성능도 더 좋다.
- Retrofit
- TMI - AsyncTask 안 쓰는 이유?
Okhttp는 AsyncTask를 사용하여 구현했다고 할 수도 있다. 하지만 AsyncTask 로 클라이언트-서버 HTTP 통신을 구현하는 것은 어렵고 시간이 많이 든다. 비동기 처리 코드를 개발자가 하나하나 작성해야 되기 때문이다. 또한 AsyncTask 자체가 안드로이드에서 deprecated 되었다. 그래서 이제 AsyncTask 를 사용하여 클라이언트-서버 통신을 구현하는 것은 좋은 생각이 아니다.
Retrofit Code
Retrofit을 사용하려면 다음 세 가지 클래스가 필요하다.
- JSON 형태의 모델 클래스 (kotlin - data class)
- HTTP 작업을 정의하는 인터페이스
- Retrofit.Builder를 선언한 클래스
- baseUrl과 Converter등을 선언한다. Interceptor를 추가하여 응답을 가공할수도 있다.
위의 코드들처럼 Call API 쓰는 것보다 코루틴 쓰는게 훨씬 좋다.
코루틴 - 경량 쓰레기 쓰기 + Constructed concurrency