본문 바로가기

Android/꼭 공부해야 할 라이브러리

[웹에서 데이터 가져오기] 3. GSON

1. 개요

앞서 JSON 포맷의 데이터를 다루었습니다. 그러나 해당 데이터는 그대로 사용하기엔 무리가 있습니다. 이때 GSON 라이브러리를 사용하면 JSON 객체를 직렬화 및 역직렬화할 수 있으며, 이를 통해 데이터를 처리할 수 있습니다.

GSON 라이브러리는 JSON 문자열을 객체로 변환할 수 있도록 해줍니다.

2. 사용법

1) 라이브러리 추가

먼저 build.gradle의 dependencies 내부에 GSON 라이브러리를 추가해야 합니다.

implementation 'com.google.code.gson:gson:2.8.6'



또한 인터넷을 사용하기 때문에 매니페스트 파일에 다음과 같이 코드를 추가합니다.

<uses-permission android:name="android.permission.INTERNET" />

<application
        android:usesCleartextTraffic="true"


2) 데이터 클래스 정의

GSON에서 JSON 문자열을 객체로 바꾸려면 객체가 만들어질 수 있도록 클래스를 먼저 정의해야 합니다.

앞서 JSON에서 각 객체에 대한 데이터 클래스를 만들고, 해당 객체 내부에 있는 속성들에 대해서 파라미터를 만들었습니다.

// 1) TopMovieList
{
    "movieListResult" : 
{ // 2) movieListResult
        "totCnt":2,"source":"영화진흥위원회","movieList" : 
[ // 3) movieList
                {  // 4) movieListItem
                    "movieCd":"20204117",
                    "movieNm":"모가디슈",
                    "movieNmEn":"Escape from Mogadishu",
                    "prdtYear":"2021","openDt":"20210728",
                    "typeNm":"장편",
                    "prdtStatNm":"개봉",
                    "nationAlt":"한국",
                    "genreAlt":"액션,드라마",
                    "repNationNm":"한국",
                    "repGenreNm":"액션",
                    "directors" : [ 
                        {"peopleNm":"류승완"} // 5) directorsInfo
                    ],
                    "companys" : [ 
// 6) companysInfo
                        {"companyCd":"20160941","companyNm":"(주)덱스터스튜디오" },
                        {"companyCd":"20100374","companyNm":"(주)외유내강"},
                        {"companyCd":"20186561","companyNm":"(주)필름케이"}
                    ]
                },
                { 
                    "movieCd":"20194306",
                    "movieNm":"모가디슈에서 온 소녀",
                    "movieNmEn":"A Girl from Mogadishu ",
                    "prdtYear":"2019","openDt":"",
                    "typeNm":"장편","prdtStatNm":"기타",
                    "nationAlt":"이스라엘,벨기에,기타",
                    "genreAlt":"드라마",
                    "repNationNm":"이스라엘",
                    "repGenreNm":"드라마",
                    "directors" : [],
                    "companys" : []
                }
        ]
    }
}


객체는 데이터 클래스가 되며, 객체 안에 있는 속성의 이름은 파라미터 이름이 됩니다. 또한 속성 값에 따라서 파라미터의 자료형이 결정됩니다.

또한 이때 속성 값이 없을 수도 있기 때문에, 모든 자료형은 ?을 붙여야 합니다.

[데이터 클래스]

[TopMovieList]

    data class TopMovieList(
        val movieListResult: MovieListResult
    )

 

[MovieListResult]

    data class MovieListResult(
        val totCnt: Int?,
        val source: String?,
        val movieList: ArrayList<MovieListItem>?
    )

 

[MovieListItem]

    data class MovieListItem(
        val movieCd: String?,
        val movieNm: String?,
        val movieNmEn: String?,
        val prdtYear: String?,
        val openDt: String?,
        val typeNm: String?,
        val prdtStatNm: String?,
        val nationAlt: String?,
        val genreAlt: String?,
        val repNationNm: String?,
        val repGenreNm: String?,
        val directors: ArrayList<DirectorInfo>?,
        val companys: ArrayList<CompanyInfo>?
    )


[DirectorInfo]

    data class DirectorInfo(
        val peopleNm: String?,
        val peopleNmEn: String?
    )

 

CompanyInfo]

    data class CompanyInfo(
        val companyNm: String?,
        val companyPartNm: String?
    )


이 데이터 클래스를 사용해 위의 JSON 데이터를 GSON으로 바꿀 수 있습니다.

앞선 Volley 개념을 다루었을 때 등장했던 processResponseCustom() 메서드를 정의하겠습니다.

fun findMovieCode(movieName: String, item: Item) {
        val url = "https://kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=${kobisApiKey}&movieNm=${movieName}"
        val request = object: StringRequest(
            Request.Method.GET,
            url,
            {
          processResponseCustom(it, item, movieName)
            },
            {
                Log.e("Error", "오류 발생 -> ${it.message}")
            }
        ) {}
        request.setShouldCache(false)
        requestQueue?.add(request)
    }

fun processResponseCustom(response: String, item: Item, movieName: String) {
        val gson = Gson()
        val topMovieList = gson.fromJson(response, TopMovieList::class.java)
        val movielist = customMovieList.movieListResult.movieList
        for (i in 0 until(movielist!!.size)) {
            var mItem = movielist?.get(i)
            var tmptitle = mItem.movieNm
            if (tmptitle.equals(movieName)) {
                Toast.makeText(this, "find $tmptitle", Toast.LENGTH_SHORT).show()
            }
        }
    }



1) 먼저 Gson() 객체를 만듭니다.

2) fromJson() 메서드를 호출합니다.

이 메서드에서는 첫 번째 파라미터로 response를 전달합니다. 이는 앞서 만든 StrignRequest 객체이며, 요청을 전달하는 것입니다.

이후 두 번째 파라미터론 TopMovieList 클래스 객체가 전달됩니다.

이렇게 된다면 요청을 한 후 응답을 받을 때 JSON 문자열로 응답을 받는데, 이때 이 JSON 문자열을 TopMovieList 클래스 객체에 적절하게 채웁니다. 즉, 앞서 정의한 데이터 클래스에 알맞게 TopMovieList 클래스 객체에 파라미터를 전달해서 해당 객체를 만든다고 보면 됩니다.

이후 만든 객체를 topMovieList 변수에 할당합니다. 그러면 JSON 문자열을 이제 객체로 변환했고, 이를 잘 사용하면 됩니다.

3) 앞서 TopMovieList에는 movieListResult라는 객체 하나가 존재했습니다. 그리고 해당 객체 내부에는 movieList라는 배열이 존재했습니다.

저는 데이터로 전달받은 것 중에서 제가 찾고자했던 영화 이름과 일치하는 데이터를 찾고, 해당 데이터를 찾았다는 토스트 메시지를 띄우고 싶습니다. 따라서 이를 찾아야 합니다.

movieList 내부에는 각 영화에 대한 정보가 들어있고, 반복문을 통해 각 요소(MovieItem)의 movieNm에 해당하는 속성의 값을 확인합니다. 만일 이 값이 제가 찾고자 했던 영화 이름과 일치한다면 Toast 메시지를 띄웁니다.

3. 마무리

이것으로 JSON, GSON, Volley에 대한 공부를 마쳤습니다.

비록 간단하게 정리했지만 충분히 도움이 되었길 바랍니다.

728x90
반응형