https://yjhan1999.tistory.com/17
[팀 프로젝트] TALKAK 레퍼런스 기능 구현 2편(Youtube Data API 사용하기)
저번 글에 이어서 레퍼런스 기능 구현기를 적어보겠다.사실 원래 설계는 레퍼런스 기능에 인스타그램, 틱톡, 유튜브 총 세 가지 인기 플랫폼의 영상을 가져오는 것이었다. 하지만 인스타그램과
yjhan1999.tistory.com
레퍼런스 기능을 구현할 때 Youtube Data API를 사용해서 인기 숏폼과 카테고리별 인기 숏폼 영상 정보를 가져왔다. 그런데 메인페이지에서 이 기능이 구현될 것이기 때문에 사용자가 많아진다고 가정하면 굉장히 많은 양의 API 호출을 발생시킬 것이다. 사용자가 우리 서비스에 접속하는 순간 메인페이지에 도달할 것이고, 그럴 때마다 외부 API를 호출하기 때문이다. 따라서 팀원들과 함께 이 문제를 공유했고, 해결 방안을 모색했다.
1. 다양한 전략 모색
- 캐싱 :같은 요청에 대해 여러 번 외부 API를 호출하는 대신, 한 번 받아온 결과를 저장해두고 재사용하는 방법
- 장점 : 빠른 응답, TTL 시간 설정 가능
- 메모리 캐시 : 애플리케이션 서버 내에서 간단하게 사용 가능(Ehcache, Caffeine 등)
- 분산 캐시 : 여러 서버에서 공유 가능(Redis)
- API 호출 간소화 / 데이터 축소 :필요한 데이터만 요청하고, 불필요한 API 호출을 줄이는 방법
- 장점 : 응답 속도 향상, 전송량 절감, 할당량 절약
- 배치 처리 및 비동기 처리 :실시간 요청마다 API 호출하지 않고, 일정 시간 간격으로 한꺼번에 처리하는 방법
- 방법 : Spring Batch, 비동기 큐(Kafka 등)
- 중복 요청 방지 :동일한 요청이 짧은 시간 간격으로 반복될 때, 첫 요청이 처리 중인 동안 다른 요청은 대기하거나 무시하는 방법
- 방법 : in-flight 캐시를 활용한 요청 동기화(Java에서는 ConcurrentHashMap<String, Future<Response>> 구조를 활용해 구현 가능)


2. 적용 기술 결정
API 일일 할당량 제한과 호출 지연 문제가 직접적으로 사용자 경험에 영향을 미칠 수 있기 때문에, 외부 API 호출을 최소화하고 응답 속도를 높이는 것이 핵심이다.
위에 나열한 방법 중 선택한 것은 두 가지이다.
(1) API 호출 간소화
우선 Youtube Data API 공식 문서를 읽다보면 part 파라미터를 통해서 필요한 데이터만 요청할 수 있도록 설계되어 있다는 사실을 볼 수 있다.
part=snippet,statics
예를 들어 이와 같은 형태로 제한하면 영상의 제목, 썸네일 좋아요 수 등 핵심 데이터만 받아올 수 있다.
따라서 우리가 원하는 목표인 데이터 크기를 줄이고, quota 소모를 최소화할 수 있으면서 응답 속도도 향상시킬 수 있게 되는 것이다.
(2) 메모리 캐시 Ehcache
Redis와 같은 외부 분산 캐시의 적용을 고려했지만, 프로젝트의 규모와 초기 단계인 점을 고려했을 때 애플리케이션 내부에서 빠르게 캐싱할 수 있는 경량 캐시가 적합하다고 판단했다. 그리고 우리 프로젝트가 Spring Boot 기반이므로 Ehcache가 Spring Boot와 통합성이 뛰어나고 설정이 간단한 장점이 있어서 선택한 부분도 있다.
TTL을 통해 데이터 최신성을 어느 정도 보장하면서도, API 호출 빈도 또한 컨트롤할 수 있다. 앞으로 개발하면서 이런 캐싱 기법은 백엔드 개발자로서 정말 중요할 것 같다는 느낌을 많이 받았다.
3. 실제 구현
(1) API 호출 간소화
우선 인기 있는 쇼츠를 불러올 때 프론트와 API 명세서를 통해 정의했던 필요한 데이터를 살펴보면
- 비디오 ID
- 영상 게시자
- 영상 게시 시간
- 영상 제목
- 채널 ID
- 썸네일
이렇게 되어있다.
따라서 필요한 내용들만 올 수 있도록 변형을 해서 요청을 넣었다.
// 필요한 값들만 불러오도록 최소한의 필드 요청
String url = YOUTUBE_API_URL + "?part=snippet&fields=items(id(videoId),
snippet(publishedAt, title, channelId, thumbnails(default(url))))&q=쇼츠
&type=video&key="+apiKey+"&maxResults=10";
전체적인 인기 있는 쇼츠 영상 불러오는 기능을 하는 서비스 코드의 메서드 안에서 구현을 했다.
이 경로로 요청을 이런 방식으로 보내면

