Open API를 이용하면 여러 플랫폼에서 제공하는 API를 사용 할 수 있습니다.
Open API를 이용하는 방법은 여러가지가 있습니다.
- 플랫폼에서 제공하는 SDK를 이용하기
- 유튜브 SDK
- AWS S3 - 파일업로드 등등 - HTTP 클라이언트를 통해 API를 호출하기
SDK는 Software 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에서 프로젝트 생성
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 사용법을 잘 이해해야 합니다.