진짜 개발자
본문 바로가기

Language/Java

Java - Retrofit이란? (retrofit 사용법 자세한 설명)

728x90
1. Retrofit이란

BackEnd 또는 FrontEnd를 개발하다보면 거의 필수적으로, 다른 서버에 데이터를 요청할 일이 생기게 됩니다. 특히나 FrontEnd의 경우에는 서버로부터 데이터를 받아와 출력하는 경우가 잦습니다.

 

저의 경우, 매번 HttpClient들을 검색을 통해 찾아보고 사용하고 또 찾아보고.. 를 반복했습니다. 결국, 제대로 이해를 하지 못했다는 의미인듯 합니다.

 

때문에, 이번 시간에는 Java의 HttpClient 라이브러리들 중 하나인 Retrofit에 대해 정리해보려고 합니다.

 

 

 

1. Retrofit이란?

출처 : https://square.github.io/retrofit/

  • Retrofit은 TypeSafe한 HttpClient 라이브러리입니다. TypeSafe하다는게 어떤 의미일까요? 예, 바로 네트워크로 부터 전달된 데이터를 우리 프로그램에서 필요한 형태의 객체로 받을 수 있다는 의미입니다.

 

  • 사실 Retrofit은 기본적으로 OKHttp에 의존하고 있습니다.

 

 

 

2. HttpClient Library를 왜 사용할까?

Http통신을 가장 간단히 사용한다면, HttpURLConnection을 많이 사용해보셨을 것 입니다. Java.net에 내장되어 있기때문에, 별도의 라이브러리 없이 사용했던 기억이 납니다. 그렇다면, 이러한 클래스를 이용하면 되는데 왜 굳이 Retrofit, Okhttp, Volley등과 같은 라이브러리를 사용할까요?

 

 

Http 개발의 어려움

라이브러리들 만을 이용해 개발해보신분들께서는 이렇게 생각하실 수도 있습니다. "아니 그냥 HttpRequest하고 Response의 Body를 Parsing해서 사용하면 되는것 아닌가?"

 

이렇게 생각하신다면, 사용하신 라이브러리가 정말 잘 만들어졌다는 것을 반증하는 것일 수도 있습니다. 그게 아니면, 정말 간단히 사용하는 경우에는 그럴수도 있겠습니다만. 보통 Http를 개발한다면, 아래의 것들을 고려해야 합니다.

 

  • 연결
  • 캐싱
  • 실패한 요청의 재시도
  • 스레딩
  • 응답 분석
  • 오류 처리

...

정말 많습니다. 단지, Http 요청을(성능좋고, 오류가 적은) 위해서, 저 많은 것들을 개발하다보면 배보다 배꼽이 커지는 것은 당연하겠습니다.

 

 

HttpURLConnection

HttpURLConnection은 가장 원시적인 방법의 HttpClient입니다.

장점

  • java.net 에 포함된 클래스로 별도의 라이브러리 추가가 필요 없습니다.
  • 자신이 원하는 방식으로 커스텀하여 사용할 수 있습니다.(단점이기도 함)

 

단점

  • 자유도가 높은 대신, 직접 구현해야하는 것들이 많습니다.

 

 

 

 

3. Retrofit 사용법

https://square.github.io/retrofit/

자세한 정보는 역시 공식 사이트를 참고하시는게 좋습니다.

 

3.1 dependecy(gradle) 추가

Retrofit을 사용하기 위해서 기본적으로 retrofit의 의존성이 필요합니다. 하지만 결과를 원하는 객체로 변환하여 받기 위해서는 gson converter라이브러리를 같이 등록해주어야 합니다. 저의 경우 buildtool로 gradle을 사용하고 있습니다. 따라서, build.gradle에 위와 같이 추가하면 됩니다.

 

 

3.2 interface에 HTTP API 기술

retrofit은 Interface에 기술된 명세를 Http API로 전환해 줍니다. 따라서 우선, 우리가 요청할 API들에 대한 명세만을 Interface에 기술해두면 됩니다.

 

API 어노테이션

기본적으로 GET, POST, DELETE, PUT을 지원합니다. 위 예제의 경우 HTTP Get 요청을 의미합니다.

*URL의 스킴, 프로토콜, 호스트위치, port를 포함하는 BaseURL의 경우 Retrofit Client 생성시 입력하기 때문에 또한 ()안에는 요청할 서버의 자원의 위치를 나타내는 url만을 입력해주면 됩니다.

 

반환 타입

반환 되는 타입은 Call<객체타입>의 형태로 기술해야 합니다.

 

 

 

3.3 HTTP API 인터페이스의 구현체 생성

앞서 말씀드렸듯 Retrofit은 Interface에 기술된 HTTP API의 구현체를 생성해줍니다. 메소드와 변수를 하나씩 천천히 설명 드리겠습니다.

 

BASE_URL

앞서 말씀드렸던, 우리가 요청할 서버의 기본 URL입니다. 마땅히 요청할 서버가 없다면 https://reqres.in/과 같은 Open RestAPI Test 서버를 이용하는 것도 좋은 방법입니다.

 

getInstance()

  • 우선 setLenient()설정이 된 Gson 객체를 만듭니다. 이는 Json 응답을 객체로 변환하기위해 필요합니다.
  • Retrofit.Builder() 를 이용해 Baseurl 설정, 응답을 객체로 변환하기 위한 GsonConverter설정을 하여 Retrofit Client를 생성합니다.

getInstance() 메소드는 위의 2가지 행위의 결과로 반환되는 Retrofit 클라이언트 객체를 반환합니다.

 

getApiService()

getApiService() 메소드는 앞서 구현한 getInstance() 메소드를 이용해, Retrofit 클라이언트를 생성한 뒤, Retrofit 클라이언트를 이용하여, Http API 명세가 담긴 Interface의 구현체를 생성한 뒤 반환합니다.

 

 

 

3.4 동기 호출(결과값 받기)

앞서 생성한 HTTP API 명세가 담긴 Interface에, getTest() 메소드의 결과값을 Call<Object>로 지정했기 때문에, 결과값 또한 Call<Object>에 담아줍니다. 이 후 getTest의 excuete() 메소드를 호출하면 요청이 전송됩니다.

 

성공입니다.