웹 소스와 API에서 데이터 가져오기

웹 소스와 API에서 데이터 가져오기 (Retrieve data from web sources and APIs)

REST API에서 받은 데이터를 Kotlin으로 분석하고 싶다면 Kotlin DataFrame이 훌륭한 도구가 돼요. 웹 소스와 API에서 데이터를 가져오고, 필요에 맞게 다듬고, 분석까지 이어지는 전체 흐름을 예제와 함께 배워 볼게요.

출처: Kotlin 공식 문서

본문

Kotlin DataFrame 라이브러리를 사용하면 다양한 웹 소스와 API에서 데이터에 접근하고 조작할 수 있어요. 또한 이 데이터를 종합적인 분석과 시각화에 맞게 재구성하는 데도 도움을 줘요.

GitHub의 DataFrame 예제도 함께 살펴보세요.

시작하기 전에

IntelliJ IDEA 2026.2부터 Kotlin Notebook은 더 이상 IDE에 번들로 포함되지 않고, JetBrains에서 공식 지원하지도 않게 돼요. 소스 코드는 GitHub에 계속 남아 있어요.

자세한 내용은 블로그 포스트에서 확인할 수 있어요.

새 Kotlin Notebook을 만들어요.

  1. File | New | Kotlin Notebook을 선택해요.

  2. 다음 명령을 실행해 Kotlin DataFrame 라이브러리를 가져와요.

    %use dataframe
    

    튜토리얼을 따라 하려면 DataFrame을 Gradle이나 Maven 의존성으로 사용할 수도 있어요.

API에서 데이터 가져오기

Kotlin DataFrame 라이브러리로 API에서 데이터를 가져오는 것은 파일에서 데이터를 가져오는 것(CSV나 JSON 등)과 유사한 .read() 함수를 통해 이뤄져요. 다만 웹 기반 소스를 다룰 때는 원시 API 데이터를 구조화된 형식으로 변환하기 위해 추가적인 포맷 작업이 필요할 수 있어요.

YouTube Data API에서 데이터를 가져오는 예제를 살펴볼게요.

  1. 새 코드 셀에 API 키를 안전하게 추가해요. YouTube Data API에 대한 요청을 인증하는 데 필요해요. API 키는 credentials 탭에서 얻을 수 있어요.

    val apiKey = "YOUR-API_KEY"
    
  2. 경로를 문자열로 받아 DataFrame의 .read() 함수로 YouTube Data API에서 데이터를 가져오는 로드 함수를 만들어요.

    fun load(path: String): AnyRow = DataRow.read("https://www.googleapis.com/youtube/v3/$path&key=$apiKey")
    
  3. 가져온 데이터를 행으로 정리하고 nextPageToken을 통해 YouTube API의 페이지네이션을 처리해요. 이렇게 하면 여러 페이지에 걸쳐 데이터를 모을 수 있어요.

    fun load(path: String, maxPages: Int): AnyFrame {
        // Initializes a mutable list to store rows of data.
        val rows = mutableListOf<AnyRow>()
    
        // Sets the initial page path for data loading.
        var pagePath = path
        do {
            // Loads data from the current page path.
            val row = load(pagePath)
            // Adds the loaded data as a row to the list.
            rows.add(row)
    
            // Retrieves the token for the next page, if available.
            val next = row.getValueOrNull<String>("nextPageToken")
            // Updates the page path for the next iteration, including the new token.
            pagePath = path + "&pageToken=" + next
    
            // Continues loading pages until there's no next page.
        } while (next != null && rows.size < maxPages) 
    
        // Concatenates and returns all loaded rows as a DataFrame.
        return rows.concat() 
    }
    
  4. 새 코드 셀에서 앞서 정의한 load() 함수를 사용해 데이터를 가져오고 DataFrame을 만들어요. 이 예제는 페이지당 최대 50개 결과로, 최대 5페이지까지 Kotlin 관련 동영상 데이터를 가져와요. 결과는 df 변수에 저장돼요.

    val df = load("search?q=kotlin&maxResults=50&part=snippet", 5)
    df
    
  5. 마지막으로 DataFrame에서 항목들을 추출하고 연결해요.

    val items = df.items.concat()
    items
    

데이터 정리·다듬기

