Mobile/Android(Kotlin)

[Android/Kotlin] Retrofit2 활용하기 (Kotlin data class File from JSON)

개발왕 금골드 2020. 11. 26. 12:30
반응형

안녕하세요 골드입니다.
Java를 사용할 때, JSON파일을 읽기 위해 Retrofit2을 사용하는 법은 이미 글을 올린 적이 있습니다. 이번에는 Kotlin으로 Retrofit2를 사용하는 방법에 대해서 글을 작성하도록 하겠습니다.


1. Retrofit2 의존성 추가

먼저 build.gradle(Module: app) 파일에 Retrofit2를 추가합니다. dependencies {} 중괄호 안에 코드를 추가합니다. 맨 밑에 두 줄입니다.

맨 밑에 retrofit2 두 줄을 추가하면 됩니다.

Retrofit2를 위해서 컴파일할 때, 자바 버전 1.8이상이어야 합니다. 같은 파일에서 android {} 중괄호 맨 아래 부분에 새로운 코드를 추가합니다.

compileOptions {} 부분을 추가하면 됩니다. 이 코드는 자바 1.8이상으로 컴파일하겠다는 말입니다.

2. 인터넷 권한 추가

AndoridManifest.xml 파일에 <manifest> 태그 안에 인터넷에 대한 권한을 추가합니다.

manifest 태그 안에 코드를 작성하면 됩니다.

3. 플러그인 설치

코틀린을 활용할 땐, JSON을 훨씬 간단하게 사용할 수 있도록 도와주는 JSON to Kotlin class라는 플러그인이 있습니다. 이 플러그인을 사용하면 클래스 생성을 쉽게 할 수 있어 편리합니다. install을 위해 File -> Settings -> Plugin -> MarkerPlace로 접근합니다.

JSON 검색

JSON이라고 검색어를 입력하면 JSON To Kotlin Class 플러그인을 찾을 수 있습니다. 해당 플러그인을 install합니다. 저는 이미 install했기 때문에 installed라고 나옵니다.

4. data class 생성

이제 패키지에서 마우스 오른쪽 클릭을 하고 New 메뉴에 들어가면 Kotlin from JSON 메뉴가 활성화된 것을 볼 수 있습니다. MainActivity가 존재하는 패키지 폴더 하위에 data 폴더를 만들고 거기에 생성하도록 하겠습니다.

클릭하고 여러분의 JSON 형식 파일을 복사 붙여넣기 합니다. JSON형식이 한 줄로 붙여넣기 되기 때문에 format을 누르면 보기 좋게 정렬됩니다.

원하는 Class Name을 입력하고 Generate를 누르면 파일이 자동 생성됩니다. Java를 활용할 때처럼 get(), set() 메서드를 많이 만들지 않아도 됩니다. 플러그인을 사용하면 훨씬 편리하게 JSON을 사용할 수 있게 됩니다. Generate를 클릭하면 파일이 자동 생성됩니다.

JSON 형식에 맞춰 필요한 class들이 생성된 모습입니다. Kotlin은 getter()와 setter()를 생성하지 않으면 기본 getter(), setter()를 생성해주기 때문에 java처럼 별도의 메서드를 만들지 않아도 되기 때문에 변수만 선언되어 있는 모습입니다.

5. 인터페이스 생성

이제 주소에 접근하기 위한 인터페이스를 생성하도록 합니다. GET방식으로 데이터에 접근하는 인터페이스를 하나 생성하겠습니다. 패키지에 SeoulOpenApi라는 Kotlin class파일을 하나 생성하였고, interface도 생성하였습니다.

companion object 안에 DOMAIN과 API_KEY를 선언합니다. DOMAIN은 공통 URL입니다. API_KEY는 가변 URL 부분 혹은 API를 사용하기 위해 필요한 key입니다.

이번에는 Retrofit을 사용하는 코드를 작성합니다.

object class를 하나 만들었습니다. 이 class는 Retrofit을 불러오는 기능을 가지고 있습니다. object로 선언했기 때문에 singleton 방식으로 retrofit 객체를 다룰 수 있고 lazy 지연 함수로 람다를 전달하여 앱이 구동되는 순간이 아닌 retrofit을 사용하는 순간에 retrofit 객체를 참조하게 됩니다. 위에서 생성한 SeoulOpenService 객체를 create에 인자로 전달합니다. 이후에 해당 인터페이스에 get함수에 enqueue를 선언하여 콜백함수를 인자로 담게 만들 것입니다.

MainActivity에 함수를 하나 생성한 것입니다. 이 함수는 비동기로 실행되기 때문에 일반적으로 컴파일러가 순차적으로 코드를 컴파일하는 것과 조금 다르게 동작합니다. 다른 스레드에서 실행할 수도 있고 그렇지 않을 수도 있으며, 해당 코드가 언제 종료될 지 모른다는 특징이 있습니다. (자세한 사항은 이 글의 범위를 벗어납니다.)

만약 실시간 데이터 변화에 따라서 수정해야 하는 상황이라면 Observer를 사용하면 됩니다.

이 부분에서 SeoulRepository를 지우고 람다 안에 여러분의 코드를 추가하면 되겠습니다.


* Dynamic Url

위 방법보다 좀 더 쉽게 접근하는 방법은 코드 안에서 주소를 변수화하는 방법입니다. 그럴 경우 @Url 어노테이션을 사용할 수 있습니다.

예제에 있는 getBike()를 다시 정의하였습니다. 이렇게 정의하면 retrofit을 선언할 때 baseUrl()을 인자로 넘겨주고 getBike()를 호출할 때 가변 주소를 인자로 넘겨주면 됩니다.

예제를 위한 getBike에 가변 url 호출 부분



여기까지 골드였습니다.
감사합니다.




참고자료 : 이것이 안드로이드다 with Kotlin, 한빛미디어, 고돈호
서울시 공공데이터 자료 사용, 네이버 지도 api 사용

반응형