# retrofit
(kotlin) retrofit
retrofit 안드로이드 앱에서 네트워크 통신을 쉽게 처리하기 위한 라이브러리 중 하나로, RESTful API와 데이터를 주고받는 데 사용된다. Retrofit과 LiveData를 사용하기위해 필요한 라이브러리를 의존성에 추가해준다. 인터넷을 사용하기 위해 manifest파일에 인터넷 사용권한을 추가해준다. Retrofit을 사용하기 위한 데이터 모델 클래스를 생성한다. (JSON 응답의 구조와 일치하는 kotlin 데이터 클래스 정의) Retrofit 인터페이스를 생성한다. 이 인터페이스는 서버의 엔드포인트와 요청 메서드를 정의한다. Retrofit 객체를 초기화하고 사용한다. 일반적으로 앱의 'Application' 클래스 또는 다른 적절한 위치에서 Retrofit 객체를 초기화 한다. ViewModel 클래스를 생성하여 네트워크 요청과 데이터 관리를 담당한다. 이제 Retrofit을 사용하여 네트워

Android Naver Search API 사용하기
🔥 Android 에서 Naver Search API 를 사용해보자 공식 문서 : https://developers.naver.com/docs/serviceapi/search/local/local.md#%EC%A7%80%EC%97%AD Android 에서 주변 식당 정보를 검색하기 위해 naver search api 를 사용해보았다. 검색 중에 지역을 검색할 수 있는 api 를 사용하였고, Retrofit 을 사용하여 API 통신을 수행하였다. 아래 예제를 통해 사용방법을 알아보자. 🌈 Naver Search API 살펴보기 ✓ 애플리케이션 등록 공식 문서 홈페이지에 로그인하고 Application 탭에서 애플리케이션을 만들어 등록한다. 등록을 완료하면 Client ID 와 Client Secret 을 찾아볼 수 있다. Client ID 와 Client Secret 은 api 사용 시 사용되므로 참고하자.
retrofit null & String response 처리(EOFException, JsonIOException)
문제 사항 기본적으로 retrofit 통신 response를 gson으로 변환하여 결과를 받는 방식을 사용하였으나 response가 null이거나 String일 때 따로 설정을 해주지 않으면 오류를 뱉어낸다. null일 경우 EOFException을, String의 경우 JsonIOException에러를 호출하는데 해결하기 위해서는 ConverterFactory를 추가해 주어야 한다. 생성해 준 NullOnEmptyConverterFactory가 null값에 대한 처리를 하고 retrofit2에서 제공하는 ScalarsConverterFactory가 String값에 대한 처리를 한다. 참고 ScalarsConverterFactory 내부 코드가 다음과 같은데, String뿐만 아니라 대부분의 primitive type에도 대응하는 듯하다.

