본문 바로가기

내일배움캠프

본 캠프 46일 차 - Miseya

미세먼지앱

구글맵 api에 이어 공공기관 api 가져오기

  • 데이터는 공공데이터포털(https://www.data.go.kr)을 이용함
  • 수신된 JSON 데이터를 가공
  • gradle에 라이브러리 추가
  • http 통신을 위해 manifest에 인터넷 사용권한 추가

 

Retrofit

  • 안드로이드 및 자바를 위한 타입 세이프한 HTTP 클라이언트 라이브러리
  • Rest api의 HTTP요청ㅇ르 자바 인터페이스로 변환하는 것을 주 목적으로 함
  • gradle에 라이브러리 추가
  • api를 인터페이스로 정의
  • retrofit 인스턴스 생성

gradle에 

// build.gradle (Module: app)
dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.x.x'
    implementation 'com.squareup.retrofit2:converter-gson:2.x.x' // Gson 컨버터 추가
}

버전은 또 저번처럼 찾아봐야 할 거 같다. 우선 미세먼지앱을 만들 때 사용한 버전은

dependencies {
    implementation("com.google.code.gson:gson:2.10.1")
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
    implementation("com.squareup.okhttp3:okhttp:4.10.0")
    implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
    implementation("com.github.skydoves:powerspinner:1.2.6")
    }

위 라이브러리들이 추가 되었고, 스피너를 안드로이드 스튜디오에서 기본으로 제공하는게 아닌 좀 더 좋아 보이는 spinner를 사용 하기 위해 github에 검색해서 공개로 풀어놓은 걸 가져오는 라이브러리를 맨 마지막에 추가했다.

interface ApiService {
    @GET("users/{id}")
    fun getUser(@Path("id") id: Int): Call<User>
}
val retrofit = Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

val apiService = retrofit.create(ApiService::class.java)

인터페이스로 예를 들어 User라는 클래스를 서버 응답으로 가져온다는 걸 정의하고, 밑에 인스턴스를 생성하면 이제 apiService 객체를 통해 정의된 API 요청을 사용할 수 있다...

일단 그렇다고 넘어가고 Rest api에 대해 알아보자.

 

Rest Api

클라이언트(소비자)가 Http라는 프로토콜(쌍방향 통신을 위한 서로간 약속 된 통신규약)을 URL로 넘겨서 서버에 요청하면 서버가 JSON으로 된 경량의 DATA를 보내준다. 이를 간결하고 효율적으로 사용하기 위해 구글에서 제공하는 오픈소스 라이브러리인 Gson을 사용한다.

 

Json과 Gson 사용 해보기

[Android] Gson이란? Gson 사용법 (tistory.com)

 

[Android] Gson이란? Gson 사용법

서버에서 API를 통해 JSON 값들을 내려받으면 클라이언트인 안드로이드는 이를 파싱해서 필요한 곳에 알맞게 값들을 넣어주거나 표시해야 한다. 그러나 매번 JSONObject, JSONArray를 일일이 선언해서

onlyfor-me-blog.tistory.com

여기를 참고하여 사용해 보았다.

우선 Dto를 만들었다.

class Person {
    @SerializedName("name")
    @Expose
    private val personName: String? = null

    @SerializedName("age")
    @Expose
    private val age = 0

    @SerializedName("height")
    @Expose
    private val height = 0.0

    @SerializedName("marriage")
    @Expose
    private val marriage = false
    fun getName(): String? {
        return personName
    }

    fun getAge(): Int {
        return age
    }

    fun getHeight(): Double {
        return height
    }

    fun isMarriage(): Boolean {
        return marriage
    }
}

그리고 나서 이제 실행을 시킬 메인 파일에 작성을 시작해보았다.

class MainActivity {
    var json: String? = null
    var gson: Gson? = null

    @Before
    fun setBefore() {
        json = "{\n" +
                "\"name\":\"홍길동\",\n" +
                "\"age\":14,\n" +
                "\"height\":182.4,\n" +
                "\"marriage\":false\n" +
                "}"
        gson = Gson()
    }

    @Test
    fun gsonTest() {
        val person = gson?.fromJson(json, Person::class.java)
        println("이름 : " + person?.getName())
        println("나이 : " + person?.getAge())
        println("키 : " + person?.getHeight())
        println("결혼 여부 : " + person?.isMarriage())
    }

}

setBefore로 우선 json을 만들어준다.

이후 밑에 테스트 해볼 gson에 대입해준다. fromJson이라는 함수 안에 매개변수로 위에서 만든 json을 넣어주고 Person이라는 위에 만든 클래스도 넣어준다.

이러면 이렇게

이름 : 홍길동

나이 : 14

키 : 182.4

결혼 여부 : false

로 값이 그대로 나온다....음 그래도 아직 잘 이해는 못 한 거 같다. 갈 일이 멀었다...

'내일배움캠프' 카테고리의 다른 글

본 캠프 48일 차 - api를 통해 가져온 데이터 출력하기  (1) 2024.01.26
본 캠프 47일 차  (0) 2024.01.26
본 캠프 45일 차  (0) 2024.01.23
본 캠프 44일 차  (2) 2024.01.22
본 캠프 42일 차  (0) 2024.01.18