데이터를 정리하고 다듬는 것은 분석을 위한 데이터셋을 준비하는 데 아주 중요한 단계예요. Kotlin DataFrame 라이브러리는 이러한 작업을 위한 강력한 기능을 제공해요. move, concat, select, parse, join 같은 메서드는 데이터를 정리하고 변환하는 데 중요한 역할을 해요.

이미 YouTube 데이터 API로 데이터를 가져온 상황의 예제를 살펴볼게요. 목표는 심층 분석을 위해 데이터셋을 정리하고 재구성하는 것이에요.

  1. 데이터를 재구성하고 정리하는 것부터 시작해요. 여기에는 일부 컬럼을 새 헤더 아래로 이동하고, 명확성을 위해 불필요한 컬럼을 제거하는 작업이 포함돼요.

    val videos = items.dropNulls { id.videoId }
        .select { id.videoId named "id" and snippet }
        .distinct()
    videos
    
  2. 정리된 데이터에서 ID를 묶어(chunk) 해당 동영상의 통계를 가져와요. 데이터를 더 작은 배치로 나누고 추가 상세 정보를 가져오는 작업이에요.

    val statPages = clean.id.chunked(50).map {
        val ids = it.joinToString("%2C")
        load("videos?part=statistics&id=$ids")
    }
    statPages
    
  3. 가져온 통계를 연결하고 관련 컬럼을 선택해요.

    val stats = statPages.items.concat().select { id and statistics.all() }.parse()
    stats
    
  4. 기존의 정리된 데이터에 새로 가져온 통계를 조인해요. 이렇게 두 데이터 집합을 하나의 종합적인 DataFrame으로 합쳐요.

    val joined = clean.join(stats)
    joined
    

이 예제는 Kotlin DataFrame의 다양한 함수를 사용해 데이터셋을 정리·재구성·향상시키는 방법을 보여줘요. 각 단계는 데이터를 다듬어 심층 분석에 더 적합하게 만들도록 설계돼 있어요.

Kotlin Notebook에서 데이터 분석하기

Kotlin DataFrame 라이브러리의 함수들로 데이터를 성공적으로 가져오고, 정리하고, 다듬었다면, 다음 단계는 이렇게 준비된 데이터셋을 분석해서 의미 있는 인사이트를 뽑아내는 일이에요.

데이터를 범주화하는 groupBy, 요약 통계를 위한 summaxBy, 데이터를 정렬하는 sortBy 같은 메서드가 특히 유용해요. 이 도구들로 복잡한 데이터 분석 작업을 효율적으로 수행할 수 있어요.

예제를 살펴볼게요. groupBy로 채널별로 동영상을 분류하고, sum으로 범주별 총 조회수를 계산하고, maxBy로 각 그룹에서 가장 최신이거나 가장 많이 본 동영상을 찾아볼게요.

  1. 참조를 설정해 특정 컬럼에 쉽게 접근해요.

    val view by column<Int>()
    
  2. groupBy 메서드로 channel 컬럼을 기준으로 데이터를 그룹화하고 정렬해요.

    val channels = joined.groupBy { channel }.sortByCount()
    

    결과 테이블에서 데이터를 대화형으로 탐색할 수 있어요. 채널에 해당하는 행의 group 필드를 클릭하면 그 행이 펼쳐지면서 그 채널 동영상에 대한 더 자세한 정보가 나타나요.

    행을 펼쳐 더 자세한 정보 보기

    왼쪽 아래의 테이블 아이콘을 클릭하면 그룹화된 데이터셋으로 돌아갈 수 있어요.

    왼쪽 아래 테이블 아이콘을 클릭해 돌아가기

  3. aggregate, sum, maxBy, flatten을 사용해 각 채널의 총 조회수와 가장 최신·가장 많이 본 동영상의 상세 정보를 요약한 DataFrame을 만들어요.

    val aggregated = channels.aggregate {
        viewCount.sum() into view
    
        val last = maxBy { publishedAt }
        last.title into "last title"
        last.publishedAt into "time"
        last.viewCount into "viewCount"
        // Sorts the DataFrame in descending order by view count and transform it into a flat structure.
    }.sortByDesc(view).flatten()
    aggregated
    

분석 결과는 이렇게 나와요.

분석 결과더 고급 기법은 Kotlin DataFrame 문서를 참고해요.

다음 단계