Runjob(런잡 프로젝트)/SpringBoot + Kotlin

[SpringBoot + Kotlin] Jsoup을 이용하여 프로그램에서 API 호출

맏리믓 2023. 4. 22. 16:59

들어가며

- 앞서 정해진 데이터를 DB 에 insert 하였다면 이제는 내가 필요로 하는 데이터를 DB 에 넣어야 한다.

- 내가 한 프로젝트에선 여러 영화 사이트의 API 를 사용하여 영화 정보를 수집 저장 하였다.

- 이번 시간에는 GET, POST 방식으로 API 를 호출 하는 방법을 알아 보도록 하겠다.


Build.Gradle 에 Jsoup dependencies 추가하기

- 앞서 maria DB 의 dependencies 를 추가 한 것 처럼 Jsoup 도 사용하기 위해 추가해 주어야 한다.

- 다음 코드를 build.gradle 의 dependencies 에 추가 해 준다.

- 그 후 build.gradle 을 run 해 준다.(우클릭 후 run)

implementation("org.jsoup:jsoup:1.15.4")

Build.Gradle 에 Json dependencies 추가하기

- Json 은 유용한 데이터 구조이며 여기선 API 를 호출 할때 넘길 데이터를 Json 형식으로 넘기기 때문에 추가 해 주었다.

- 다음 코드를 build.gradle 의 dependencies 에 추가 해 준다.

- 그 후 build.gradle 을 run 해 준다.(우클릭 후 run)


Utils 디렉토리에 API 호출을 위한 파일 추가

- API 호출은 여러 부분에서 사용될 유용한 기능 이기 때문에 Utils 에 저장 한 후 불러 사용하였다.


 

GET 방식으로 API 호출하는 코드

- GET 방식으로 API 를 호출 하는 코드는 다음과 같다.

- jsoup 에 url 을 넘겨 conn 를 받고 이를 get 방식으로 호출 한다.

package com.example.runjob_blog.Utils
import org.json.JSONObject
import org.jsoup.Jsoup


class request_API {
    companion object {
        fun useGETApi(url: String): String{
            val conn = Jsoup.connect(url)
                .ignoreContentType(true)
            val doc = conn.get().text()
            return doc
        }
    }
}

 


POST 방식으로 API 호출하는 코드

- POST 방식으로 API 를 호출 하는 코드는 다음과 같다.

- url 과 넘길 데이터가 담긴 ParmList 를 jsoup 을 통해 넘겨 주며 post 로 호출 하면 된다.

- 이때 userAgent 와 넘길 ParmList 는 실제 웹사이트의 개발자 모드에 가면 쉽게 찾을 수 있는데 이는 아래에서 서술 하겠다.

package com.example.runjob_blog.Utils
import org.json.JSONObject
import org.jsoup.Jsoup


class request_API {
    companion object {
        val userAgent: String =
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"


        fun runPOSTApi(): String{
            val url = "https://www.lottecinema.co.kr/LCWS/Movie/MovieData.aspx"
            val paramList = HashMap<String, Any>()
            paramList["MethodName"] = "GetMoviesToBe"
            paramList["channelType"] = "MW"
            paramList["osType"] = "Chrome"
            paramList["osVersion"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
            paramList["multiLanguageID"] = "KR"
            paramList["division"] = 1
            paramList["moviePlayYN"] = "Y"
            paramList["orderType"] = 5
            paramList["blockSize"] = 1000
            paramList["pageNo"] = 1
            paramList["memberOnNo"] = ""
            val result = usePOSTApi(url, paramList)
            return result
        }

        fun usePOSTApi(url: String, paramList: HashMap<String, Any>): String{
            val conn = Jsoup.connect(url)
                .userAgent(userAgent)
                .data("paramList", JSONObject(paramList).toString())
                .ignoreContentType(true)//에러나면 추가
            val doc = conn.post().text()
            return doc
        }
    }
}

Parmlist 와 userAgent 

- 우선 이번에는 "롯데 시네마" 의 "영화 리스트" 를 반환하는 API 를 사용하므로 해당 사이트로 이동 해 준 후 "F12" 버튼을 이용해 개발자 모드를 열어 준다.

- 이후 "Network 탭으로 이동 한 후 "ctrl + r" 버튼으로 새로 고침 해 준다.

 

- 그 후 아래 리스트에서 API 를 사용하는 부분을 찾아 준다.

- 다음의 respose 가 영화의 리스트를 응답 하니 이 url 인것으로 추측 할 수 있따.

- 여기서 header 로 이동하면 userAgent 를 알 수 있다.

- 또 Payload 탭으로 이동하면 paramlist 를 알 수 있다.


실행 하기

- 모든 프로그램을 완성 했으니 실행을 해 보겠다.

- controller 에 GET 과 POST 호출 하는 함수를 호출하는 코드를 추가 하였다.

package com.example.runjob_blog.Controller

import com.example.runjob_blog.Service.testService
import com.example.runjob_blog.Utils.request_API
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/test")
class BlogTestController(
    val testService: testService
) {
    @GetMapping("/DBsave")
    fun DBsave(){
        testService.saveTest()
    }

    @GetMapping("/get")
    fun GET_API(): String{
        val result = request_API.useGETApi("https://movie.daum.net/api/premovie?page=1&size=100")
        return result
    }

    @GetMapping("/post")
    fun POST_API(): String{
        val result = request_API.runPOSTApi()
        return result
    }
}

결과

좌측이 get, 우측이 post 호출 결과이다.