Replit으로 MVP 제작: YouTube 요약 서비스 #2

Thu, 12 Jun 2025 07:30:00 GMT

> 1편에서 이어집니다.

[Replit으로 빠른 YouTube 요약 서비스 MVP 제작기 – 독립 생산자가 되기위한 - East Chair](https://slashpage.com/east-chair?e=1&post=n5w9812gwkqq724kpgze)

## 개선작업 배포하기

지난 글에서는 Replit을 기반으로 MVP를 만든 과정을 소개했습니다. 이후 몇 가지 개선작업을 진행하고 배포까지의 내용을 정리했습니다.

---

## UI 수정을 통해 사용성 개선

### + 페이지 구조 개선

핵심 기능 구현을 완료하고 사용자 접근성을 고려한 수정을 진행 했습니다. 기존에 내가 수집한 피드는 나만 볼 수 있는 폐쇄적인 구조였다면, 지금은 공유해서 같이 볼 수 있는 페이지를 추가했습니다.

> **프롬프트 요약:**
> * 기존 Home → Feed로 변경
> * 새 Home 페이지는 추천 영상 전용
> - upvote 1개 이상인 video만 출력
> - 최신 추천 순 정렬
> * 로그인 없이도 조회 가능
> * 처음 접속 시 이 페이지로 바로 이동

결과적으로, 사용자에게 보여주는 첫 화면이 피드가 아니라 선별된 추천 콘텐츠로 바뀌면서, 사이트의 성격이 한층 더 명확해졌습니다.

### + 채널추가 버튼 추가

공개된 페이지가 생성되니 “다른 사용자의 선택을 동의”하는 행동이 있을 것이라 생각되었습니다. Upvote가 첫 번째 기능이었고, 채널추가가 두 번째 기능이라고 결론 내렸습니다.

![Upvote 옆에 채널추가 버튼 삽입](https://upload.cafenono.com/image/slashpagePost/20250612/162055_VHc8t8dX39paafsmjC?q=80&s=1280x180&t=outside&f=webp)

> **프롬프트 요약:**
> * upvote 옆에 동일한 스타일로 배치
> * 클릭 시 사용자의 채널목록에 추가 및 관련영상 추가
> * 이미 추가된 경우 버튼 비활성화
> * 삭제는 채널관리 페이지에서 수행

이 기능은 영상 큐레이션 경험을 개선하면서도, 사용자의 활동 히스토리를 자연스럽게 쌓아주는 기반이 됩니다.

### + 트렌드 슬라이드 추가

새로운 홈페이지 상단에는 최근 인기 있는 영상을 모은 트렌딩 영역을 추가했습니다.

> 프롬프트 요약:
> * 조건: 최근 7일 이내 + upvote 많은 순 + 동률 시 조회수 기준
> * 총 8개 카드, 4개씩 슬라이드 가능
> * 부족할 경우 자리 비워둠
> * 4개 이하면 슬라이드 버튼 비활성화

![Image](https://upload.cafenono.com/image/slashpagePost/20250612/162352_2FJk7ZloWcyhfjavNL?q=80&s=1280x180&t=outside&f=webp)

이 단락은 사용자에게 “요즘 핫한 콘텐츠”를 빠르게 보여주는 역할을 하며, 전체 구조에 리듬감을 더합니다.

### + 다크모드와 토글버튼

사이트 전반에 다크모드를 추가했습니다. 계정 아이콘 옆에 다크모드 토글을 추가하고, 전체 레이아웃과 컴포넌트를 대응되게 수정했습니다. 개인적으로 이 작업은 시각적 완성도를 높여주면서도, 사용자 경험을 눈에 띄게 향상시켰다고 느낍니다.

간단히 요청 했는데 upvote 버튼 등 몇 가지 부분만 빼먹어서 별도로 수정했습니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20250612/162416_DASAYSgSmnWvtoY5Vo?q=80&s=1280x180&t=outside&f=webp)

---

## AI 요약문 생성 로직 개선과 좌절

### + 대부분 스크립트를 제공하지 않는다

영상 요약 기능은 여전히 핵심입니다. 하지만 실제 운영 과정에서 대본이 없는 유튜브 영상이 꽤 많다는 사실을 알게 됐습니다. 기존 방식으로는 요약이 불가능한 상황이 반복됐습니다.

요약하자면 yt-dlp, PyTube는 YouTube 정책에 막혔고, YouTube API는 스크립트가 없으면 의미가 없었습니다.

> **우선 요약 로직을 정리했습니다:**
> * 방법1. 기존 방식 유지: 영상에 스크립트가 있을 경우 전사 후 요약
> * 성공 시 요약 진행, 실패 시 방법2 수행
> * 방법2. 오디오 기반 분석: yt-dlp로 오디오 추출 → Whisper로 전사 → GPT-4o로 요약

하지만 여기엔 많은 문제가 있었습니다.

- YouTube의 봇 차단 정책으로 yt-dlp가 막힘

- PyTube도 불안정

- Whisper API 응답 지연

- 배포 환경에서는 요약 실패

결국 Whisper+GPT-4o를 통한 하이브리드 방식도 완전히 안정화하긴 어려웠고, 스크립트가 없을 경우 제목과 디스크립션 기반 요약으로 대체했습니다.

### + 음성 추출 성공

Perplexity, GPT, Deepseek 등 다양한 곳에서 검색했지만 해결책을 찾지 못했는데, 구글링을 하다가 한 블로그에서 yt-dlp 버전 업데이트 후 성공했다는 사례를 찾았습니다.

바로 버전 업데이트 후 성공했습니다..

> YouTube에서 봇 차단 정책을 업데이트 하기 때문에 yt-dlp도 최신버전을 사용해야 했었습니다.

잠시 만세를 외친 후, 몇 개 채널을 테스트 했습니다. 방법론은 성공했지만 다음 문제가 있었습니다.

### + 세부 로직은 사람이 설정해줘야 한다

Replit은 생각보다 많은 것을 알아서 해줍니다. 문제가 생길것 같으면 백업 전략을 설정해 기능을 구현해준다거나 등등. 하지만 의외로 3-4년차 개발자라면 알만한 것을 해주지 않았습니다.

yt-dlp로 영상에서 음성데이터를 추출할 때 타임아웃이나 크기제한 등 이슈로 실패하는 경우가 계속 발생했습니다. 이에 분할 처리를 요청했습니다.

> **프롬프트 요약:**
> * yt-dlp로 음성 추출 시 5분 단위로 분할해서 추출
> * 분할 추출된 음성을 각각 Whisper로 스크립트 추출
> * 추출된 스크립트를 병합해서 요약 수행
> * 로직 개선 후 이슈없이 완성도 높은 요약결과를 얻게 되었습니다.

### + 영상 수집 큐와 충돌 이슈

해당 이슈 역시 Replit이 알아서 해결하지 않은 문제입니다. 새로운 채널 추가 시 기존 영상을 샘플로 몇 개 가져오게 되어있는데, 영상을 가져오는 도중 새로운 채널을 추가하면 기존 작업을 멈추고 새로운 작업으로 강제 진행하고 있었습니다. 이러다 보니 DB에 유실된 값이 남는 경우가 발생했습니다.

이를 해결하기 위해 수집 요청을 큐에 넣고 FIFO 방식으로 순차 처리되도록 개선했습니다. 동시에 진행 중인 작업을 제한하고, 완료 후 자동 정리하는 기능도 붙였습니다. 추가적으로 정기적인 DB 클린업을 설정했습니다.

---

## 배포 이슈, 그리고 롤백의 반복

### + Deployments 지옥

모든 이슈를 정리하고 배포를 진행했습니다. 여기서 부터 무간지옥에 빠졌습니다…

결론은 Replit에서 제공하는 Autoscale 서비스에 배포 설정 이슈인 것으로 보이는데 Agent가 절대 해결을 하지 못하는 것 입니다.

사실 큰 문제가 아니었던 해결된 이슈들

- 배포 시 대용량 비디오 파일로 인해 용량 초과: 요약 후 파일 자동 삭제

- Python 종속성 과다: 종속성 최적화 (17MB로 감소)

- 배포용 .ignore 파일 누락: .gitignore, .replitignore, .deployignore 설정

> **해결 안되는 문제:**
> * Creating Autoscale service 단계에서 dist/index.js를 못찾음

> 2025-06-11T11:47:16Z info: Creating Autoscale service
> error proxying request error=dial tcp 127.0.0.1:5000: connect: connection refused[
> rest-express@1.0.0](mailto:rest-express@1.0.0) start
> node:internal/modules/cjs/loader:1228
> at node:internal/main/run_main_module:28:49 {
> NODE_ENV=production node dist/index.js
> error proxying request error=dial tcp 127.0.0.1:5000: connect: connection refused
> [rest-express@1.0.0](mailto:rest-express@1.0.0) start
> at node:internal/main/run_main_module:28:49 {
> [rest-express@1.0.0](mailto:rest-express@1.0.0) start
> at Module._load (node:internal/modules/cjs/loader:1051:27)
> Error: Cannot find module '/home/runner/workspace/dist/index.js'
> error proxying request error=dial tcp 127.0.0.1:5000: connect: connection refused
> error proxying request error=dial tcp 127.0.0.1:5000: connect: connection refused
> node:internal/modules/cjs/loader:1228
> ...반복...
> error proxying request error=dial tcp 127.0.0.1:5000: connect: connection refused
> 2025-06-11T11:48:46Z error: The deployment is crash looping. This can happen if the run command fails or exits immediately after starting. Check the logs for more information.

최초에는 배포서비스에서 port를 80, 8080이 아닌 5000으로 강제하도록 받을려는 이슈인 줄 알았습니다.(이게 범인일 수도..) 이후엔 index.js 파일을 로드 못하는 이슈를 검색했고 무한 수정 및 배포 시도로 $20를 사용했습니다……

너무 답답한 마음에 vercel+neon으로 마이그레이션 할까 해서 빠르게 import해서 배포했지만 vercel 환경에 맞는 설정을 해줘야 한다길래 우선 홀드.

결국 그날 작업시작 시점으로 롤백해야 했습니다…

사실 yt-dlp 문제는 버전 문제기 때문에 바로 롤백해서 진행했어야 했는데 오기가 생겨 $20를 사용해버렸습니다. 롤백 후 기존 로직대로 개선 후 배포하니 문제없이 배포되었습니다. 결국 Replit의 Autoscale 배포 시 이슈였던 것 같습니다.

---

## 예상 치 못한 복병

### + YouTube의 정책은 단단함

배포 후 채널도 추가하고 마무리하려고 했는데.. 이상하게 다시 정상 요약이 안되고 있었습니다.

음성기반으로 요약을 못할 시 요약문 앞에 “본 결과는 제목과 디스크립션 만으로 요약되었으니 실제 영상내용과 차이가 있을 수 있습니다.”를 출력하도록 설정해두었습니다. 그런데 배포버전에서 추가하면 모두 이렇게 출력되었습니다…

![Image](https://upload.cafenono.com/image/slashpagePost/20250612/162841_cjYbIfGNqOYieWMl75?q=80&s=1280x180&t=outside&f=webp)

결과적으로 배포버전에서는 yt-dlp bot이 100% 차단되고 있었습니다. 역시 우회방안을 수집정리해서 Agent에게 개선요청을 했습니다.

하지만 모두 정책에 제한 되었고 저는 항복했습니다.

> **혹시 해결방법을 아시는 분은 제발 댓글 남겨주세요. 제발.**

---

## 마무리

이번 개선 작업은 단순히 기능을 추가한 것이 아니라, 서비스의 방향성을 다시 점검하는 시간이었습니다. 이후 배포 이슈에 대한 아쉬움과 YouTube bot 차단 정책에 대한 좌절로 끝났습니다.

이 서비스의 핵심요소인 영상요약이 정상적으로 진행되지 않기에 오픈할 수 없는 상태가 되어버렸습니다. 차후 해결방안을 찾는다면 개선 후 오픈하여 피드백을 받아보고 싶은 마음입니다.

> 현재 배포버전 링크: [https://shortv.replit.app/](https://shortv.replit.app/)
> **배포버전에서는 정상요약이 안되기 때문에, 회원가입, 채널추가 시 정보가 삭제될 수도 있습니다.**