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 기술
ximport retrofit2.Call;
import retrofit2.http.GET;
public interface TestService {
"/api/users/2") (
Call<Object> getTest();
}
retrofit은 Interface에 기술된 명세를 Http API로 전환해 줍니다. 따라서 우선, 우리가 요청할 API들에 대한 명세만을 Interface에 기술해두면 됩니다.
API 어노테이션
기본적으로 GET, POST, DELETE, PUT
을 지원합니다. 위 예제의 경우 HTTP Get 요청을 의미합니다.
*URL의 스킴, 프로토콜, 호스트위치, port를 포함하는 BaseURL의 경우 Retrofit Client 생성시 입력하기 때문에 또한 ()
안에는 요청할 서버의 자원의 위치를 나타내는 url만을 입력해주면 됩니다.
반환 타입
반환 되는 타입은 Call<객체타입>
의 형태로 기술해야 합니다.
3.3 HTTP API 인터페이스의 구현체 생성
xxxxxxxxxx
public class RetrofitClient {
private static final String BASE_URL = "https://reqres.in/";
public static TestService getApiService() {
return getInstance().create(TestService.class);
}
private static Retrofit getInstance() {
Gson gson = new GsonBuilder()
.setLenient()
.create();
return new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
}
앞서 말씀드렸듯 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 동기 호출(결과값 받기)
xxxxxxxxxx
public class MainTest {
public static void main(String[] args) {
Call<Object> getTest = RetrofitClient.getApiService().getTest();
try {
System.out.println(getTest.execute().body());
} catch (IOException e) {
e.printStackTrace();
}
}
}
앞서 생성한 HTTP API 명세가 담긴 Interface에, getTest()
메소드의 결과값을 Call<Object>
로 지정했기 때문에, 결과값 또한 Call<Object>
에 담아줍니다. 이 후 getTest의 excuete() 메소드를 호출하면 요청이 전송됩니다.
성공입니다.
'Language > Java' 카테고리의 다른 글
Java - Stream 이란? (Stream과 Collection, Stream 각 연산) (2) | 2020.01.05 |
---|---|
Java - LocalDateTime, LocalDate 날짜 차이 구하기 (관련 이슈처리) (0) | 2019.10.22 |
Java - jjwt 사용법 (1) | 2019.07.11 |
Java - ArrayList 제거 안되는 문제(Wrapper Class) (0) | 2019.07.02 |
Java - Annotation 이란? Annotation 사용법 (0) | 2019.05.02 |