NextJS νλ‘μ νΈ λ°°ν¬νκΈ° ( with. Github Acion, κ°λΉμ )
π‘ λ³Έ ν¬μ€ν μ NextJs νλ‘μ νΈλ₯Ό λ°°ν¬ κ³Όμ μ μκ°νλκ² μλλΌ, λ°°ν¬ κ³Όμ μμ κ²ͺμ μλ¬λ€μ μκ°νκ³ ν΄κ²° λ°©λ²λ€μ κΈ°λ‘νκΈ° μν κΈμ λλ€. λ°°ν¬ λ°©λ²μ μ°ΎμΌμλ λΆμ λ€λ‘κ°κΈ° λ²νΌμ λλ¬μ£ΌμΈμ.
μλ¬ νκ²½
κΈ°μ‘΄μ Vercel μ νμ©νμ¬ λ°°ν¬ νλ νλ‘μ νΈλ₯Ό Github pages λ‘ λ°°ν¬ νλ«νΌμ λ³κ²½νλ κ³Όμ μμ λ°μ
μ΄μ μ μ§ννλ μ¬μ΄λ νλ‘μ νΈλ₯Ό Vercelμ μ¬μ©νμ¬ λ°°ν¬νκ³ κ°λΉμμμ ꡬ맀ν λ맀μΈμ μ°κ²°νμλ€.
νλ¬ λ°μ―€ μ§λ¬μκΉ μλμ κ°μ κ²½κ³ λ©μμ§λ₯Ό λ°μλ€.
μ무λλ κ° νμ΄μ§μ μκ²λ 10μ¬κ° λ§κ²λ μλ°±κ°μ μ΄λ―Έμ§λ₯Ό λλλ§ νλ€λ³΄λ image sourceμ κ°―μ μ νμ μ΄κ³Όνλ λͺ¨μμ΄λ€.
νλμ μ±μ©κ³Όμ λ₯Ό μ§ννλλΌ, μλ¬΄λ° μ‘°μΉλ₯Ό λͺ»νμλλ° 5μ°¨λ‘ κ²½κ³ λ©μμ§κ° μ¨ ν λ°°ν¬κ° μ€λ¨λμ΄ λ²λ Έλ€. κ²λ€κ° μ¬μ©λμ΄ νλ‘μ νΈλ³λ‘ μΉ΄μ΄νΈ λλ κ²μ΄ μλλΌ κ³μ λ¨μλ‘ μΉ΄μ΄νΈ λλ κ±΄μ§ μ΄μ κ³μ μμ λ°°ν¬λ₯Ό νλ €κ³ νλ Pro λ²μ μΌλ‘ μ κ·Έλ μ΄λλ₯Ό μꡬνλ λ°λμ μλ‘μ΄ λ°©λ²μ μ°ΎμμΌλ§ νλ€. ( λ°°ν¬κ° μ€λ¨λκ³ λλ μλ₯ ν©κ²©λ₯ μ΄ νμ ν λ¨μ΄μ Έμ μκΈνκ² ν΄κ²°ν΄μΌλ§ νλ€. )
μ΄μ μ κΉνλΈ νμ΄μ§λ‘ λ°°ν¬νμ λλ μ΄λ° λ¬Έμ κ° μμκΈ°μ νλ€λ₯ κΉνλΈ νμ΄μ§λ‘ λ°°ν¬νκ³ μ νμΌλ... λ무 μμΌμ μκ°μ΄μλ€.
κΉνλΈ νμ΄μ§λ₯Ό νμ©νμ¬ NextJS νλ‘μ νΈλ₯Ό λ°°ν¬νλ λ°©λ²μ ꡬκΈμ μ λ§μ μλ£κ° μμΌλ ν¨μ€νκ³ λ΄κ° κ²ͺμλ μλ¬λ€ μμ£Όλ‘ κΈ°λ‘νλ €κ³ νλ€.
첫λ²μ§Έ μλ¬. Github Actionμ μ¬μ©νμ¬ NextJS νλ‘μ νΈ build κ³Όμ μμ λ°μν μλ¬ ( Static HTML Export )
νλ‘μ νΈλ₯Ό λΉλνλ κ³Όμ μμ Static HTML export with Next.js λ¨κ³μμ μλ¬κ° λ°μνμλ€.
μλ¬ λ°μ μμΈ. Static HTML Export
곡μλ¬Έμμμ Static HTML export μ λν΄μ μ°Ύμ보면 μλμ κ°μ΄ κΈ°λ₯λ€μ΄ λλμ΄μ Έ μλ€.
next export λ₯Ό νμ©νμ¬ Next.js applicationμ static HTMLλ‘ export νλλ°, μ΄λ Node.js μλ²κ° μμ΄λ λ 립μ μΌλ‘ μ€νκ°λ₯νλ€. μλ²λ₯Ό μꡬνλ μ 곡λμ§ μλ κΈ°λ₯μ νμλ‘ νμ§ μλλ€λ©΄ next export λ₯Ό λ¨λ μΌλ‘ μ¬μ©νλ κ²μ μΆμ²νλ€.
μ¦, Node.js μλ²κ° μμ΄μΌλ§ getServerSideProps λ₯Ό μ¬μ©ν μ μλλ° μ΄ νλ‘μ νΈλ μλ²λ¨ μ½λκ° μ‘΄μ¬νμ§ μμμλ getServersideProps λ₯Ό νμ©νμ¬ μ½λκ° μμ±νκΈ°μ λ°μν μλ¬μλ€.
κ°μ λ°©λ²
κΈ°μ‘΄ getServerSideProps μ½λ
export const getServerSideProps: GetServerSideProps = wrapper.getServerSideProps(() => async (context) => {
const param = context.query.clips;
const queryClient = new QueryClient();
await queryClient.prefetchQuery([QUERY_KEYS.GETDATA_BYID], () => getContentById(param as string));
await queryClient.prefetchQuery([QUERY_KEYS.GET_UPNEXT], () => getUpNext(param as string));
return {
props: { dehydratedState: dehydrate(queryClient), param },
};
});
β getSaticProps μ getStaticPaths μ½λ
...
export const getStaticProps: GetStaticProps = async (context) => {
const param = context.params?.clips;
const queryClient = new QueryClient();
await queryClient.prefetchQuery([QUERY_KEYS.GETDATA_BYID], () => getContentById(param as string));
await queryClient.prefetchQuery([QUERY_KEYS.GET_UPNEXT], () => getUpNext(param as string));
return {
props: { dehydratedState: dehydrate(queryClient) },
};
};
export const getStaticPaths: GetStaticPaths = async () => {
return {
paths: [],
fallback: 'blocking',
};
};
...
λλ²μ§Έ μλ¬. Custom domain μ°κ²°νλ κ³Όμ μμ DNS check unsuccessful (κ°λΉμ)
μ λ°©λ²λλ‘ getServerSideProps λ₯Ό getStaticPropsλ‘ μμ νκ³ λλ build μ deployκ° μ μμ μΌλ‘ μ΄λ£¨μ΄μ‘λ€. μ΄μ μ Vercelλ‘ λ°°ν¬νλ©΄μ μ€μ μ λ°κΏλμμμΈμ§ url λ λ°λ‘ λ΄κ° κΈ°μ‘΄μ μ¬μ©νλ cutom domainμΌλ‘ μ°κ²°λμμΌλ, 404 μλ¬κ° μΆλ ₯λμλ€.
κ°λΉμμμ ꡬ맀ν λλ©μΈμ μ°κ²°νκΈ° μν΄μλ μ λ°°ν¬νκ²½μ λ§κ² κ°λΉμμμλ μ€μ μ μλ΄μΌ νλ€.
DNS μ€μ νκΈ°
1. κ°λΉμ λ‘κ·ΈμΈ ν DNS κ΄λ¦¬ν΄ λ©λ΄λ‘ μ΄λ
2. DNS κ΄λ¦¬ λ©λ΄μμ μ€μ μ λ³κ²½νκ³ μ νλ λλ©μΈμ μ ννκ³ DNS μ€μ μΌλ‘ μ΄λ
3. λ°°ν¬νκ²½μ λ§κ² CNAME, A λ μ½λλ₯Ό μΆκ° ( μ¬κΈ°μμλ Github λ μ½λ κ°λ€μ μΆκ°νμμ)
μ¬κΈ°κΉμ§λ§ μ λ°λΌμ€λ©΄ λλΆλΆ λ¬Έμ κ° μμ κ²μ΄λ€.
νμ§λ§ μ΄μ²λΌ DNS check κ° μ±κ³΅μ μ΄μ§ μλ€λ μλ¬ λ©μμ§μ°½μ νμΈν μ μλλ°, μ΄κ²μ DNS μλ²κ° μ€μκ°μΌλ‘ μ μ©λμ§ μμμ μμλ‘ λ°μνλ μλ¬μ΄κ³ μΆν λ μ½λ λ³κ²½μ¬νμ΄ DNS μλ²μ μ μ©λκ³ λλ©΄ μ μλμ νλ€κ³ νλ€.
μ΄λ₯Ό μν΄ μμλλ μκ°μ 볡λΆλ³΅μ΄λ©° μ΅λ 48μκ° κΉμ§λ 걸릴 μ μλ€κ³ νλ€. (by Github Community discussions )
μ΄κ±Έ λ―Ώκ³ 48μκ°μ κΈ°λ€λ Έμμλ λλ λ°°ν¬κ° μ μμ μΌλ‘ λμ§ μμλ€. μ¬μ ν 404 νμ΄μ§λ§ 보μλ€.
μλ¬ λ°μ μμΈ. λ€μμλ²
μμΈμ μ°Ύμ§ λͺ»ν΄ κ±°μ ν루νκ³ λ λ°λμ μ ν€λ§Έλλ°, μμΈμ DNS μλ²μ μμλ€. ν°λ―Έλμμ dig 컀맨λλ₯Ό μ¬μ©νλ©΄ νΉμ λλ©μΈμ λν DNS μλ² μ 보λ₯Ό νμΈν μ μλλ° λ΄ μ»€μ€ν λλ©μΈμ νμΈν΄λ³΄λ ANSWER SECTIONμ A λ μ½λ κ°μ΄ μλ μ€ν¬λ¦°μ·μμ 보λ―μ΄ κΉνλΈ νμ΄μ§μ A λ μ½λκ° μλλΌ μ΄μ μ λ°°ν¬νλ Vercelμ A λ μ½λ κ°μ΄ λ€μ΄μμλ€.
λΆλͺ κΉνλΈμ CNAME, A λ μ½λλ₯Ό μΆκ°νλ©΄μ κΈ°μ‘΄μ μλ A λ μ½λ κ°μ μμ νμμλ λλ©μΈμ μ μ©μ΄ λμ΄μμ§ μμ λ°°ν¬κ° μ΄λ£¨μ΄μ§μ§ μμλ κ²μ΄μλ€.
κ°μ λ°©λ². λ€μμλ² μ€μ λ³κ²½
1. κ°λΉμ λ‘κ·ΈμΈ ν λλ©μΈ ν΅ν© κ΄λ¦¬ν΄ λ©λ΄λ‘ μ΄λ
2. λλ©μΈ κ΄λ¦¬μμ λλ©μΈ μ 보 λ³κ²½ ν΄λ¦ ν, λ³κ²½νκ³ μ νλ λλ©μΈ 체ν¬ν ν λ€μμλ² ν΄λ¦
4. β λ€μμλ²λ₯Ό λ°°ν¬νκ³ μ νλ νκ²½μ λ°λΌ μμ
κΈ°μ‘΄μλ μλμ κ°μ΄ vercelμ λ€μμλ²λ‘ μ€μ λμ΄ μμλλ°,
κΉνλΈμμλ λ³λμ λ€μμλ²λ₯Ό μ€μ μ μꡬνμ§ μμ κ°λΉμμ λ€μμλ²λ‘ μμ νμλ€.
μ¬κΈ°κΉμ§ νκ³ λλ μ½ 10λΆ νμ λ°°ν¬κ° μ μμ μΌλ‘ μ΄λ£¨μ΄μ‘λ€.
μ? λΌλ μ§λ¬Έμ΄ μ μ€μνμ§ κΉ¨λ¬μλ κ²½ν..