๐ง๐ปโ๐ณ Meme ์ถ์ฒ ์์คํ ๊ฐ๋ฐ๊ธฐ
์ต๊ทผ ๊ฒฝ์๋ฅ ์ด ๋งค์ฐ ๋์ (ํฉ๊ฒฉ๋ฅ 5% ๋ด์ธ) ๊ต๋ด ๊ธฐ์ ์ฐฝ์ ๋์๋ฆฌ๋ฅผ ์ง์ํ๋๋ฐ ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ด ์์์ต๋๋ค.

๋ฐ๋์ ๋ค์ด๊ฐ๊ณ ์ถ์๋ ๋์๋ฆฌ์๊ธฐ์ ๋ง์ ๊ณ ๋ฏผ์ด ๋ค์์ต๋๋ค. ์ฌ๋๋ง๋ค ๊ด์ฌ์ฌ์ ์์ ์ฝ๋๊ฐ ๋ค๋ฅด๋ฉฐ ํน์ ๊ทธ๋ฃน์๊ฒ๋ ์๊ธด ๋ด์ฉ์ด ๋ค๋ฅธ ๊ทธ๋ฃน์๊ฒ๋ ๋ถ์พํ ๋ด์ฉ์ผ๋ก ๋ค๊ฐ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฌ๋ค "์ฐจ๋ผ๋ฆฌ ์ ํ์ ๊ธฐ๋ฐํด meme์ ์ถ์ฒํด์ฃผ๋ ์๋น์ค๋ฅผ ๋ง๋ค๋ฉด ์ด๋จ๊น?"ํ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ๋ฐ์ํ ์ถ์ฒ ์์คํ (์๋ก ๋์ ๋๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํด ์ถ์ฒ ๋ด์ฉ์ด ๋์ ์ผ๋ก ๋ณํ๋ ์์คํ )์ด ์๋๊ธฐ ๋๋ฌธ์ ๊ธฐ์ ์ ์ธ ๋ณต์ก๋๋ ๊ทธ๋ ๊ฒ ๋์ง ์์ ๊ฒ ๊ฐ์์ต๋๋ค. ๋ง์นจ ์ฃผ๋ง์ด ์์๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๐ฌ ์์คํ ๊ธฐํํ๊ธฐ
์ฐ์ ์ ๊ฐ ์ฌ๋ฐ๊ฒ ๋ณธ ๋์์๋ค์ ๋ฆฌ์คํธ์ ํ์ต๋๋ค. (ํฑํก, ํธ์ํฐ, ์ธ์คํ๊ทธ๋จ ๋์ ์ ํ๋ธ๋ฅผ ์ฌ์ฉํด๋ ์๊ด ์์ ๊ฒ์ด๋ผ ํ๋จํ์ต๋๋ค.)

