앞서서 YouTube Data API v3를 사용하기 위해서, 구글 계정으로 프로젝트와 API Key, YouTube Data API v3 서비스 등록을 진행하였습니다.
이전블로그 참고 : https://megazonedsg.github.io/tutorial-youtube-api/
이번에는 YouTube Data API v3를 Spring Boot 프로젝트를 만들어 서비스를 호출하도록 하겠습니다. https://developers.google.com/youtube/v3/getting-started
https://developers.google.com/youtube/v3/quickstart/java
- Spring Boot 프로젝트 생성
- YouTube Data API v3, Gradle 의존성 추가
- YouTubeDto 생성
- YouTubeProvider 생성
- YouTubeService 생성
- YouTubeController 생성
- 결과확인
시작
이제 서비스 할 수 있는 프로젝트를 만들고, YouTube Data API v3 를 사용하겠습니다.
첫번째, Spring Boot 프로젝트 생성
프로젝트 생성
intelliJ에서 ‘new > project > Spring Initializr’ 선택 후 아래와 같이 설정해주세요.
프로젝트 Dependencies 추가
Developer Tools > Lombok 선택
Web > Spring Web 선택
‘Next’ 클릭
이렇게만 한다면, 프로젝트가 생성됩니다.
이제 YouTube API, Google API 라이브러리 추가, Controller, Dto, Provider, Service 를 생성해보겠습니다.
두번째, YouTube Data API v3, Gradle 의존성 추가
프로젝트 루트의 build.gradle 파일을 수정합니다.
build.gradle
dependencies { ... 생략 ... compile 'com.google.api-client:google-api-client:1.30.9' compile 'com.google.oauth-client:google-oauth-client-jetty:1.23.0' compile 'com.google.apis:google-api-services-youtube:v3-rev222-1.25.0' ... 생략 ... }
gradle 을 빌드 다시 해주세요. 그렇게 해야만 의존성이 추가 됩니다.
세번째, YouTubeDto 생성
조회한 데이터를 담을 수 있는 그릇을 만들겠습니다. 아래 3가지 항목외에 더 필요한 정보가 있다면, 공식 API 문서를 참고해서 수정합니다.
src/main/java/{package}/dto/youtube/YouTubeDto.java
@Getter
@Setter
@NoArgsConstructor
public class YouTubeDto {
private String title; // 동영상 제목
private String thumbnailPath; //동영상 썸네일 경로
private String videoId; // 동영상 식별 ID
@Builder(toBuilder = true)
public YouTubeDto(String title, String thumbnailPath, String videoId) {
this.title = title;
this.thumbnailPath = thumbnailPath;
this.videoId = videoId;
}
}
네번째, YouTubeProvider 생성
src/main/java/{package}/service/youtube/spec/YouTubeProvider.java
import com.jinik.tutorial.demo.dto.youtube.YouTubeDto;
public interface YouTubeProvider {
YouTubeDto get();
}
다섯번째, YouTubeService 생성
이제 여기에서, 우리가 원하던 YouTube Data API v3 구현해보겠습니다.
저는 공식 API 의 코드를 참고하여 search 기능을 videos 기능으로 변경하여 따라해보았습니다..
(videos는 php만 예제만…. )
그리고 *저의 목적은 동영상의 재생시간을 가져오기 위해서 videos API가 필요했어요.
https://developers.google.com/youtube/v3/docs/search/list
https://developers.google.com/youtube/v3/docs/videos/list
src/main/java/{package}/service/youtube/YouTubeService.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.model.Thumbnail;
import com.google.api.services.youtube.model.Video;
import com.jinik.tutorial.demo.dto.youtube.YouTubeDto;
import com.jinik.tutorial.demo.service.youtube.spec.YouTubeProvider;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.springframework.stereotype.Service;
@Service
public class YouTubeService implements YouTubeProvider {
private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
private static final long NUMBER_OF_VIDEOS_RETURNED = 1;
private static YouTube youtube;
private static void prettyPrint(Iterator<Video> iteratorSearchResults, YouTubeDto youTubeDto) {
System.out.println("\n=============================================================");
System.out.println("=============================================================\n");
if (!iteratorSearchResults.hasNext()) {
System.out.println(" There aren't any results for your query.");
}
while (iteratorSearchResults.hasNext()) {
Video singleVideo = iteratorSearchResults.next();
// Double checks the kind is video.
if (singleVideo.getKind().equals("youtube#video")) {
Thumbnail thumbnail = (Thumbnail) singleVideo.getSnippet().getThumbnails().get("default");
System.out.println(" Video Id" + singleVideo.getId());
System.out.println(" Title: " + singleVideo.getSnippet().getTitle());
System.out
.println(" contentDetails Duration: " + singleVideo.getContentDetails().getDuration());
System.out.println(" Thumbnail: " + thumbnail.getUrl());
System.out.println("\n-------------------------------------------------------------\n");
youTubeDto.setThumbnailPath(thumbnail.getUrl());
youTubeDto.setTitle(singleVideo.getSnippet().getTitle());
youTubeDto.setVideoId(singleVideo.getId());
}
}
}
@Override
public YouTubeDto get() {
YouTubeDto youTubeDto = new YouTubeDto();
try {
youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpRequestInitializer() {
public void initialize(HttpRequest request) throws IOException {
}
}).setApplicationName("youtube-video-duration-get").build();
//내가 원하는 정보 지정할 수 있어요. 공식 API문서를 참고해주세요.
YouTube.Videos.List videos = youtube.videos().list("id,snippet,contentDetails");
videos.setKey("### 여기에 앞서 받은 API키를 입력해야 합니다.");
videos.setId("### 여기에는 유튜브 동영상의 ID 값을 입력해야 합니다.");
videos.setMaxResults(NUMBER_OF_VIDEOS_RETURNED); //조회 최대 갯수.
List<Video> videoList = videos.execute().getItems();
if (videoList != null) {
prettyPrint(videoList.iterator(), youTubeDto);
}
} catch (GoogleJsonResponseException e) {
System.err.println("There was a service error: " + e.getDetails().getCode() + " : "
+ e.getDetails().getMessage());
} catch (IOException e) {
System.err.println("There was an IO error: " + e.getCause() + " : " + e.getMessage());
} catch (Throwable t) {
t.printStackTrace();
}
return youTubeDto;
}
}
여섯번째, YouTubeController 생성
이제 요청을 받고, API를 호출 할 수 있게 Controller를 생성하겠습니다.
src/main/java/{package}/controller/youtube/YouTubeController.java
import com.jinik.tutorial.demo.dto.youtube.YouTubeDto;
import com.jinik.tutorial.demo.service.youtube.spec.YouTubeProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class YouTubeController {
private YouTubeProvider youTubeProvider;
@Autowired
public YouTubeController(
final YouTubeProvider youTubeProvider
) {
this.youTubeProvider = youTubeProvider;
}
@GetMapping("youtube")
public YouTubeDto Index() {
return youTubeProvider.get();
}
}
일곱번째, 결과 확인
서버를 구동하고, http://localhost:8080/youtube 으로 호출해 보았습니다.
저는 https://www.youtube.com/watch?v=TgOu00Mf3kI 이 영상을 가져와 보았습니다.
결과 확인!
—
위와 같이 결과가 정상적으로 데이터를 가져왔네요~~
이상으로 YouTube Data API v3 사용하기 였습니다.