[Android] Okhttp Interceptor에 대해(1)
📌 Interceptor란? Android에서 실제 서버 통신이 일어나기 직전, 직후에 요청들을 가로채서 기능을 추가적으로 수행할 수 있게 도와준다. okhttp3에 Interface 형태로 구현되어 있다. >이번 프로젝트에서 서버는 OAuth와 JWT를 구현하여, 때문에 서버 통신 헤더에 Token을 담아 통신해야 했기 때문에 Interceptor를 통해 기능을 구현하였다. > 📍 로직 AccessToken으로 리소스에 접근할 수 있으며, 만료시간은 30분이다. AccessToken이 만료가 되면, Refresh토큰으로 AccessToken을 갱신 시킨다. Refresh토큰의 만료시간은 7일이다. 곧바로 갱신된 AccessToken으로 방금 접근하려고 했던 리소스에 다시 접근한다. <img src="https://velog.velcdn.com/images/heeung/post/58f85165-b28a-449e-
Android, Django 서버의 JSON 데이터를 제공하는 API 엔드포인트로 요청 보내기
1. OkHttp를 사용한 방법 > client.newCall(request) 비동기적 네트워크 요청 Callback 인터페이스 구현 > 주의사항 네트워크요청은 UI 스레드에서 직접 수행하면 안됨 runOnUiThread나 다른방법 사용해야함 2. Retrofit을 사용한 방법 1) Gradle 파일에 Retrofit 의존성 추가 2) 데이터 모델 클래스 정의 JSON 데이터의 구조와 일치해야함 3) Retrofit 인터페이스 정의 4) Retrofit 인스턴스를 생성하고 API 호출을 처리하는 코드를 작성
Andorid, okhttp와 retrofit
okhttp와 retrofit은 안드로이드 앱에서 네트워크 요청을 처리하기 위해 있는 인기있는 라이브러리 OkHttp 간단하고 가볍고 유연한 HTTP 클라이언트 라이브러리 네트워크 요청을 보내고 응답을 받는 기능을 제공 직접 요청을 작성하고 응답을 처리할 수 있으며, 커스터마이징 용이 간단한 네트워크 요청을 처리하거나 기본적인 기능만 필요한 경우 적합 Retrofit OkHttp를 기반으로한 RESTful API 클라이언트 라이브러리 인터페이스 기반의 간편한 API 정의와 자동으로 직렬화/ 역직렬화 기능을 제공 API 엔드포인트에 대한 메서드를 정의, 매개변수와 응답형식을 지정하여 네트워크 요청 처리 가능 > Retrofit, Okhttp는 상호보완적 관계
Android Retrofit + Rxjava
🔥 Rxjava와 함께 Retrofit 구현하기 Retrofit 은 자체적으로 백그라운드에서 Thread 를 실행하고 Callback 을 통해 메인 Thread 에서 UI 업데이트가 가능하다. 이 때 주로 Call interface 의 enqueue 메소드를 통하여 비동기적으로 API 통신을 진행하고, onResponse 와 onFailue 로 통신 결과를 받는다. Rxjava 와 Retrofit 을 같이 사용할 경우에는 비동기 Thread 를 Rxjava 에서 사용하기 때문에 구독을 통해 진행한다. Rxjava 와 Retrofit 을 같이 사용하면 일관된 비동기 작업 관리를 할 수 있고, 복잡한 비동기 작업을 보다 쉽게 구현할 수 있다는 장점이 있다. 하지만, 간단한 어플리케이션인 경우에는 Rxjava 를 같이 사용할 필요는 없으므로 개발 상황과 프로젝트에 맞게 사용하면 된다. 아래 예제를 통해 Rxjava 와 Retrofit 을 사용하는 방법을 알아보자. <b
Android Retrofit xml
🔥 Android Retrofit 을 사용하여 xml 파일 파싱하기 > 🎈 Android 에서 Retrofit 을 사용하여 api 통신을 할 때, 대표적으로 xml 파일이나 json 파일을 요청하여 받는다. 이 중 xml 파일을 요청하여 받는 과정을 알아보자. 🌈 배경 이번 android 프로젝트에서 일출 일몰 API 를 사용하여 오늘 날짜의 일출 시간과 일몰 시간을 가져오는 과정이 필요하였다. 공공데이터 포털에서 일출, 일몰 시간을 제공해주는 API 를 발견하여 사용하기로 하였다. 공공데이터포털 : https://www.data.go.kr/data/15012688/openapi.do Retrofit 을 활용하면 대부분 Json 으로 응답이 오기 때문에 GsonConverter 를 사용한다. 하지만 공공데이터나 일부 오래된 데이터는 Xml 결과만을 제공한다. 일출 일몰 API 도 Xml 결과만을 제공하기 때문에 xml Conve

Retrofit2 / Android + Kotlin (KakaoAPI)
주의! 이글은 개인 공부 목적으로 작성된 포스팅입니다. 잘못된 내용이 있을 수 있음을 주의해주세요. ⭐️ 그게 뭐야? 오늘은 Android 주요 라이브러리 중 하나인 Retrofit에 대해 배워볼까 한다. Retrofit은 비동기 API 통신을 보다 쉽게 구현할 수 있게 해주는 라이브러리이다. 기존에 우리가 사용하는 OkHttp 보다 성능이 월등히 빠르다. 물론 Retrofit2는 기본적으로 OkHttp에 의존하고 있지만 3배 ~ 10배 까지의 성능 차이가 난다고 한다. 🏖️ 그래서 사용 방법은? 사용방법을 알기 전에 우리는 간단한 HTTP method 개념을 알아야 한다. HTTP method는 기본적으로 HTTP 통신에 사용되는 일종의 서버에 전달하는 명령어이다. 주
Custom Logger로 통신 문제 해결
어느날 평소에 잘 사용 하던 고객사로 부터 새벽에 앱 접속이 안된다는 연락을 받았다 문제 진단을 위해 앱에서는 OKHttpClient의 connectTimeout, readTimeout, writeTimeout 값 확인 및 API 테스트를 했지만 timeout은 각각 120초로 잘 설정 되어 있었고 테스트에도 문제는 없었다 서버쪽에서도 문제 해결을 위해 timeout 로그를 확인 했지만 관련 로그는 남아 있는게 없었다고 했다 혹시나 하는 마음에 몇몇 API에 Firebase Crashlytics 로그를 남겨 놓은 부분을 확인 했고 로그인 뿐만 아니라 스캔이나 그 외 다른 API 에서 timeout 에러가 나는게 확인 됐다 java.net.SocketTimeoutException: timeout 하지만 이 로그들만으로 문제를 확실히 파악 하기가 불가능 했던게 먼저 Firebase Crashlytics 로그를 모든 API에 연결 해놓지 않았어서

