관리 메뉴

나만을 위한 블로그

[Android] 레트로핏으로 네이버 검색 API 사용하는 법 본문

Android

[Android] 레트로핏으로 네이버 검색 API 사용하는 법

참깨빵위에참깨빵 2021. 8. 4. 01:28
728x90
반응형

네이버 검색 API를 사용할 일이 생겨서 찾아보는데, 자바 언어로 레트로핏을 사용해 가져오는 예제가 보이질 않았다.

비슷한 API를 코틀린으로 작성한 건 있었는데, 이걸 보면서 자바로 바꿔봤더니 잘 되서 여기에 기록한다.

당연한 거지만 네이버 디벨로퍼에 앱을 등록하고 검색 API를 사용할 수 있도록 설정해야 한다. 이 방법은 검색하면 잘 나와 있으니 여기서 굳이 설명하진 않는다. 아래는 네이버 디벨로퍼 사이트 링크다.

https://developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

먼저 의존성 문구부터 앱 수준 gradle 파일에 넣어주자.

implementation 'com.squareup.retrofit2:retrofit:2.6.4'
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'
implementation 'com.squareup.retrofit2:converter-scalars:2.6.4'
implementation 'com.google.code.gson:gson:2.8.6'

 

gson 라이브러리는 혹시 몰라서 같이 넣어뒀다.

그리고 매니페스트에 인터넷 퍼미션을 넣어준다.

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

 

다음은 ApiClient.java 클래스다. 레트로핏 객체를 만들어 반환하는 클래스다.

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;

public class ApiClient
{
    private static final String BASE_URL = "https://openapi.naver.com/v1/";
    private static Retrofit retrofit;

    public static Retrofit getInstance()
    {
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        if (retrofit == null)
        {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();
        }
        return retrofit;
    }
}

 

그리고 레트로핏 객체를 통해 호출할 추상 메서드를 정의한 인터페이스 파일이다.

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Path;
import retrofit2.http.Query;

public interface ApiInterface
{
    @GET("search/{type}")
    Call<String> getSearchResult(
            @Header("X-Naver-Client-Id") String id,
            @Header("X-Naver-Client-Secret") String pw,
            @Path("type") String type,
            @Query("query") String query
    );
}

네이버 검색 API 명세를 보면 GET으로 데이터를 전송하기 때문에 메서드의 어노테이션은 GET으로 설정했고, 소괄호 안에는 Path 값이 들어갈 공간을 마련해둔다.

헤더에 클라이언트 id와 secret을 넣어주기 위해 @Header를 2개 넣어주고, 구체적인 API의 URI로 이동하기 위해 @Path를 String으로 선언했다. 마지막으로 쿼리를 날리기 위해 @Query도 String으로 선언했다.

검색 API의 요청 URL은 아래와 같다.

https://openapi.naver.com/v1/search/book.json

밑의 자바 파일에서 보겠지만, type에는 book.json이, 그 뒤에는 쿼리할 단어가 들어간다. 그렇기 때문에 레트로핏 추상 메서드의 매개변수를 위와 같이 구성했다.

 

마지막으로 메인 액티비티의 자바 파일이다. 결과 확인은 로그로도 충분히 할 수 있기 때문에 xml은 만들지 않았다.

책 검색을 원했기 때문에 3번 인자로 book.json을 넣었고, 4번 인자에는 editText에 입력된 값을 getText().toString()으로 가져온 걸 변수에 넣어서 써도 무관하다.

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity
{
    private final String TAG = this.getClass().getSimpleName();

    private String client_id = "클라이언트 id";
    private String client_pw = "클라이언트 secret";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getResultSearch();
    }

    void getResultSearch()
    {
        ApiInterface apiInterface = ApiClient.getInstance().create(ApiInterface.class);
        Call<String> call = apiInterface.getSearchResult(client_id, client_pw, "book.json", "안드로이드");
        call.enqueue(new Callback<String>()
        {
            @Override
            public void onResponse(Call<String> call, Response<String> response)
            {
                if (response.isSuccessful() && response.body() != null)
                {
                    String result = response.body();
                    Log.e(TAG, "성공 : " + result);
                }
                else
                {
                    Log.e(TAG, "실패 : " + response.body());
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t)
            {
                Log.e(TAG, "에러 : " + t.getMessage());
            }
        });
    }

}

 

이렇게 할 경우 아래와 같은 결과가 나온다.

