본문 바로가기

Project

[프로젝트 Day 3] Youtube API 발급받기 및 데이터 추출하기.

프로젝트에서 유튜브 동영상을 재생목록으로 재 가공하여 서비스할 예정이기 때문에, 유튜브 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 파일들을 목적에 맞게 가공하여 서비스에 이용할 예정입니다.