콘텐츠로 이동

가이드: 비디오

출처 URL: https://nextjs.org/docs/app/guides/videos

마지막 업데이트 2026년 2월 20일

이 페이지에서는 Next.js 애플리케이션에서 비디오를 사용하는 방법을 설명하며, 성능에 영향을 주지 않고 비디오 파일을 저장하고 표시하는 방법을 보여 줍니다.

HTML <video> 태그는 직접 제공하는 비디오 파일을, <iframe> 태그는 외부 플랫폼에 호스팅된 비디오를 페이지에 임베드할 때 사용합니다.

HTML <video> 태그를 사용하면 자체 호스팅 또는 직접 제공되는 비디오 콘텐츠를 임베드하여 재생과 모양을 완전히 제어할 수 있습니다.

app/ui/video.jsx

export function Video() {
return (
<video width="320" height="240" controls preload="none">
<source src="/path/to/video.mp4" type="video/mp4" />
<track
src="/path/to/captions.vtt"
kind="subtitles"
srcLang="en"
label="English"
/>
Your browser does not support the video tag.
</video>
)
}
AttributeDescriptionExample Value
src비디오 파일의 소스를 지정합니다.<video src="/path/to/video.mp4" />
width비디오 플레이어의 너비를 설정합니다.<video width="320" />
height비디오 플레이어의 높이를 설정합니다.<video height="240" />
controls존재하면 기본 재생 컨트롤 세트를 표시합니다.<video controls />
autoPlay페이지가 로드될 때 비디오를 자동으로 재생합니다. 참고: 자동 재생 정책은 브라우저마다 다릅니다.<video autoPlay />
loop비디오 재생을 반복합니다.<video loop />
muted기본적으로 오디오를 음소거합니다. 종종 autoPlay와 함께 사용됩니다.<video muted />
preload비디오를 미리 불러오는 방식을 지정합니다. 값: none, metadata, auto.<video preload="none" />
playsInlineiOS 기기에서 인라인 재생을 활성화하며, iOS Safari에서 자동 재생이 작동하는 데 자주 필요합니다.<video playsInline />

알아 두면 좋은 정보 : autoPlay 속성을 사용할 때 대부분의 브라우저에서 자동 재생이 작동하도록 muted 속성을 함께 추가하고, iOS 기기와의 호환성을 위해 playsInline 속성을 포함하는 것이 중요합니다.

비디오 속성의 전체 목록은 MDN 문서를 참고하세요.

  • 대체 콘텐츠: <video> 태그를 사용할 때는 비디오 재생을 지원하지 않는 브라우저를 위해 태그 내부에 대체 콘텐츠를 포함하세요.
  • 자막 또는 캡션: 청각장애인 사용자를 위해 자막이나 캡션을 포함하세요. <video> 요소와 함께 <track> 태그를 사용해 자막 파일 소스를 지정합니다.
  • 접근 가능한 컨트롤: 표준 HTML5 비디오 컨트롤은 키보드 탐색 및 스크린 리더 호환성을 위해 권장됩니다. 고급 요구 사항이 있다면 접근 가능한 컨트롤과 일관된 브라우저 경험을 제공하는 react-player 또는 video.js 같은 서드파티 플레이어를 고려하세요.

HTML <iframe> 태그를 사용하면 YouTube나 Vimeo 같은 외부 플랫폼의 비디오를 임베드할 수 있습니다.

app/page.jsx

export default function Page() {
return (
<iframe src="https://www.youtube.com/embed/19g66ezsKAg" allowFullScreen />
)
}
AttributeDescriptionExample Value
src임베드할 페이지의 URL입니다.<iframe src="https://example.com" />
widthiframe의 너비를 설정합니다.<iframe width="500" />
heightiframe의 높이를 설정합니다.<iframe height="300" />
allowFullScreeniframe 콘텐츠를 전체 화면으로 표시할 수 있게 합니다.<iframe allowFullScreen />
sandboxiframe 내부 콘텐츠에 추가적인 제한을 적용합니다.<iframe sandbox />
loading로딩 동작을 최적화합니다(예: 지연 로딩).<iframe loading="lazy" />
title접근성을 지원하기 위해 iframe에 제목을 제공합니다.<iframe title="Description" />

iframe 속성의 전체 목록은 MDN 문서를 참고하세요.

