프로젝트에서 유튜브 동영상을 재생목록으로 재 가공하여 서비스할 예정이기 때문에, 유튜브 api를 이용하여 검색 키워드나 목적에 맞게 동영상 목록을 추출해 보려 합니다.
API란 무엇이고 왜 필요한 걸까요?
소프트웨어 애플리케이션 간의 상호작용을 가능하게 해주는 인터페이스
쉽게 말해, API는 서로 다른 시스템이나 프로그램이 정보를 주고받거나 기능을 사용할 수 있도록 해주는 규칙이나 프로토콜의 집합을 말합니다.
그러면 유튜브 api를 발급받으면 뭘 제공받는 걸까요?
대표적으로 영상 검색 요청을 조건에 맞게 보내면 해당 조건에 맞는 데이터를 반환해 줍니다. 영상 검색, 영상 정보 조회, 등 다양한 데이터를 조회할 수 있습니다. 하지만 너무 많은 데이터 요청은 비용을 발생시킬 수 있습니다. 발급받은 api 키가 무료 한도를 넘지 않도록 주의해 주세요.
https://console.cloud.google.com/
에 접속하여 가입을 해 줍니다. 처음로젝트에서 유튜브 동영상을 재생목록으로 재 가공하여 서비스할 예정이기 때문에, 유튜브 api를 이용하여 검색 키워드나 목적에 맞게 동영상 목록을 추출해 보려 합니다.
https://console.cloud.google.com/
에 접속하여 가입을 해 줍니다.
후에 API메뉴의 라이브러리에 접속하여 다음 api를 발급받았어요.
제가 할 프로젝트에선 동영상 목록이 필요하기 때문에 공개 데이터 api 를 선택했어요.
api키를 발급받을 수 있어요.
이제 이 키를 이용하여 '하체운동' 이라는 키워드로 검색을 했을 때의 동영상 목록을 데이터로 받아보려 해요.
SpringBoot 기반으로 api를 사용해 보도록 할게요
코드의 흐름은 다음과 같습니다.
pom.xml 에 유튜브 의존성 추가
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-youtube</artifactId>
<version>v3-rev20231011-2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
해당 의존성 추가로 유튜브api 키를 이용한 다양한 메서드를 수행할 수 있습니다. 또한 설정파일을 적용시키는 의존성도 추가해 줍니다.
설정부터 해줘야 합니다. application.properties 파일에서 다음과 같은 설정을 해줍니다.
1.key 에 발급받은 key 를 입력합니다.
2. max-results=250 : 검색 결과를 최대 250개까지 반환받도록 설정하는 값이에요.
3.region-code=KR : 검색 지역을 한국으로 제한하는 국가 코드 설정이에요.
4.relevance-language=ko : 검색 결과의 주요 언어를 한국어로 설정하는 값이에요.
5.order=relevance : 검색 결과를 연관성이 높은 순서대로 정렬하는 설정이에요.
6. safe-search=true : 부적절한 콘텐츠를 필터링하는 안전 검색 모드 설정이에요.
7. video-duration=any : 동영상 길이에 제한을 두지 않고 모든 길이의 영상을 검색하는 설정이에요.
8. video-definition=any : 영상의 화질 제한 없이 모든 화질의 동영상을 검색하는 설정이에요.
9. video-type=any : 일반 동영상, 영화, 에피소드 등 모든 유형의 동영상을 검색하는 설정이에요.
- 여기서 방금전에 입력한 설정보다 더 권장되는 설정 방식이 있어요. class를 이용해서 설정을 저장하는 방식인데,
다음과 같이 작성하면 됩니다. 본인에게 필요한 설정 값들을 지정해 주면 됩니다. 그리고 모든 필드에 getter와 setter를 지정해 주세요.
@Component
@ConfigurationProperties(prefix = "youtube.api")
public class YoutubeProperties {
private String key; // API 키
private int maxResults = 10; // 검색 결과 수
private String regionCode = "KR"; // 지역 코드
private String relevanceLanguage = "ko"; // 관련 언어
private String order = "relevance"; // 정렬 기준
private boolean safeSearch = true; // 세이프 서치 여부
private String videoDuration = "any"; // 비디오 길이
private String videoDefinition = "any"; // 비디오 화질
private String videoType = "any"; // 비디오 타입
}
이제 api 요청을 보내기 위해 작성해야 할 파일은 크게 4개 입니다.
유튜브 의존성을 주입받기위한 설정을 저장하는 Config,
요청을 처리하는 Controller,
api 요청 방식을 지정하는 Service,
유튜브 동영상을 저장할 Dto
우선, Config 파일부터 작성을 해보면 다음과 같습니다.
@Configuration // 스프링의 설정 클래스임을 나타내요
@EnableConfigurationProperties(YoutubeProperties.class) // 앞서 만든 YoutubeProperties를 사용가능하게 활성화해요
public class YoutubeConfig {
@Bean // 스프링 컨테이너에 YouTube 객체를 등록해요
public YouTube youTube() {
// YouTube 객체를 생성하는 빌더 패턴이에요
return new YouTube.Builder(
new NetHttpTransport(), // HTTP 통신을 위한 전송 계층
GsonFactory.getDefaultInstance(), // JSON 파싱을 위한 GSON 설정
request -> { } // 요청 초기화 (비어있음)
)
.setApplicationName("youtube") // 애플리케이션 이름 설정
.build(); // YouTube 객체 생성
}
}
이제 요청을 처리할 Controller 파일을 생성해 주세요. 저는 /api/youtube/search?query=[검색어] 형식으로 처리했어요.
@RestController
@RequestMapping("/api/youtube")
public class YoutubeController {
private final YoutubeService youtubeService;
public YoutubeController(YoutubeService youtubeService) {
this.youtubeService = youtubeService;
}
@GetMapping("/search")
public List<YoutubeVideoDto> searchVideos(@RequestParam String query) {
return youtubeService.searchVideos(query);
}
}
api 요청 방식을 작성할 Service 파일은 다음과 같이 작성됩니다
@Service
public class YoutubeService {
private final Logger log = LoggerFactory.getLogger(YoutubeService.class);
private final YoutubeProperties youtubeProperties;
private final YouTube youtube;
public YoutubeService(YoutubeProperties youtubeProperties, YouTube youtube) {
this.youtubeProperties = youtubeProperties;
this.youtube = youtube;
}
public List<YoutubeVideoDto> searchVideos(String query) {
try {
// 1. 검색 요청 설정
YouTube.Search.List search = youtube.search().list(Collections.singletonList("snippet"));
search.setKey(youtubeProperties.getKey());
search.setQ(query);
search.setType(Collections.singletonList("video"));
search.setMaxResults((long) youtubeProperties.getMaxResults());
search.setRegionCode(youtubeProperties.getRegionCode());
search.setRelevanceLanguage(youtubeProperties.getRelevanceLanguage());
search.setOrder(youtubeProperties.getOrder());
// 2. 검색 실행
SearchListResponse searchResponse = search.execute();
// 3. 검색된 비디오 ID 목록 추출
List<String> videoIds = searchResponse.getItems().stream().map(item -> item.getId().getVideoId())
.collect(Collectors.toList());
if (videoIds.isEmpty()) {
return Collections.emptyList();
}
// 4. 비디오 상세 정보 요청
YouTube.Videos.List videoRequest = youtube.videos()
.list(Collections.singletonList("snippet,statistics,contentDetails"));
videoRequest.setKey(youtubeProperties.getKey());
videoRequest.setId(videoIds);
// 5. 상세 정보 조회 실행
VideoListResponse videoResponse = videoRequest.execute();
// 6. 비디오 ID를 키로 하는 Map 생성
Map<String, Video> videoDetailsMap = videoResponse.getItems().stream()
.collect(Collectors.toMap(video -> video.getId(), video -> video));
// 7. 검색 결과와 상세 정보를 결합하여 DTO 생성
return searchResponse.getItems().stream().map(
searchResult -> convertToDto(searchResult, videoDetailsMap.get(searchResult.getId().getVideoId())))
.collect(Collectors.toList());
} catch (IOException e) {
log.error("Error searching YouTube videos: ", e);
return Collections.emptyList();
}
}
DTO는 본인이 필요한 속성들에 맞게 작성해 주시면 됩니다.
여기까지 설정을 마친 후, 스프링 부트에서 '상체운동'이라는 검색어를 요청해 보겠습니다.
이렇게 API 사용을 하면 Google Cloud Console 에서 Api 사용량이 집계됨을 확인할 수 있습니다.
이렇게 JSON 형태로 Youtube 객체들을 반환 받을 수 있었고, 이제 위 JSON 파일들을 목적에 맞게 가공하여 서비스에 이용할 예정입니다.
'Project' 카테고리의 다른 글
[프로젝트 Day 5] OAuth2 로그인 (Google) (0) | 2024.11.19 |
---|---|
[프로젝트 Day 4] JWT 토큰 이용하기 (2) | 2024.11.18 |
[Day 4] 프로젝트 기획 및 DB 설계하기 (6) | 2024.11.05 |
[프로젝트 Day 2] EC2 인스턴스에서 스프링 부트 프로젝트 배포하기. + MYSQL 설치 및 연결하기. (0) | 2024.10.24 |
[프로젝트 Day 1] AWS의 EC2 인스턴스 생성 하기. (서버 생성) (4) | 2024.10.23 |