사진에 보이는 것과 같이 원하는 데이터만 날아오는 것을 볼 수 있다!
카테고리별 인기 쇼츠를 불러오는 기능도 이와 동일하게 구현을 했다.
(2) Ehcache
- 초기 설정
- Dependency 추가
implementation "org.springframework.boot:spring-boot-starter-cache"
implementation "org.ehcache:ehcache:3.8.0"
implementation "javax.cache:cache-api:1.0.0"
- ehcache.xml 추가
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd'">
<cache alias="youtubeShortsCache">
<expiry>
<ttl unit="seconds">21600</ttl> <!-- 6시간 TTL 설정 -->
</expiry>
<resources>
<heap unit="entries">1000</heap> <!-- 최대 1000개의 엔트리 -->
</resources>
</cache>
<cache alias="youtubeCategoryShortsCache">
<expiry>
<ttl unit="seconds">21600</ttl> <!-- 6시간 TTL 설정 -->
</expiry>
<resources>
<heap unit="entries">1000</heap> <!-- 최대 1000개의 엔트리 -->
</resources>
</cache>
</config>
하나의 캐시를 사용할 때마다 각각 선언해서 해줘야 한다. 나는 전체 인기 쇼츠와 카테고리별 인기 쇼츠 두 가지 데이터에 대한 캐싱이 필요했기 때문에 두 개를 선언했다.
- 캐싱 적용
@Cacheable(value = "youtubeShortsCache")
public List<YoutubeApiResponse> getPopularShorts() throws IOException {
...
}
이런 식으로 캐싱 적용하고 싶은 곳 위에 @Chaceable 어노테이션을 선언하면 된다. 아까 ehcache.xml에 alias를 통해 작성한 캐시 이름을 동일하게 적어줘야 캐싱이 된다.
이외 이벤트 모니터링, 스케줄링을 통한 캐시 저장 및 제거 방법은 첨부한 링크의 블로그를 보시면 될 것 같다. 나도 여기서 도움받아 구현했다.
[Spring] EHcache를 이용해 캐시 간단하게 적용하기 (feat. @ Cacheable)
자주 바뀌는 값이 아닌데, 데이터베이스에 접근해서 가져오는데 시간이 걸려서 불편할 때가 있다. 이럴 때 간단하게 서버 단에서 캐시로 들고 있을 수 있다. 필요성 데이터 중 매번 실시간 데이
juhi.tistory.com
4. 마치며
하나의 기술을 적용할 때 생각해야 할 점이 되게 많은 것 같다. 그냥 유명한 영상 끌어오는 것도 외부 API를 호출하는 것이기 때문에 비용과 속도의 문제가 있고, 이 문제는 즉시 사용자 경험에 타격을 준다. 이러한 시각을 가지는 것도 개발 공부를 하는 것 이상 중요한 것 같다. 사용자가 좋아하지 않는 서비스를 개발하면 아무 의미가 없기 때문이다. 사용자와 관리자 모두를 만족시킬 수 있는 개발을 하는 것이 중요한 것 같다. 말은 쉽지..
'프로젝트 > TALKAK' 카테고리의 다른 글
| [팀 프로젝트] TALKAK 레퍼런스 기능 구현 2편(Youtube Data API 사용하기) (1) | 2025.05.20 |
|---|---|
| [팀 프로젝트] TALKAK 레퍼런스 기능 구현(feat. Youtube, Instagram, Tictok API) (0) | 2025.05.11 |
| [팀 프로젝트] TALKAK ERD, API 문서, 프로젝트 수행 규칙들 (0) | 2025.03.13 |
| [팀 프로젝트] TALKAK 기획 과정 (0) | 2025.03.13 |