Next.js 애플리케이션에 비디오를 임베드하는 방법은 두 가지입니다.

  • 자체 호스팅 또는 직접 제공 비디오 파일: 플레이어 기능과 모양을 세밀하게 제어해야 하는 경우 <video> 태그로 자체 호스팅 비디오를 임베드하세요. 이 방법은 Next.js 내에서 비디오 콘텐츠를 원하는 대로 사용자 지정하고 제어할 수 있습니다.
  • 비디오 호스팅 서비스 사용(YouTube, Vimeo 등): YouTube나 Vimeo 같은 서비스는 <iframe> 태그를 사용해 그들의 iframe 기반 플레이어를 임베드합니다. 이 방식은 플레이어 제어가 일부 제한되지만, 사용 편의성과 플랫폼에서 제공하는 기능을 제공합니다.

애플리케이션 요구 사항과 제공하고자 하는 사용자 경험에 가장 잘 맞는 임베드 방식을 선택하세요.

외부 호스팅 비디오 임베드하기

섹션 제목: “외부 호스팅 비디오 임베드하기”

외부 플랫폼의 비디오를 임베드하려면 Next.js로 비디오 정보를 가져오고 React Suspense로 로딩 중 상태를 처리할 수 있습니다.

1. 비디오 임베드를 위한 서버 컴포넌트 만들기

첫 단계는 비디오를 임베드할 적절한 iframe을 생성하는 서버 컴포넌트를 만드는 것입니다. 이 컴포넌트는 비디오의 소스 URL을 가져와 iframe을 렌더링합니다.

app/ui/video-component.jsx

export default async function VideoComponent() {
const src = await getVideoSrc()
return <iframe src={src} allowFullScreen />
}

2. React Suspense를 사용해 비디오 컴포넌트 스트리밍하기

비디오를 임베드하는 서버 컴포넌트를 만든 뒤에는 React Suspense를 사용해 컴포넌트를 스트리밍합니다.

app/page.jsx

import { Suspense } from 'react'
import VideoComponent from '../ui/VideoComponent.jsx'
export default function Page() {
return (
<section>
<Suspense fallback={<p>Loading video...</p>}>
<VideoComponent />
</Suspense>
{/* Other content of the page */}
</section>
)
}

알아 두면 좋은 정보 : 외부 플랫폼의 비디오를 임베드할 때 다음 모범 사례를 고려하세요:

  • 비디오 임베드가 반응형인지 확인하세요. CSS로 iframe이나 비디오 플레이어가 다양한 화면 크기에 맞게 조정되도록 합니다.
  • 특히 데이터 요금제에 제한이 있는 사용자를 위해 네트워크 상태에 따라 비디오 로딩 전략을 구현하세요.

이 접근 방식은 페이지가 블로킹되지 않아 비디오 컴포넌트가 스트리밍되는 동안에도 사용자가 페이지와 상호작용할 수 있으므로 더 나은 사용자 경험을 제공합니다.

더 몰입감 있고 유익한 로딩 경험을 제공하려면 대체 UI로 로딩 스켈레톤을 사용하는 것을 고려하세요. 간단한 로딩 메시지 대신 비디오 플레이어와 유사한 스켈레톤을 표시할 수 있습니다.

app/page.jsx

import { Suspense } from 'react'
import VideoComponent from '../ui/VideoComponent.jsx'
import VideoSkeleton from '../ui/VideoSkeleton.jsx'
export default function Page() {
return (
<section>
<Suspense fallback={<VideoSkeleton />}>
<VideoComponent />
</Suspense>
{/* Other content of the page */}
</section>
)
}

자체 호스팅은 다음과 같은 이유로 선호될 수 있습니다.

  • 완전한 제어와 독립성 : 자체 호스팅은 재생부터 모양까지 비디오 콘텐츠를 직접 관리할 수 있어 외부 플랫폼 제약 없이 완전한 소유와 제어를 보장합니다.
  • 특정 요구 사항에 맞춘 사용자 지정 : 동적 배경 비디오 같은 고유한 요구 사항에 이상적이며, 디자인과 기능적 요구 사항에 맞게 맞춤 설정할 수 있습니다.
  • 성능 및 확장성 고려 사항 : 증가하는 트래픽과 콘텐츠 규모를 효과적으로 지원할 수 있도록 고성능이면서 확장 가능한 스토리지 솔루션을 선택하세요.
  • 비용과 통합 : 스토리지 및 대역폭 비용과 Next.js 프레임워크 및 더 넓은 기술 생태계에 쉽게 통합해야 하는 요구 사항을 균형 있게 고려하세요.

Vercel Blob을 사용한 비디오 호스팅

섹션 제목: “Vercel Blob을 사용한 비디오 호스팅”

Vercel Blob은 Next.js와 잘 작동하는 확장 가능한 클라우드 스토리지를 제공하여 비디오를 호스팅하는 효율적인 방법입니다. 다음은 Vercel Blob을 사용해 비디오를 호스팅하는 방법입니다.

1. Vercel Blob에 비디오 업로드하기