์ดํ Notion ํ์ด์ง์์ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๋ถ๋ฅํ์ต๋๋ค. ์์ , ์ํ, ๊ฒ์, ์ฝ๋ฉ, ์ผ๋ฐ์ Meme์ผ๋ก ๋๋ ์ ์์์ต๋๋ค.
์ ํ ๊ธฐ๋ฐ ์ถ์ฒ ํ ์คํธ๋ฅผ ๊ตฌ์ํ๋ค ๋ณด๋ 2๊ฐ์ง ์ ๊ทผ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์์ต๋๋ค. ํ๋๋ ์ง๋ฌธ์ ๋ต๋ณ๋ง๋ค ๊ฐ์ค์น๋ฅผ ์ฃผ๊ณ , ์ต์ข ์ ์๋ฅผ ๊ณ์ฐํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ถ์ฒํด์ฃผ๋ ์์คํ ์ ๋๋ค. ๋๋จธ์ง ํ๋๋ ์ ์ฒด์ ์ธ ์๋๋ฆฌ์ค ํธ๋ฆฌ๋ฅผ ์ค์ ํด๋๊ณ ์ ํ์ง์ ์กฐํฉ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์ถ์ฒํด์ฃผ๋ ๊ฒ์ ๋๋ค. ์์ฆ ์ ํํ๋ MBTI ๊ฒฐ๊ณผ๋ฌผ๋ค์ ๋ถ์ํด๋ณธ ๊ฒฐ๊ณผ ๋๊ฐ ์ฒซ ๋ฒ์งธ ์ ์ ๊ธฐ๋ฐ ์ถ์ฒ ์์คํ ์ ์ฌ์ฉํ์ต๋๋ค. ์ ๋ ๋ ๋ฒ์งธ ์๋๋ฆฌ์ค ํธ๋ฆฌ ๊ธฐ๋ฐ ์ถ์ฒ ์์คํ ์ ์ฌ์ฉํ์ต๋๋ค. ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ์ ํ๋๊ทธ ์์คํ
์ ๊ตฌ์ฑํ๊ธฐ ๋๋ฌด ๋ณต์กํ์ต๋๋ค.
- MBTI๋ ์ ์ ํ๋๊ทธ๊ฐ ๋จ์ํฉ๋๋ค.
E/I,N/S,T/F,J/P์ด๋ ๊ฒ 4๊ฐ์ ํ๋๊ทธ๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ ์ ์ํ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ ๋น๊ต์ ํธ๋ฆฌํฉ๋๋ค. - ์ ๋ ๋น์ฅ ์์ , ์ํ, ๊ฒ์, ์ฝ๋ฉ, ์ผ๋ฐ ์ด๋ ๊ฒ 5๊ฐ์ ์นดํ ๊ณ ๋ฆฌ๊ฐ ์กด์ฌํ๊ณ ๊ฐ ์นดํ ๊ณ ๋ฆฌ๋ง๋ค ๋ค์ํ ํ์ ์นดํ ๊ณ ๋ฆฌ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํ๋๊ทธ๋ฅผ ์ก๊ธฐ๊ฐ ์ ๋งคํ์ต๋๋ค.
- ์๋ฅผ ๋ค์ด ๋จ์ํ ๊ฒ์ ํ๋๊ทธ ์ ์๊ฐ ๋๋ค๊ณ ํด์ ๋ฌด์์ ๋กค Meme ์์์ ์ถ์ฒํด์ค ์๋ ์์ต๋๋ค. ๋กค์ ๊ท์น์ ๋ชจ๋ฅด๊ฑฐ๋ ๊ทธ ์์๋์ ๊ณต๊ฐํ์ง ๋ชปํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋กค ์ ์ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ "์ ์ผ ์ข์ํ๋ ๊ฒ์" ํ๋๊ทธ๋ฅผ ๋ฐ๋ก ์ง์ ํด๋์ด์ผ ํฉ๋๋ค.
- ์ด ๊ฒฝ์ฐ ์ํ ๊ด๋ฆฌ๊ฐ ๋ฌด์ฒ ๋ณต์กํด์ง๋ฉฐ ๊ทธ๋ ๊ฒ๊น์ง ๊ธฐ์ ์ ๋์ด๋๋ฅผ ๋์ด๊ณ ์ถ์ง ์์์ต๋๋ค.
- ํ์ง๋ง ๋์์ง๋ ๊ธฐ์ ์ ๋์ด๋๋ณด๋ค ๋ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ ๊ธฐํ์ ๋์ด๋์ ๋๋ค. ๋ฌด์๋ณด๋ค๋ ์์์ด ํ๋๊ทธ๋ง๋ค ์ด๋ ์ ์ ์์ญ๋์ ์ถ์ฒ๋์ด์ผ ํ๋์ง ์ ๊ตํ๊ฒ ๊ธฐํํ๊ธฐ ๋งค์ฐ ์ด๋ ต๋ค๊ณ ๋๊ผ์ต๋๋ค. ์ฆ, ์ ์ ๊ธฐ๋ฐ์ผ๋ก๋ '์ทจํฅ์ ๊ฒฉ'ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
- MBTI๋ ์ ์ ํ๋๊ทธ๊ฐ ๋จ์ํฉ๋๋ค.
- ๋ชจ๋ ์๋ฉ ๋ณด๊ธฐ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ์ถ์์ต๋๋ค.
- ์ ํ ๊ธฐ๋ฐ ๊ฒ์์์๋ ๋ง์ง๋ง ๊ฒฐ์ ํ๋๋ง ๋ณ๊ฒฝํด์ ๋ค๋ฅธ ์๋ฉ์ ๋ณด๊ณ ์ถ์ ์ ์์ต๋๋ค (ํนํ ๋จ์ํ MBTI๊ฐ ์๋ ์ด๋ฐ Meme ์ถ์ฒ์ ๋์ฑ์ด ๊ทธ๋ด ์ ์์ต๋๋ค).
- ํ์ง๋ง ์ ์ ๊ธฐ๋ฐ ์์คํ
์ ๋๊ฐ ํ
์คํธ๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์์ํด์ผํ๋ฉฐ ์ ํ
undo์ก์ ์ ์ถ๊ฐํ๋ ค๋ฉด ๋ ๋ง์ ์์ง๋์ด๋ง์ด ํฌ์ ๋์ด์ผ ํฉ๋๋ค. - ์๋๋ฆฌ์ค ํธ๋ฆฌ ๊ธฐ๋ฐ์ ํ์ฉํ๋ค๋ฉด ์ด ๋ถ๋ถ์ด ๋ ํธ๋ฆฌํด์ง๋๋ค. Parent Node๋ก ์ด๋ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ํ์ ๋๊ฒ ์ง๋ง, ์ ์ ๊ฒฝ์ฐ Next Link๋ฅผ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์์ ๋ค๋ก ๊ฐ๋ ๊ฒ๋ง์ผ๋ก ์ก์
undo๊ฐ ๋ฉ๋๋ค.
- ์ผ๋ฐ์ ์ธ ์ ํ์ง ์ดํ๊ฐ ์๋ ํ๋ ์ดํ
๋ ์ ํ์ง ์ดํ๋ฅผ ๋ฃ๊ณ ์ถ์์ต๋๋ค.
- ์ ์ ๊ธฐ๋ฐ ์์คํ ์์๋ ๊ต์ฅํ ์ผ๋ฐ์ ์ธ ํํ์ ์ง๋ฌธ๊ณผ ๋ต๋ณ๋ง ํ๊ฒ ๋ฉ๋๋ค. ์ฆ follow-up ์ง๋ฌธ์ ํ์ง ๋ชปํฉ๋๋ค.
- ์ ๋ ์๋๋ฆฌ์ค ํธ๋ฆฌ๋ฅผ ํ์ฉํด ์ง๋ฌธ๊ณผ ๋ต๋ณ์ด ์๋ก ์ ํํ๊ฒ ๋ค์ด๋ง๋๋ก ๋ง๋ค์ด ์ ์ ๋ํํ๋ ๋ฏํ ๊ฒฝํ์ ์ฃผ๊ธฐ ์ํด ๋ ธ๋ ฅํ์ต๋๋ค.
- ๋ํ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด ์์คํ ์ "๋์๋ฆฌ ์ง์์์ ์ฒจ๋ถ๋ " ๋ชฉ์ ์ ๋๋ค.
- ์๋ฌด๋ฆฌ ์ฌ๋ฏธ์๋ ์์์ ์ถ์ฒํด์ค๋ค๊ณ ํ๋๋ผ๋ ์ ์ด๋ฆ์ ๊ธฐ์ตํ์ง ๋ชปํ๊ณ ์์๋ง ๊ธฐ์ตํ๊ฒ ๋๋ค๋ฉด ๋ณธ๋ง์ด ์ ๋๋ ๊ฒ์ ๋๋ค.