E/MainActivity: 성공 : {
    "lastBuildDate": "Wed, 04 Aug 2021 01:07:19 +0900",
    "total": 2179,
    "start": 1,
    "display": 10,
    "items": [
    {
    "title": "Do it! <b>안드로이드</b> 앱 프로그래밍(8판) (자바로 모바일 앱 개발하기, 개정8판)",
    "link": "http://book.naver.com/bookdb/book_detail.php?bid=20660759",
    "image": "https://bookthumb-phinf.pstatic.net/cover/206/607/20660759.jpg?type=m1&udate=20210706",
    "author": "정재곤",
    "price": "40000",
    "discount": "36000",
    "publisher": "이지스퍼블리싱",
    "pubdate": "20210623",
    "isbn": "116303262X 9791163032625",
    "description": "<b>안드로이드</b> 분야 1위 도서!\n《Do it! <b>안드로이드</b> 앱 프로그래밍》 개정 8판이 나왔다!\n<b>안드로이드</b> 11 버전과 <b>안드로이드</b> 스튜디오 4.2 버전을 반영한 《Do it! <b>안드로이드</b> 앱 프로그래밍》의 개정 8판이 나왔다. 이번 개정판에도 입문자를 위한 <b>안드로이드</b> 스튜디오 사용법을 담았고, 그동안 독자에게 받은 질문... "
    
    },
    {
    "title": "초보 입문자를 위한 <b>안드로이드</b> 스튜디오",
    "link": "http://book.naver.com/bookdb/book_detail.php?bid=20794313",
    "image": "https://bookthumb-phinf.pstatic.net/cover/207/943/20794313.jpg?type=m1&udate=20210722",
    "author": "이정택",
    "price": "39900",
    "discount": "39900",
    "publisher": "퍼플",
    "pubdate": "20210715",
    "isbn": "8924083473 9788924083477",
    "description": "이 책은 구글이 제공하는 <b>안드로이드</b> 운영체제(AOS)를 이용하여 모바일 등에 사용하는 애플리케이션을 개발하고자 하는 초보 개발자들을 위한 <b>안드로이드</b> 스튜디오의 사용 설명서이다.이 책의 구성은 1장과 2장에서 개요를 설명하고, 3장에서 앱을 작성한다. 4장에서 앱을 빌드하고 실행한다. 그러므로, 앱을... "
    
    },
    {
    "title": "이것이 <b>안드로이드</b>다 with 코틀린 (<b>안드로이드</b> 입문의 3가지 장벽, 언어+실전+환경 완벽 대응!)",
    "link": "http://book.naver.com/bookdb/book_detail.php?bid=18006551",
    "image": "https://bookthumb-phinf.pstatic.net/cover/180/065/18006551.jpg?type=m1&udate=20210329",
    "author": "고돈호",
    "price": "34000",
    "discount": "30600",
    "publisher": "한빛미디어",
    "pubdate": "20210302",
    "isbn": "1162243945 9791162243947",
    "description": "최신 버전에 맞춰 완벽하게 실습할 수 있는 코틀린 <b>안드로이드</b> 앱 개발 도서!\n코틀린, <b>안드로이드</b>, <b>안드로이드</b> 스튜디오! 코틀린으로 <b>안드로이드</b> 앱을 개발하려면 살펴봐야 할 사항이 많습니다. 특히 코틀린 1.4.20 버전부터는 코틀린 익스텐션이 폐기되는 터라 입문자로서 더욱 혼란스럽습니다. 〈이것이... "
    
    },
    {
    "title": "Do it! <b>안드로이드</b> 앱 프로그래밍",
    "link": "http://book.naver.com/bookdb/book_detail.php?bid=16242159",
    "image": "https://bookthumb-phinf.pstatic.net/cover/162/421/16242159.jpg?type=m1&udate=20210717",
    "author": "정재곤",
    "price": "40000",
    "discount": "36000",
    "publisher": "이지스퍼블리싱",
    "pubdate": "20200123",
    "isbn": "1163031410 9791163031413",
    "description": "9년 연속 <b>안드로이드</b> 분야 1위!\nDo it! <b>안드로이드</b> 앱 프로그래밍이 새 옷을 갈아입고 돌아왔다!\n《Do it! <b>안드로이드</b> 앱 프로그래밍》 전면 개정 7판이 나왔습니다. 이번 개정판은 <b>안드로이드</b> 운영체제가 ‘파이’에서 ‘<b>안드로이드</b> 10’으로 바뀌면서 외부 라이브러리가 androidx로 변경된 점에 맞춰... "
    
    },
    {
    "title": "<b>안드로이드</b> 프로그래밍(Android Studio를 활용한)(6판) (Android 11.0 (R) 지원, Android Studio 4.x 사용, 6판)",
    "link": "http://book.naver.com/bookdb/book_detail.php?bid=17764819",
    "image": "https://bookthumb-phinf.pstatic.net/cover/177/648/17764819.jpg?type=m1&udate=20210624",
    "author": "우재남|박길식",
    "price": "32000",
    "discount": "31360",
    "publisher": "한빛아카�

 

여기까지 됐으면 json 값을 파싱해서 텍스트뷰에 보여주든 리사이클러뷰에 보여주든 다양한 처리가 가능할 것이다.

반응형
Comments