MockK를 이용한 Retrofit실패케이스 Call 생성하기
MockK를 이용한 Retrofit실패케이스 Call 생성하기 retrofit이 Response를 생성하기까지 Retrofit으로 얻은 Call의 결과를 .awitResponse()를 호출할때 Response로 반환하는 과정이 진행되는데 성공시에 http의 호출결과인 rawResponse가 body에 담겨서 생성되고 으로 객체 변환 Multipart request body 및 파일 업로드 API 선언 인터페이스 메서드 및 해당 매개 변수에 대한 애노테이션은 요청이 처리되는 방법을 나타냅니다. Request Method 모든 메서드에는 요청 메서드와 관련 URL을 제공하는 HTTP 애노테이션이 있어야 합니다. 8개의 내장 애노테이션이 있습니다: HTTP, GET, POST, PUT, PATCH, `
Retrofit
Retrofit에 대하여 제가 이해한 내용을 정리하기위해 작성 Retrofit이란 Retrofit은 앱 개발 시 서버통신에 사용되는 HTTP API를 자바, 코틀린의 인터페이스 형태로 변환해 안드로이드 개발 시 API를 쉽게 호출할 수 있도록 지원하는 라이브러리 Local DB와 서버의 연결을 도와 데이터를 사용하거나 저장할 수 있도록 지원해주는 역할 Retrofit 예제 DataBinding을 사용하여 텍스트뷰에 서버에서 받아온 데이터를 보여지는 어플리케이션을 연습해보았다. Manifest.mxl build.gradle(:app) RetrofitInstance.kt ** Retrofit 객체를 생성해 웹서버를 연결하여 초기화하고 이 Retrofit 객체를 통해 인터페이스를 사용하도록 한다. 한번만 초기화 ** Myapi.kt **이 클래스를 통해서 사용자와 상호작용을 한다. 생성한 객체를 통해 서버에 요청을 하면 데이터

Naver API MVVM 패턴으로 만들기(Android)
시간이 없으신 분들은 https://github.com/sonny8569/NaverSearchApi 여기에 구현 코드가 있습니다 글 쓰기에 앞서 F-lab 페이백 챌린지 때문에 블로그 쓰는데 재미가 들렸다...솔직히..ㅎ 유명해졌으면 좋겠다... 자 각설하고 바로 Naver 검색 api 을 mvvm 패턴으로 이전에 구혔으니 그걸 view로 넘겨줘 보자 다들 내가 쓰던 Resorce data class는 만들었다고 생각하고 진행하겠다. 팔자는 버튼을 누르면 바로 검색 엔진 api을 호출하는 형식으로 개발을 해봤다. 필자는 백그라운드 쓰레드를 돌려서 사용했다 viewModelScope.launch(Dispatchers.IO) 이거다 여기서 내 자랑스럽고 존경스러운 사수님의 팁을 하나 전수해 주겠다 사수 : 자 viewModelScope.launch(Dispatchers.IO) 이것도 코루틴 이다. 비동기지 나 : 응 사수

[Android] Kotlin Flow를 활용해보자
순서 Retrofit을 통한 통신 순서는 Compose View(Screen Event) -> ViewModel -> Repository -> Api interface Response 결과를 통해 데이터를 반환 받는 순서는 그냥 반대로 하면된다 Api interface -> Repository -> ViewModel -> Compose View(Screen) API의 Response를 처리할 수 있는 상태 값들을 모듈화 먼저 네트워크의 결과값을 상태에 따라 처리할 수 있도록 모듈로 빼준다. NetworkResult.kt sealed class로 성공, 로딩, 실패를 구분할 수 있는 클래스를 분리해놓고 나중에 API의 Respons
Naver Api mvvm 적용해보기
저번 포스트에서 개발 준비를 했다. 모두가 다 했다고 생각해보고 가보자 자 다시 MVVM 패턴 그림을 보자 우린 여기서 Remote Data Source 쪽을 보자 Retrofit 을 통해 webService을 repostory 통해 요청이라 오케이 그럼 가보자 retrofit 클래스 개발 webService 클래스 개발 repository 클래스 개발 viewModel 개발 내가 해야할 작업은 저정도 이다. 많아 보이지만 절때 그렇지 않다 일단 retrofit 클래스 개발 막상 별개 없다 그저 instance으로 싱글톤 패턴으로 구현했다. 왜 싱글톤이냐? 필자는 웹을 1도 모르지만 안드로이드 핸드폰이 pc보다 좋다고 볼수 있을까? 필자는 절때 아니라는게 내 정론이다
[Android] Retrofit 네트워크 타임아웃 설정
Retrofit은 내부적으로 기본적인 타임아웃 시간을 설정하여 사용하고 있다. 이를 상황에 따라서 변경하고 싶을 때, 아래와 같이 변경하면 된다. > Default Connection Timeout : 10초 Read Timeout : 10초 Write Timeout : 10초 1) Connection Timeout 요청을 시작한 후 서버와의 TCP Handshake가 완료되기까지 지속되는 시간이다. 즉, Retrofit이 설정된 연결 시간 제한 내에서 서버에 연결할 수 없는 경우 해당 요청을 실패한 것으로 계산한다. 따라서 사용자의 인터넷 연결 상태가 좋지 않을 때 기본 시간 제한인 10초를 더 높은 값으로 설정하면 좋다. 2) Read Timeout 읽기 시간 초과는 연결이 설정되면 모든 바이트가 전송되는 속도를 감시한다. 서버로부터 응답까지의 시간이 읽기 시간 초과보다 크면 요청이 실패로 계산된다. 3) Write Timeout **
Android MVVM 패턴 사용기
요즘 사람인 , 잡코리아에서 안드로이드 개발자을 채용하는데 가장 많이 보이는게 주요요건 : MVVM 패턴 구현 가능자 비동기 통신 구현 경험자 ETC... 일것이다. 사수 왈 : 디자인 패턴은 너한테 맞는걸 쓰면 된다 본인: 걍 MVVM이 짱 좋아서 사람들이 몰리는거 아님? 사수: 그럼 왜 MVC랑 싱글톤 패턴 etc가 아직도 살아 있을까 본인 : 그렇네 이렇듯 자기한테 맞고 시스템에 적합한 패턴을 골라야 한다 무조건 mvvm이 좋은게 아니다 하지만 mvvm 패턴을 공부하기로 했으니 일단 해보자 위 사진은 Android developer 라는 사이트에서 걸려있는 사진이다. 이해는 안되니 한번 상황을 가정해 보자 사용자 : 로그인 할래 아이디랑 비밀번호를 넘겨주지! view (ID, pas
Retrofit Get과 Post
Get과 Post Get과 Post는 데이터 전송 방식이 다르다. 이번 포스팅에서는 Get과 Post의 데이터 요청/전송 방식이 어떻게 다른지 소개하겠다. Get 방식 GET 방식은 클라이언트가 서버로 데이터를 요청하기 위해 사용되는 Method이며, 요청시 Body 부분은 비어있고 Header에 Body의 콘텐츠 타입을 명시하는 Content-Type 헤더 필드도 적지 않는다. 아래와 같이 URL뒤에 쿼리 스트링(Key와 Value)을 붙이고 HTTP 패킷의 헤더에 포함해서 서버에 데이터를 요청한다. 데이터를 요청할 때 요청하는 데이터가 HTTP Requset Message 의 Header 부분의 URL에 담겨서 전송된다. 요청 시 URL상에 ? 뒤에 데이터가 붙어 request를 보내는 것이다. POST 방식보다 상대적으로 전송 속도가 빠르지만 보안에 취약하다. 인자 2개 넣어서 보기 좋게 나타냄
Retrofit을 사용한 통신에서 에러처리-1
나는 항상 레트로핏을 사용한 API 통신 과정에서 다양한 에러(대표적으로 네트워크 에러)에 대해 어떻게 처리해야 할지 감이 잘 잡히지 않았다. 지금까지는 단순히 앱이 터지지 않게 runCating으로 막아두는 방식으로 에러를 다루는 것을 피해 왔지만 이번에 프로젝트를 잠시 쉬는동안 제대로 학습해 보고 프로젝트를 개선해 보기 위해 학습을 시작하게 되었다. 어떤 에러가 발생하는가 레트로핏을 사용하면서 처리해 주어야할 에러의 종류는 다양하다. api의 요청 자체가 잘못되었을 수도 있고 요청은 정상적으로 진행되었지만 서버의 문제로 응답을 받지 못할 수도 있다. 사용자의 단말기가 네트워크가 끊어져있어 통신을 하지 못할 수도 있고 가져온 데이터를 다루는 로직 상에서 일부로 Exception을 던질 수도 있을 것이다. 이러한 케이스들을 각각 구분하여 다른 상태를 사용자에게 전달해 주도록 하고싶었다. 어떻게 에러를 처리할 것인가 뷰모델에서 runCatching 사용 지금 까지