마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[android] urlConnection 객체를 retrofit 라이브러리를 사용하도록 바꾸는 법

0 추천
http 연결 여부 확인 소스

 URL url = new URL(webUrl);
 urlConnection = (HttpURLConnection) url.openConnection();
 urlConnection.setConnectTimeout(5000);
   urlConnection.connect();
connYn = urlConnection.getResponseCode() == 200;

return connYn ;

 

위의 소스를 retrofit 이라는 라이브러리를 사용하도록 개선하고자하는데

인터페이스를 만들라고 하는게 이해가 잘 안가서 질문드립니다.

위의 소스는 연결값이 200 이면 return true 를 하고

저는 그 true false 값이 필요한 상황인데

retrofit 에서도 동일한 기능을 할 수 있도록 소스를 짤 수 있을까요?

저 혼자 개선을 해보려는데 인터페이스를 만들어서 어떻게 true false 값을 뱉어내는지

감이 안잡히네요

샘플 코드라도 알려주시면 좋겠습니다. 감사합니다. ㅎㅎ
골든레미 (250 포인트) 님이 2021년 5월 6일 질문

1개의 답변

0 추천
 
채택된 답변

Retrofit의 인터페이스는 http(s) 통신에 필요한 request와 response 정보만을 알려주고 Retrofit 이 실제적인 구현을 대신해 줍니다. 결국 http 통신이란게 일정한 동작의 순서를 통해 처리되기 때문에 직접 구현하다 보면 동일한 패턴을 사용하게 됩니다. 따라서 이 부분은 Retrofit이 별도의 코드를 작성하는 번거로움을 대신 처리해 줍니다. 하지만 어떤 request와 response가 필요한지는 API 마다 달라지므로 인터페이스의 형태를 띄게 되는 겁니다.

해당 서버의 API가 어떤 통신 포맷으로 처리되는지 확인해 보세요. JSON, XML, Protobuf 냐에 따라 Response에 다른 어댑터가 필요합니다. 단지 http status code만 필요할 때 이 어댑터를 꼭 사용해야 하는지 아닌지는 그렇게 사용해 본 적이 없어서 확실하게 답을 드릴 수가 없네요.

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

위의 사이트가 Retrofit을 관리하는 웹사이트입니다. https://github.com/square/retrofit 에 보시면 상당히 많은 샘플 코드들이 있습니다. 

구글을 검색해 보면 엄청난 양의 튜토리얼 검색결과를 찾으실 수 있습니다. 아래 사이트도 그 중의 하나이구요.

https://www.vogella.com/tutorials/Retrofit/article.html

간단하게 기본적인 내용을 설명드리면,

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

interface 의 이름은 님이 알기 쉬운 서비스 이름을 사용하시면 됩니다. 위는 Github의 API를 사용하는 샘플 인터페이스이구요.

@GET

은 listRepos라는 메소드가 호출할 API가 GET방식이라는 걸 말합니다. RESTful API에는 보통  GET/POST/PUT/DELETE의 네가지를 사용합니다. 따라서 호출하실 API가 어떤 방식을 지원하는지 확인하셔야 합니다. HTTPURLConnection 코드로 보아서는 GET일 것으로 추측은 됩니다. POST 같은 툴로 해당 API의 URL을 호출해 보면 쉽게 확인이 가능합니다.

그리고 Call<List<Repo>>에서 Call은 Retrofit의 Callback 응답 타입입니다. Generic 타입이구 이 콜백의 실제 응답 타입이 List<Repo>형태가 됩니다. 님의 경우는 응답 타입없이 사용해 본 적이 없어서 될지는 모르지만 별도롤 응답데이터 타입이 필요가 없으므로 Call<Void>또는 Call<Object>, Call<String> 등 아무 타입이나 지정해도 되지 않을까 생각되네요.

"users/{user}/repos"는 호출할 API의 주소인데 Retrofit에 BaseURL과 함께 사용되어서 완전한 URL이 됩니다. 예를 들어 BaseURL이 "https://github.com/" 이고 @GET("user/user1/repos")이면 실제 API URL은 "https://github.com/user/user1/repos" 이 됩니다. BaseURL은 Retrofit을 생성할 때 Builder라는 곳에 세팅을 해주셔야 하구요.

@Path("user") String user 부분은 요청값을 지정하는 부분입니다. 님의 경우는 요청값이 필요없기 때문에 아무 것도 넘기시지 않으시면 될 것 같네요.

응답값은 Retrofit 의 콜백에 Response라는 객체가 넘어오는데 여기에서 code()라는 메소드를 통해 http status code를 읽어서 비교하시면 됩니다.

아마 알려드린 링크들만 잘 살펴보셔도 충분히 원하시는 결과를 얻으실 수 있을 거라고 생각합니다.

 

 

spark (224,800 포인트) 님이 2021년 5월 6일 답변
골든레미님이 2021년 5월 11일 채택됨
아마도 Retrofit 관련해서는 https://futurestud.io/가 제일 괜찮은 사이트 같네요. 그리고 단순한 커넥션만 체크하시는 거면 아마도 OkHttp3라고 Retrofit과 같이 자주 쓰이는 같은 회사의 라이브리러가 있는데, 이 라이브러리가 더 적합한 용도일 수도 있습니다. 이것도 한번 살펴보시죠.
...