๐ฅ ๊ธฐ์ ์คํ ๊ฒฐ์ ํ๊ธฐ
ํ๋ก ํธ์๋์ ์์ด์๋ ๋ณ๋ค๋ฅธ ๊ณ ๋ฏผ์ ํ์ง ์์์ต๋๋ค. ์ต๊ทผ TypeScript Next์ ์ฌ๋์ ๋น ์ก๊ธฐ ๋๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ ์ ํํ๊ฒ ๋์๊ณ Vercel๊ณผ Next์ ํธํ์ฑ์ ์๊ธฐ์ Vercel์ ํธ์คํ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์คํ์ผ์ styled-component๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ด๋์ ์ ์ฅํ ์ง์ ๋ํ ๋ถ๋ถ์ด ๋ฌธ์ ์์ต๋๋ค. Meme์ ๋ํ ๋ฐ์ดํฐ๋ ๋์ ์ธ ๋ฐ์ดํฐ๊ฐ ์๋๊ณ , ์ ์ ์ ๋ณด๋ ์ ์ฅํ ์ผ์ด ์๋ค๊ณ ํ๋จํ๊ธฐ์ DB ๋๋ DBaaS๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ๋ ๋์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ํํ์ฌ ํ๋์ฝ๋ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ฌ๊ธฐ์์ ํ๋์ฝ๋ฉ๋ ์ ๋ณด๋ค์ ๋ณด์ค ์ ์์ต๋๋ค.
๋ฐฑ์๋ ๋ํ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ตฌ์ฑํ ํ์๊ฐ ์์์ต๋๋ค. ์๋ฒ๋ฆฌ์คํ ํํ๋ก ๋ง๋ค๊ธฐ๋ก ํ์ต๋๋ค.
๐ป ๊ฐ๋ฐํ๊ธฐ
๋ค์๊ณผ ๊ฐ์ด ์์ฝํ ์ ์์ต๋๋ค.
- ์ง๋ฌธ์ ์ง๋ฌธ๋ง๋ค, ๋์์์ ๋์์๋ง๋ค ๊ณ ์ ๋งํฌ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ ํ์ง๋ฅผ ๊ณ ๋ฅด๋ฉด ๊ทธ ๋งํฌ๋ก ์ ์ํ๋ ๊ฒ์ ๋๋ค.
- ๊ฐ ์ ํ์ง๋ '๋ค์ ์ง๋ฌธ' ๋๋ '๊ฒฐ๊ณผ ๋์์' ํ๋๋ฅผ ๊ฐ์ง Object ํํ์ด๋ฉฐ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
getStaticProps์getStaticPaths๋ฅผ ์ฌ์ฉํด ๋ฐ์ ์๋๋ฅผ ์ด๊ณ ์์ผ๋ก ๋ง๋ญ๋๋ค.
๐ 1. ๊ณ ์ ๋งํฌ ๊ตฌ์กฐ
๊ฐ ์ง๋ฌธ๊ณผ ๋์์์ ๋ค์๊ณผ ๊ฐ์ URI ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
https://smile.cho.sh/question/[id]
https://smile.cho.sh/video/[id]
์์:
๐ฌ 2. ํ์ ๊ตฌ์กฐ
TypeScript์ ์ฅ์ ์ ํ์ฉํ์ฌ type ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํ์ต๋๋ค.
export type Question = {
id: number
contents: string[]
answers: Answer[]
}
export type Answer = {
id: number
content: string
result: number | null
nextQuestion: number | null
}
export type Video = {
id: number
title: string
uploader: string
desc: string
youtubeId: string
}
type Answer์์ result์ nextQuestion์ ๋ ์ค ํ ์ชฝ๋ง ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋งํฌ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ 2๊ฐ์ง๋ก ๋ณ๋์ ํ๋๋ฅผ ํตํด question๊ณผ video๋ฅผ ํผ๋ํ๋ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์์์ต๋๋ค. ๋ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ๊ฐ์ 0์ผ๋ก ๋์ด ์๋์น ์์ null ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ ์ ํ์ต๋๋ค. ๊ทธ ํ์ ์ /question/0์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๐ 3. ์ด๊ณ ์ํ
์๋ฅผ ๋ค์ด /question/[id]์ ํด๋นํ๋ ํ์ด์ง๋ค์ ๋ค์ ์ฝ๋๋ฅผ ํตํด ๋น๋ ํ์์ ์ ์ ์ผ๋ก ์์ฑ๋ฉ๋๋ค.
export const getStaticPaths: GetStaticPaths = async () => {
const paths = questionData.map((question) => ({
params: { id: question.id.toString() },
}))
return { paths, fallback: false }
}
export const getStaticProps: GetStaticProps = async ({ params }) => {
try {
const id = params?.id
const item = questionData.find((data) => data.id === Number(id))
return { props: { item } }
} catch (err) {
return { props: { errors: err.message } }
}
}
์ฌ๊ธฐ์ getStaticPaths๋ ์ ์ ์ผ๋ก ์์ฑ๋์ด์ผ ํ ํ์ด์ง๋ค์ path๋ค์ ๋ฆฌ์คํธ๋ฅผ ์ ํด์ฃผ๋ฉฐ, getStaticProps๋ path์ ์ผ์นํ๋ ์ง๋ฌธ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํด์ React App์ props ํํ๋ก ์ ๋ฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ ์ง๋ฌธ๊ณผ ๋์์ ํ์ด์ง๋ฅผ ์ ์ ์ผ๋ก ๋ฏธ๋ฆฌ ์์ฑํด๋ ์ ์์ต๋๋ค. ๋ ๋์๊ฐ next/link์ <Link>๊น์ง ์กฐํฉํ์ฌ ํ์ฉํ๋ค๋ฉด ํ์ด์ง๋ค์ prefetchํด์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ธํฐ๋์
์ ์ด๊ณ ์์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. (๋ง ๊ทธ๋๋ก, ๋ธ๋ผ์ฐ์ ํจ๋น์ฝ์์ ๋ก๋ฉ ๋๋ ๊ฒ๋ ๋ณด์ด์ง ์์ต๋๋ค!)
๐ 4. ์คํ์ผ๋ง ๋ฐ ๋ํ ์ผ ์ก๊ธฐ
๋ค์ ๋งํด์ ์ธํธ๋ก ํ์ด์ง์ ์๋ฉ ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ , ๋นผ๋จน์ ๋ํ
์ผ์ ์ถ๊ฐํ๋ ์ผ์
๋๋ค. ์๋ฅผ ๋ค์ด ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ํด ๋ค๋ฅธ ํํ์ View๋ฅผ ์ฒ๋ฆฌํ๋ ์์
์ ํ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ชจ๋ ์ง๋ฌธ์ ๋ํด์ ์ ๋ชจ๋ฅธ๋ค๊ณ ๋ตํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ค๋ฅธ ๋ทฐ๋ค์ ๋์์์ ๋ฐ๋ก embedํ๋๋ฐ ๋ฐํด ์ด ๊ฒฝ์ฐ์๋ง ๋ฒํผ์ ํํ๋ก ๋ณด์ฌ์ฃผ์์ต๋๋ค.

