REST + REST API + Retrofit

don9wan·2021년 9월 26일
0

Android

목록 보기
4/18
post-thumbnail
post-custom-banner

자, 저번 글에선 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 작성 시 지켜야 할 사항들이 있다.
글을 쓰기엔 양이 많고, 대신 정말 괜찮은 글을 하나 링크로 남기겠다.
설명이 매우 친절하시다.. 참고

  • resource의 구성
    resource의 이름이 topics라고 했을 때.

    • 컬렉션 : 리소스에서 튜플의 집합
      h.ttp://example.com/topics
    • 엘리먼트 : 리소스에서 하나의 튜플
      h.ttp://example.com/topics/1 (topics 리소스에서 id가 1인 엘리먼트를 의미)
    • 추가적으로, 리소스가 다른 리소스 내에 포함되어 있을 수 있다.
  • REST API가 규정하고 있는 것

    • URI를 통해서 식별한다.
    • 어떤 행위를 할 때 HTTP의 고유한 CRUD메소드를 사용해야 한다.
    • 요청을 하고 나면 응답이 오는데, 응답 코드가 포함돼있다.
      숫자와 text로 이루어진 응답코드는 해당 데이터 전송 처리가 어떻게 됐는지에 대해 알려준다.
  • 규정하고 있지 않은 것

    • 데이터 형식(json, xml, ..)은 자유다.
  • REST API의 사용

    • topics 리소스 컬렉션에 데이터 추가
    • topics 리소스 컬렉션 데이터 모두 가져오기
    • topics 리소스의 2번 엘리먼트만 가져오기
  • REST API에 대한 나의 정리

    • REST API란 REST 기반으로 서비스 API를 구현한 것
    • REST 아키텍처를 통해 데이터 통신을 자주 할 것이라면, 잘 만들어진 REST API를 만들어 편하게 사용하자.
    • REST API를 사용하면
      1. HTTP의 CRUD 메소드 POST/GET/PUT/PATCH/DELETE 중에 어떤 종류인지
      2. 어떤 데이터를 보낼건지(데이터의 경로인 URI)
      3. 데이터의 형식을 어떤걸로 해서 보낼껀지(json/xml/..)
      4. 등등
    • 정도만 작성하고, REST API가 나머지 HTTP(rotocol)의 헤더, 바디 부분을 작성하여 서버로 쏴주는 것이다. 이것이 REST API가 해주는 역할이라고 생각한다.

      REST API 및 HTTP 통신을 위한 코드 작성을 편하게 해주는 라이브러리가 존재한다.
      안드로이드 앱 개발에서 흔하게 사용되는 Retrofit이다.

실제 앱 개발에서 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
profile
한 눈에 보기 : https://velog.io/@dongwan999/LIST
post-custom-banner

0개의 댓글