본문 바로가기
SpringBoot Server/API

OPEN API 활용 - SDK를 통해 유튜브 동영상 검색 API 구현

by ssury94 2025. 1. 12.
 
 
 

 

Open API를 이용하면 여러 플랫폼에서 제공하는 API를 사용 할 수 있습니다.

 

Open API를 이용하는 방법은 여러가지가 있습니다.

 

SDKSoftware Development Kit의 약자로, 소프트웨어 개발을 위해 제공되는 도구들의 모음입니다.

SDK는 특정 플랫폼, 언어나 프레임워크에서 애플리케이션을 개발하는 데 필요한 라이브러리, API, 문서, 샘플 코드 등을 포함하고 있습니다. SDK는 개발자가 특정 기술이나 플랫폼을 사용하여 애플리케이션을 쉽게 개발할 수 있도록 도와줍니다.

구글 제공 SDK 를 통해 API 호출하기

이 글에서는 구글에서 제공하는 SDK이용하여 유튜브 동영상 검색 API를 호출해보겠습니다.

 

 

API 레퍼런스 확인

 

Google YouTube Data API 공식 문서:
https://developers.google.com/youtube/v3/getting-started

 

YouTube Data API 개요  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. YouTube Data API 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 소개 이 문서는 YouTube와 상호작용하

developers.google.com

 

 

https://developers.google.com/youtube/v3/quickstart/java

 

자바 빠른 시작  |  YouTube Data API  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 자바 빠른 시작 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 빠른 시작 가이드에서는 YouTube Data A

developers.google.com

 

 

 

의존성 추가하기

google-api-services-youtube 라이브러리는 Spring Initializr에서 제공하지 않습니다.

이 라이브러리는 Google에서 공식적으로 제공하는 YouTube Data API v3 클라이언트 라이브러리입니다.

Maven Central Repository:
https://mvnrepository.com/artifact/com.google.apis/google-api-services-youtube

 

pom.xml 파일에 의존성 추가

<dependencies>
    
    <dependency>
       <groupId>com.google.apis</groupId>
       <artifactId>google-api-services-youtube</artifactId>
       <version>v3-rev222-1.25.0</version>
    </dependency>

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

 

Google Cloud Console에서 프로젝트 생성

https://console.cloud.google.com/apis/library?hl=ko&inv=1&invt=Abmnkg&project=genuine-airfoil-447407-r6

 

Google Cloud console

Google Cloud 콘솔에서 www.gstatic.com의 자바스크립트 소스를 로드할 수 없습니다. 가능한 원인은 다음과 같습니다. 네트워크 관리자가 www.gstatic.com 또는 IP 주소를 차단합니다.과도한 자동 요청으로

console.cloud.google.com

 

 

콘솔에 로그인 후 새 프로젝트 만들기

API 서비스 사용 설정

사용하고자 하는 목적에 따라 이용할 API를 등록합니다.

동영상들에 대한 검색 결과를 받아오는 API를 만들기위해 v3 으로 등록하겠습니다.

 

 

 

API 키 발급

 

유튜브에 올라온 모든 동영상들에 대해 검색하고자 하여 공개 데이터로 선택하였고

API키를 발급 받았습니다.

 

IntelliJ 설정

application.yml 설정

spring:
  application:
    name: video

youtube:
  api:
     key: 

 

Config 설정

@Configuration
public class YoutubeConfig {
    @Bean
    public YouTube youTube() throws Exception {
        return new YouTube.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                null
        ).setApplicationName("video-server").build();
    }
    //@Bean 어노테이션을 사용하여 YouTube 객체를 Bean 으로 등록
}

 

 

기본준비는 마쳤습니다.

본격적으로 SKD 요청 클라이언트 코드를 만들어봅시다.

 

API 클라이언트 코드 구현

@Service
public class VideoService {
@Autowired
    YouTube youTube;
    @Value("${youtube.api.key}")
    String apiKey;

    public com.marurun66.video.dto.VideoListResponse getVideos(String keyword) {
        //youtube api 명세서 확인
        try {
            YouTube.Search.List search = youTube.search().list("id,snippet");
            //snippet 객체에는 검색 결과에 관한 기본 세부정보(예: 제목, 설명)가 포함됩니다.
            // 예를 들어, 검색결과가 동영상인 경우 제목은 동영상의 제목이고 설명은 동영상의 설명입니다.
            search.setKey(apiKey);
            search.setQ(keyword);
            search.setType("video"); // API 사용법에 "video, channel, playlist"가 허용되는 값이라고 했음
            search.setMaxResults(20L); // 최대 20개의 동영상 검색결과를 가져옴 Long 타입으로 설정
            search.setOrder("rating");

            //실행해서 결과 받아오기
             SearchListResponse searchListResponse = search.execute();
             //SDK 에서 dto SearchListResponse 를 만들어줬음
            List<SearchResult> searchResults =searchListResponse.getItems();

            //비디오 아이디 목록 생성
            List<String> videoIds = new ArrayList<>();
            for(SearchResult result : searchResults)
                videoIds.add(result.getId().getVideoId());
            // 비디오의 정보를 요청
                //statistics, snippet 으로 요청
                // 비디오의 통계 데이터 (조회수, 좋아요) 기본정보 (제목, 설명, 썸네일)
                YouTube.Videos.List videoRequest = youTube.videos().list("statistics,snippet");
                videoRequest.setKey(apiKey);
                videoRequest.setId(String.join(",", videoIds));
                // 리스트에 있는 문자열을 ,로 연결

                //실행해서 결과 받아오기
                VideoListResponse videoListResponse  =videoRequest.execute();
                List<Video> videoList= videoListResponse.getItems();

            // 우리가 필요한 정보만 가공해서 전달할 DTO 를 만듬
            List<VideoResponse> videoResponsesList = new ArrayList<>();

            for( Video video: videoList){
                VideoResponse videoResponse = new VideoResponse();
                videoResponse.setVideoId(video.getId());
                videoResponse.setTitle(video.getSnippet().getTitle());
                videoResponse.setVideoUrl("https://www.youtube.com/watch?v="+video.getId());
                videoResponse.setThumbnailUrl(video.getSnippet().getThumbnails().getHigh().getUrl());
                videoResponse.setChannelTitle(video.getSnippet().getChannelTitle());
                videoResponse.setPublishedAt(video.getSnippet().getPublishedAt().toString());
                //publishedAt 은 Date 타입이라서 toString 으로 변환 Json 에서 Date 타입은 String 으로 변환되어서 나옴
                videoResponse.setViewCount(video.getStatistics().getViewCount().longValue());
                // videoResponsesList 에 저장
                videoResponsesList.add(videoResponse);
            }
            com.marurun66.video.dto.VideoListResponse videoListResponse1 = new com.marurun66.video.dto.VideoListResponse();
            videoListResponse1.setTotalCount(videoResponsesList.size());
            videoListResponse1.setVideos(videoResponsesList);
            return videoListResponse1;

        }catch (IOException e){
            throw new RuntimeException();
        }
    }

 

 

 

Controller 클래스

@RestController
public class VideoController {
    @Autowired
    VideoService videoService;

    @GetMapping("/api/v1/video/search")
    public ResponseEntity<VideoListResponse> getVideos(@RequestParam("keyword") String keyword){

        VideoListResponse videoListResponse =
                videoService.getVideos(keyword);
        return ResponseEntity.status(200).body(videoListResponse);
    }

 

 

 

 

 

 

 

SDK를 사용하면 플랫폼에서 제공하는 메서드를 통해 쉽게 결과를 가져올 수 있지만, 사전에 SDK 사용법을 잘 이해해야 합니다.