Vercel 대시보드에서 “Storage” 탭으로 이동해 Vercel Blob 스토어를 선택합니다. Blob 표의 우측 상단에서 “Upload” 버튼을 찾아 클릭하고 업로드할 비디오 파일을 선택하세요. 업로드가 완료되면 비디오 파일이 Blob 표에 표시됩니다.

또는 서버 액션을 사용해 비디오를 업로드할 수 있습니다. 자세한 지침은 server-side uploads에 대한 Vercel 문서를 참고하세요. Vercel은 client-side uploads도 지원하므로 특정 사용 사례에 따라 이 방법이 더 적합할 수 있습니다.

2. Next.js에서 비디오 표시하기

비디오가 업로드되어 저장되면 Next.js 애플리케이션에서 이를 표시할 수 있습니다. 다음은 <video> 태그와 React Suspense를 사용해 이를 구현하는 예시입니다.

app/page.jsx

import { Suspense } from 'react'
import { list } from '@vercel/blob'
export default function Page() {
return (
<Suspense fallback={<p>Loading video...</p>}>
<VideoComponent fileName="my-video.mp4" />
</Suspense>
)
}
async function VideoComponent({ fileName }) {
const { blobs } = await list({
prefix: fileName,
limit: 1,
})
const { url } = blobs[0]
return (
<video controls preload="none" aria-label="Video player">
<source src={url} type="video/mp4" />
Your browser does not support the video tag.
</video>
)
}

이 방식에서는 페이지가 @vercel/blob URL을 사용해 VideoComponent로 비디오를 표시합니다. React Suspense가 비디오 URL을 가져와 비디오가 표시될 준비가 될 때까지 대체 UI를 보여 줍니다.

비디오에 자막이 있다면 <video> 태그 안에서 <track> 요소를 사용해 손쉽게 추가할 수 있습니다. 비디오 파일과 마찬가지 방식으로 Vercel Blob에서 자막 파일을 가져올 수 있습니다. 다음은 자막을 포함하도록 <VideoComponent>를 업데이트하는 방법입니다.

app/page.jsx

async function VideoComponent({ fileName }) {
const { blobs } = await list({
prefix: fileName,
limit: 2,
})
const { url } = blobs[0]
const { url: captionsUrl } = blobs[1]
return (
<video controls preload="none" aria-label="Video player">
<source src={url} type="video/mp4" />
<track src={captionsUrl} kind="subtitles" srcLang="en" label="English" />
Your browser does not support the video tag.
</video>
)
}

이 접근 방식을 따르면 Next.js 애플리케이션에 비디오를 직접 호스팅하고 통합할 수 있습니다.

영상 최적화와 모범 사례에 대해 계속 학습하려면 다음 자료를 참고하세요.

  • Understanding video formats and codecs : 요구 사항에 맞게 MP4처럼 호환성이 좋은 형식이나 웹 최적화에 적합한 WebM 등을 선택하세요. 자세한 내용은 Mozilla’s guide on video codecs를 확인하세요.
  • Video compression : FFmpeg 같은 도구를 사용해 품질과 파일 크기 사이의 균형을 맞추며 효과적으로 비디오를 압축하세요. 압축 기법은 FFmpeg’s official website에서 알아볼 수 있습니다.
  • Resolution and bitrate adjustment : 시청 플랫폼에 맞춰 resolution and bitrate를 조정하고, 모바일 기기에는 더 낮은 설정을 적용하세요.
  • Content Delivery Networks (CDNs) : CDN을 활용해 비디오 전송 속도를 높이고 대규모 트래픽을 처리하세요. Vercel Blob 같은 일부 스토리지 솔루션을 사용하면 CDN 기능이 자동으로 처리됩니다. CDN과 그 이점에 대해 Learn more에서 확인하세요.

Next.js 프로젝트에 비디오를 통합할 수 있는 다음 스트리밍 플랫폼도 살펴보세요.

  • <Video> 컴포넌트를 제공하며, Vercel Blob, S3, Backblaze, Mux 등 다양한 호스팅 서비스와 호환됩니다.
  • 여러 호스팅 서비스와 함께 next-video.dev를 사용하는 Detailed documentation가 준비되어 있습니다.
  • Mux는 Next.js와 함께 비디오 강의를 제작할 수 있는 starter template을 제공합니다.
  • Next.js 애플리케이션에 high-performance video를 임베드하는 Mux의 권장 사항을 알아보세요.
  • Mux와 Next.js를 시연하는 example project도 살펴보세요.
  • Fastly의 video on demand 및 스트리밍 미디어 솔루션을 Next.js에 통합하는 방법을 알아보세요.

supported.

Send