avatar
morethan-log
next 서비스에서 동적으로 게시글 썸네일 생성하기 (Open Graph)
next.jsSEO
Jun 13
·
8 min read

until-463

이전에 개인 블로그를 운영하면서 동적으로 오픈그래프를 적용했던 경험을 공유합니다.

최근에는 아래 방법보다 간편하게 @vercel/og 라이브러리로 좀 더 og이미지 생성 api를 만들 수 있습니다.

관심 있으신 분들은 공식 문서를 참고해보시면 좋을 것 같습니다.

오픈 그래프?

오픈그래프는 페이스북에서 처음 만들어진 개념으로 HTML 문서의 메타정보를 쉽게 표시하기 위해 해당 문서의 제목, 설명, 타입 이미지 등등을 정의해두는 것을 말한다. 쉽게 말해서 내가 카카오톡에 특정 링크를 공유했을 때, 해당 html의 문서의 open graph 메타 태그를 통해 해당 문서에 대한 간략한 요약을 만들어 표시해준다.

일반적으로는 아래와 같은 정보를 포함시키고, 사이트마다 요구하는 별도의 태그가 존재하기도 한다. 해당 사이트에서 url에 대한 미리보기를 지원하고 싶으면 해당 og를 포함시켜야한다.

  • og:title - The title of your object as it should appear within the graph, e.g., "The Rock".

  • og:type - The type of your object, e.g., "video.movie". Depending on the type you specify, other properties may also be required.

  • og:image - An image URL which should represent your object within the graph.

  • og:url - The canonical URL of your object that will be used as its permanent ID in the graph, e.g., "https://www.imdb.com/title/tt0117500/".

출처 : https://ogp.me/#metadata

Next.js에 적용하기

이러한 오픈그래프를 Next.js 에서 적용시키려면 어떻게 하면 좋을까…? 바로 Next.js에서 제공하는 Head 컴포넌트안에 메타태그를 정의해주면 된다.

오픈그래프를 적용시킬때, 해당 페이지가 단순한 웹사이트에 대한 소개인 경우가 있고, 게시글과 같은 동적으로 바뀌는 페이지가 있을것이다. 두가지 케이스를 나누어서 살펴보자.

정적인 페이지인 경우

정적인 경우에는 static하게 적어주기만하면 된다.

// /pages/index.tsxfunction Feed() {
return (
<div>
<Head>
<meta property="og:type" content="website" />
<meta property="og:title" content="멋쟁이 상민처럼" />
<meta property="og:description" content="개발자로 일하면서 배운 내용들을 기록합니다." />
<meta property="og:url" content="<https://morethanmin.com>" />
<meta
property="og:image"
content="정적인 이미지 경로"
/>
</Head>
<FeedContainer/>
</div>
)
}

요런식으로 정의해주면 오픈 그래프를 적용시킬 수 있겠다.

동적인 페이지인 경우

그럼 게시글과 같이 동적인 페이지인 경우에는? 동적으로 가져온 정보를 넣어주면 된다.

// /pages/[slug].tsxexport async function getStaticProps({ params: { slug } }) {
const post = await getPost({ slug })
return {
props: { post },
}
}function ArticlePage({post}) {
return (
<div>
<Head>
<meta property="og:type" content="website" />
<meta property="og:title" content={post.title} />
<meta property="og:description" content={post.summary} />
<meta property="og:url" content={post.url} />
<meta
property="og:image"
content={post.thumbnail}
/>
</Head>
<PostContainer data={post} />
</div>
)
}

동적으로 OG 이미지 생성하기

여러 많은 블로그를 보다보면 배경은 똑같고 텍스트만 바꾸어서 게시글마다 썸네일을 적용 해주곤한다. 티스토리건 벨로그건 네이버블로그건 다 썸네일을 사용자가 직접 업로드해야만 가능하다.

until-464

썸네일을 살펴보면 텍스트 바꿔치기를 통해 반복적으로 썸네일을 만드는 경우들이 상당히 많았다. 동적으로 가져온 게시글 정보에 썸네일 정보가 있는 경우에는 해당 썸네일 이미지를 보여주고, 그렇지 않은 경우에는 동적으로 썸네일을 생성할 수 있지 않을까?

그런 오픈소스가 있는지 찾아보았다.

다양한 서비스들이 있었지만 결국 이미지를 생성해서 해당이미지를 업로드 해주어야 가능한 경우가 많았다. 간단하게는 개인 프로젝트들도 많았고, 심지어는 유료인 서비스들도 있었다.

외부 블로그 서비스를 이용하는 경우에는 그런 서비스를 사용해도 좋겠지만, 나는 블로그를 직접 만들고 있으니, url에 원하는 썸네일 정보를 보내면 동적으로 이미지를 생성해줄 수 있는 api가 필요했다. 아래 처럼 말이다...

// /pages/[slug].tsxexport async function getStaticProps({ params: { slug } }) {
const post = await getPost({ slug })
return {
props: { post },
}
}function ArticlePage({post}) {
return (
<div>
<Head>
{post.thumbnail ?
<meta
property="og:image"
content={post.thumbnail}
/> :
<meta
property="og:image"
content={https://썸네일-만들어주는-서비스/?title=${post.title}}
/>
}
</Head>
<PostContainer data={post} />
</div>
)
}

vercel/og-image

여기저기 찾아보다 vercel/og-image를 발견했다. 해당 페이지에서 실제로 만들 수도 있고, url상으로 동적으로 생성해주는 기능도 지원하는 오픈소스이다. 예시

until-465

한글 인코딩 이슈

내용 그대로다. 한글을 지원하지 않는 폰트를 사용하고 있어서…. 영어만 입력이 가능했다.

until-466

그래서 해당 프로젝트의 이슈를 좀 찾아보니… 실제로 나와 같은 문제를 겪고 있는 사람들이 있었다.

og-image-korean

한글 지원하는 폰트와 기본 이미지를 바꿔서 배포했다. 여기에 들어가보면 확인할 수 있다.

until-467until-468

물론 리서치하고 만드는데 걸린 시간을 생각해본다면… 진작 게시글 썸네일을 200장 이상 만들었을 것 같다.

언틸에도 추후 적용해보면 좋을 것 같다.


- 컬렉션 아티클







몰댄민의 기술블로그