๋ฌด์จ ์์์ธ์ง๋ ์ง์ ํ์ธํด๋ณด์ธ์!
โจ ๊ฒฐ๊ณผ
- smile.cho.sh
- ์ง์ ์ฌ์ฉํด๋ณด์๊ณ ์๊ฒฌ์ ์๋ ค์ฃผ์ธ์!
- ๋์๋ฆฌ์ ์ต์ข ํฉ๊ฒฉํ์ต๋๋ค!
๐ฅ ํ๊ณ
- ๊ธฐํ์ ๋์ด๋์ ๊ธฐ์ ์ ๋์ด๋ ์ฌ์ด์์ ์ ๋นํ ๋ฐธ๋ฐ์ค๋ฅผ ์ ๋ง์ถ ๊ฒ ๊ฐ์ต๋๋ค.
ES6+์mapํจ์๋ฅผ ์ ๋ง ์์ฃผ, ์ ์ฌ์ฉํ ๊ฒ ๊ฐ์ต๋๋ค!- Static TypeScript Next๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ ์๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
- Favicon, Metadata, SEO ๋ฑ์ ์ ๊ฒฝ์ ์ฐ์ง ๋ชปํ ๊ฒ์ ์กฐ๊ธ ์์ฝ์ง๋ง ๊ฒ์์ด๋ SNS ์ ์ ์ด ํ์ํ์ง ์์ ๋ฐ๋ก ์ถ๊ฐํ์ง๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
- ์ฃผ๋ง ๋์ ๊ฐ์๋ฃ์ผ๋๊น ์์ฑ๋๊ธด ํ๋๊ตฌ๋...๋ผ๋ ์๊ฐ์ ํ์ต๋๋ค ๐