기본 틀

RetrofitClient.kt

/**
 * 싱글턴 레트로핏 객체
 */
object RetrofitClient {

    private var retrofitClient: Retrofit? = null

    /**
     * 레트로핏 클라이언트 가져오기
     *
     * Parameter
     *  baseUrl: API 연결 시 사용하는 기본 주소 http://wwww.naver.com/ 과 같은 주소
     * Return
     *  레트로핏 객체
     */
    fun getClient(baseUrl: String): Retrofit? {
        Log.d(TAG, "getClient() 호출 됨")

        // TODO:: OkHttp 인스턴스생성
        // TODO:: 인터셉터 추가하기
        // TODO:: 레트로핏 객체 생성하기
        // TODO:: 레트로핏 객체 반환하기
    }
}

IRetrofit.kt

/**
 * API 연결하는 인터페이스
 * 메서드를 이용하여 API 콜을 만들게 된다.
 */
interface IRetrofit {
    // TODO:: API 연결을 위한 메서드 정의
}

RetrofitManager.kt

/**
 * 레트로핏 관리 클래스
 * API 에 연결하여 데이터를 받아오는 역할을 한다.
 */
class RetrofitManager {

    /**
     * 레트로핏 관리 클래스 싱글턴 구현
     */
    companion object {
        private var instance: RetrofitManager? = null

        /**
         * 레트로핏 매니저 객체 얻기
         * Return
         *  레트로핏 매니저 객체
         */
        fun getInstance(): RetrofitManager =
            instance ?: synchronized(this) {
                instance ?: RetrofitManager().also { instance = it }
            }
    }

    // TODO:: 레트로핏 인터페이스 가져오기
    private val iRetrofit: IRetrofit? = RetrofitClient.getClient(BASE_URL).create(IRetrofit::class.java)

    // TODO:: API 호출 메서드 구현
}

 

기본 구현

RetrofitClient.kt 

/**
 * 싱글턴 레트로핏 객체
 */
object RetrofitClient {

    private var retrofitClient: Retrofit? = null

    /**
     * 레트로핏 클라이언트 가져오기
     *
     * Parameter
     *  baseUrl : API 연결 시 사용하는 기본 주소 http://wwww.naver.com/ 과 같은 주소
     *
     * Return
     *  레트로핏 객체
     */
    fun getClient(baseUrl: String): Retrofit? {
        Log.d(TAG, "getClient() 호출 됨")

        // TODO:: OkHttp 인스턴스생성
        val okHttpClient = OkHttpClient.Builder()

        // TODO:: 인터셉터 추가하기
        // TODO:: 레트로핏 객체 생성하기
        if (retrofitClient == null) {
            retrofitClient = Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        }

        // TODO:: 레트로핏 객체 반환하기
        return retrofitClient
    }
}

IRetrofit.kt

/**
 * API 연결하는 인터페이스
 * 메서드를 이용하여 API 콜을 만들게 된다.
 */
interface IRetrofit {
    // TODO:: API 연결을 위한 메서드 정의
    @GET("bbs/list")
    fun searchList(@Query("query") searchTerm: String): Call<JsonElement>
}

RetrofitManager.kt

/**
 * 레트로핏 관리 클래스
 * API 에 연결하여 데이터를 받아오는 역할을 한다.
 */
class RetrofitManager {

    /**
     * 레트로핏 관리 클래스 싱글턴 구현
     */
    companion object {
        private var instance: RetrofitManager? = null

        /**
         * 레트로핏 매니저 객체 얻기
         * Return
         *  레트로핏 매니저 객체
         */
        fun getInstance(): RetrofitManager =
            instance ?: synchronized(this) {
                instance ?: RetrofitManager().also { instance = it }
            }
    }

    // TODO:: 레트로핏 인터페이스 가져오기
    private val iRetrofit: IRetrofit? = RetrofitClient.getClient("https://qwer.asdf.com/")?.create(IRetrofit::class.java)

    // TODO:: API 호출 메서드 구현
    /**
     * 검색 API
     * Parameter
     *  searchTerm: 검색어
     *  completion: 비동기 작업 후 할 일
     */
    fun searchList(searchTerm: String?, completion: (String) -> Unit) {

        // TODO:: Http Call 만들기
        val call = iRetrofit?.searchList(searchTerm?:"") ?: return

        // TODO:: API 서버에 요청 보내기
        call.enqueue(object : Callback<JsonElement> {
            override fun onFailure(call: Call<JsonElement>, t: Throwable) {
                TODO("Not yet implemented")
            }

            override fun onResponse(call: Call<JsonElement>, response: Response<JsonElement>) {
                // TODO:: 결과 데이터 파싱하기

                // TODO:: API 결과로 필요한 데이터 넘기기
                response.body()?.let {
                    completion(it.toString())
                }
            }
        })
    }
}

 

+ Recent posts