๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Kotlin

[Android/Kotlin] ์•Œ๋ผ๋”˜ API ์—ฐ๋™

by naahy 2024. 2. 12.

๐Ÿ“Œ ์•Œ๋ผ๋”˜ Open API ๋งค๋‰ด์–ผ: https://docs.google.com/document/d/1mX-WxuoGs8Hy-QalhHcvuV17n50uGI2Sg_GHofgiePE/edit

๐Ÿ“Œ API ํ‚ค ๋ฐœ๊ธ‰: https://www.aladin.co.kr/ttb/wblog_manage.aspx

 

์—ฐ๋™ ์ค€๋น„

1. ์˜คํ”ˆ API๋ฅผ ์‚ฌ์šฉํ•  URL ์ž…๋ ฅ ํ›„ ์ถ”๊ฐ€ ๋ฒ„ํŠผ ํด๋ฆญ (๋ธ”๋กœ๊ทธ ์ฃผ์†Œ ์ž…๋ ฅํ•ด๋„ ๋จ)

 

2. TTB ํ‚ค ๋ฐœ๊ธ‰๋จ

 

์ฝ”๋“œ

DTO

  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ „์ฒด ์ €์žฅ
data class BookListDTO(
    @SerializedName("item") val books: List<Book>
)
  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜
data class Book(
    @SerializedName("title") val title: String,
    @SerializedName("author") val author: String,
    @SerializedName("description") val description: String,
    @SerializedName("isbn13") val isbn: String,
    @SerializedName("cover") val cover: String,
    @SerializedName("categoryName") val categoryName: String,
    @SerializedName("itemPage") val itemPage: String,
)

 

์ธํ„ฐํŽ˜์ด์Šค

์ด ๋•Œ ๊ณตํ†ต url ์ฃผ์†Œ๋Š” http://www.aladin.co.kr/ttb/api/ ==> Retrofit ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ž‘์„ฑ

์š”์ฒญ ๋ณ€์ˆ˜๋Š” ์•Œ๋ผ๋”˜ API ๋ฌธ์„œ ํ™•์ธํ•ด ๋ณธ์ธํ•œํ…Œ ํ•„์š”ํ•œ ๋ณ€์ˆ˜ ์ž…๋ ฅํ•˜๋ฉด ๋จ (ํ•„์ˆ˜ ์š”์ฒญ ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅ)

โ— API ๋ฒ„์ „์„ 20131101๋กœ ํ•ด์•ผ ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ API๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’: 20070901)
๋ชจ๋ฅด๊ณ  ์ž‘์—…ํ–ˆ๋‹ค๊ฐ€ ์ฑ… ๋ชฉ๋ก์ด ์ œ๋Œ€๋กœ ์•ˆ ๋ถˆ๋Ÿฌ์™€์ ธ์„œ ์• ๋จน์—ˆ์Œ
interface BookService {

    // ์•Œ๋ผ๋”˜ ์ฑ… ๊ฒ€์ƒ‰ api
    @GET("ItemSearch.aspx")
    suspend fun getBookSearch(
        @Query("TTBKey") ttbkey: String,    // ๋ฐœ๊ธ‰ ๋ฐ›์€ ์•Œ๋ผ๋”˜ api key ์ž…๋ ฅ
        @Query("Query") query: String,      // ๊ฒ€์ƒ‰์–ด
        @Query("Output") output: String,    // ์ถœ๋ ฅ ํ˜•์‹
        @Query("Version") version: String = "20131101"   // api ๋ฒ„์ „
    ): Response<BookListDTO>

    // ์•Œ๋ผ๋”˜ ์ฑ… ๋ชฉ๋ก api
    @GET("ItemList.aspx")
    suspend fun getBookList(
        @Query("TTBKey") ttbkey: String,
        @Query("QueryType") querytype: String,
        @Query("SearchTarget") searchtarget: String,
        @Query("Output") output: String,
        @Query("Version") version: String = "20131101"
    ): Response<BookListDTO>

    // ์•Œ๋ผ๋”˜ ์ฑ… ์ƒ์„ธ api
    @GET("ItemLookUp.aspx")
    suspend fun getBookDetail(
        @Query("TTBKey") ttbkey: String,
        @Query("ItemId") itemid: String,
        @Query("itemIdType") itemidtype: String,
        @Query("Output") output: String,
        @Query("Version") version: String = "20131101"
    ): Response<BookListDTO>

}

 

Retrofit ๊ฐ์ฒด ์ƒ์„ฑ

private val gson = GsonBuilder().setLenient().create()
private val retrofit: Retrofit = Retrofit.Builder()
    .baseUrl("http://www.aladin.co.kr/ttb/api/")
    .addConverterFactory(ScalarsConverterFactory.create())
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build()

val bookService = retrofit.create(BookService::class.java)  // ์œ„์—์„œ ์ž‘์„ฑํ•œ ์ธํ„ฐํŽ˜์ด์Šค

 

ํ•จ์ˆ˜ ์ž‘์„ฑ

์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ ์‹œ ๋ฐ˜ํ™˜๊ฐ’์„ Response๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— suspend ์‚ฌ์šฉ (Call๋กœ ๋ฐ˜ํ™˜ ์‹œ ์‚ฌ์šฉํ•  ํ•„์š” X)

suspend fun getBookSearch(query: String): List<Book> {
    val bookSearchList = bookService
        .getBookSearch(TTBKEY, query, OUTPUT, VERSION)

    return bookSearchList.body()!!.books
}

suspend fun getBookList(): List<Book> {
    val bookList = bookService
        .getBookList(TTBKEY, QUERY_TYPE, SEARCH_TARGET, OUTPUT, VERSION)

    return bookList.body()!!.books
}

suspend fun getBookDetail(itemid: String): Book {
    val bookDetail = bookService
        .getBookDetail(TTBKEY, itemid, ITEM_ID_TYPE, OUTPUT, VERSION)

    return bookDetail.body()!!.books[0]
}

private companion object{
    private const val TTBKEY = "๋ฐœ๊ธ‰๋ฐ›์€ TTB ํ‚ค"
    private const val QUERY_TYPE = "ItemNewSpecial"
    private const val SEARCH_TARGET = "Book"
    private const val ITEM_ID_TYPE = "ISBN13"
    private const val OUTPUT = "JS"
    private const val VERSION = "20131101"
}

 

ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ์—” ์ฝ”๋ฃจํ‹ด ์‚ฌ์šฉ (suspend ํ•จ์ˆ˜๊ธฐ ๋•Œ๋ฌธ)

๋ฐ˜ํ™˜ ๊ฐ’์ด Response๊ธฐ ๋•Œ๋ฌธ์— Call๊ณผ ๋‹ฌ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

lifecycleScope.launch {
    val bookList = getBookList()
    binding.bookTitle.text = bookList[0].title
    binding.bookAuthor.text = bookList[0].author
}

๋Œ“๊ธ€