νλ‘ νΈμλ μΈ‘λ©΄μμ μ¬μ©μμμ μΈν°λ μ
μ΄ λ§μ΄ λ°μλκ³ , 볡μ‘ν λΉμ¦λμ€ λ‘μ§μ κ°μ§κ³ μλ μμ€ν
κ°λ°μ λμ ν΄λ³΄κ³ μΆμμ΅λλ€.
μνμλ§€μ¬μ΄νΈλ μν μ 보λ₯Ό μ 곡ν΄μ£ΌκΈ°λ νμ§λ§ κ·Ήμ₯μ ν, λ μ§, μμκ΄, μ’μ μ ν λ± μ¬μ©μκ° μ§μ μ μΌλ‘ μ νν΄μΌνλ μ 보λ€μ΄ λ§κ³ , μ΄λ₯Ό μν μ»΄ν¬λνΈλ€μ λ§μ μκ°μ νλ©° κ°λ°ν΄μΌλλ μ»΄ν¬λνΈλ€μ΄λΌ μκ°λμμ΅λλ€.
μμ κ°μ μ΄μ λ‘ μνμλ§€μ¬μ΄νΈλ₯Ό κ°λ°ν΄λ³΄μμ΅λλ€.
- 2024.03.11 - v1.0.0 (1μ°¨μμ±)
- 2024.04.25 - v.2.0.0 (μ μμν λΌμ΄λΈλ¬λ¦¬ λμ )
- 2025.02.06 - v.3.0.0 (μν€ν μ² λ¦¬ν©ν λ§)
- 2025.04.05 - v.3.1.0 (λ‘κ·ΈμΈ κΈ°λ₯ μΆκ°)
μ°μ , next.jsμ layout μ»΄ν¬λνΈλ₯Ό νμ©νμ¬, λͺ¨λ νμ΄μ§μ μλ¨μ λμΌ ν€λκ° λλλ§λλλ‘ κ΅¬ννμμ΅λλ€.
첫 νμ΄μ§μ μλ¨μλ νμ¬ μμμ€μΈ μνμ μ€νΈμ·κ³Ό ν¬μ€ν°, κ·Έλ¦¬κ³ μν λ΄μ©μ΄ 10μ΄μ κ°κ²©μΌλ‘ μ νλλ©° 보μ¬μ€λλ€.
νλ¨μ λκ·Έλ λ²νΌμ ν΄λ¦νμ¬ ν΄λΉ μμμ μν μ 보λ₯Ό λλλ§ μν¬ μ μμ΅λλ€.
μλ§€νκΈ° λ²νΌμ ν΅ν΄ μλ§€νμ΄μ§λ‘ μ΄λν μ μμ΅λλ€.
λμ μΈ μμ§μμ μ£ΌκΈ°μν΄ μ»¨ν
μΈ κ° λ³κ²½ λ λλ§λ€ μ€νΈμ»·μ μ€ μμμ΄ λλλ‘, μν μ 보μ ν¬μ€ν°λ μλ‘ λ μ€λ₯΄λ― transform, scale, transition μμ±μ νμ©νμ¬ μ λλ©μ΄μ
μ ꡬννμμ΅λλ€.
μν λ°μ΄ν°λ νμ¬ μμμ, μμ μ’
λ£μ, κ°λ΄ μμ μμΌλ‘ λΆλ₯λλ©° νμ¬ μμμ₯μΌ κ²½μ° νμ κ³Ό μλ§€μ¨μ΄, μμ μ’
λ£μμΌ κ²½μ° νμ κ³Ό μμμ’
λ£ ν
μ€νΈκ°, κ°λ΄ μμ μμ νμ κ³Ό κ°λ΄κΉμ§ λ¨μ λλ°μ΄κ° νμλ©λλ€.
κ° μνλ°μ΄ν°λ mysql databaseμ μ μ₯λμ΄ μμΌλ©°,
export interface movieType {
id: number; // id
title: string; // μ λͺ©
summary: string; // μ€κ±°λ¦¬
rating: number; // νμ
reservation_rate: number; // μλ§€μ¨
release_date: string; // κ°λ΄μΌμ
classification: number; // μμμ¬λΆ (1: νμ¬μμμ, 2: μμμ’
λ£μ, 3: κ°λ΄μμ μ)
background_img: string; // λ°°κ²½μ΄λ―Έμ§ url
poster_img: string; // ν¬μ€ν°μ΄λ―Έμ§ url
}νμμΌλ‘ λμ΄μμ΅λλ€.
λ°μνμ κ³ λ €νμ¬ κ΅¬ννμκΈ°λλ¬Έμ, νλ©΄ μ¬μ΄μ¦κ° μ€μ΄λ€λ©΄ 컨ν
μΈ κ° κ°λ‘ 4κ°μ© μ λ ¬λλ κ²μ΄ 2κ°λ‘ μ€μ΄λ€κ³ , μνλΆλ₯ λ€λΉκ²μ΄μ
λ κΈ°μ‘΄ λ²νΌμμμ μ ν λΆλ₯λ§ νμλκ³ , λλ¨Έμ§λ ν΄λ¦ μ λ΄λ €μ€λ λͺ¨λ¬μ ν΅ν΄ μ ννλλ‘ κ΅¬ννμμ΅λλ€.
κ° μΉ΄λ μ»΄ν¬λνΈλ₯Ό νΈλ² μ μ΄λ―Έμ§κ° μ΄μ§ νλλλ μ λλ©μ΄μ
κ³Ό ν¨κ» μμΈλ³΄κΈ°, μλ§€νκΈ° λ²νΌμ΄ λλλ§λκ³ , μμΈλ³΄κΈ° ν΄λ¦ μ μν μ λ³΄κ° λ΄κ²¨μλ λͺ¨λ¬μ΄ λλλ§λ©λλ€.
μλ§€νκΈ° λ²νΌμ ν΅ν΄ μλ§€ νμ΄μ§λ‘ λΌμ°ν λλ©΄, μΌλ¨ μλ¨μ ν¬μ€ν°μ μν νμ , μλ§€μ¨ μ λ³΄κ° νμλ©λλ€.
μλ§€ 첫λ²μ§Έ λ¨κ³λ κ·Ήμ₯μ νμ΄κ³ μ’μΈ‘μλ κ·Ήμ₯리μ€νΈ, μ°μΈ‘μλ ν΄λΉ μνκ΄ μμΉλ₯Ό νμν΄ μ€ μΉ΄μΉ΄μ€ λ§΅μ΄ λλλ§λ©λλ€.
λ°μνμ κ³ λ €νμ¬, λͺ¨λ°μΌμ κ²½μ°μλ κ·Ήμ₯리μ€νΈκ° μλ¨μΌλ‘, μ§λλ νλ¨μΌλ‘ λ°°μΉλμ΄ λ μ΄μμ κΉ¨μ§μ λ°©μ§νμμ΅λλ€.
μΉ΄μΉ΄μ€λ§΅ apiλ₯Ό μ¬μ©νκ³ , μνκ΄ λ¦¬μ€νΈμ κ° μνκ΄μ μλμ μ’νλ₯Ό dbλ‘ κ΄λ¦¬νμ¬, μΉ΄μΉ΄μ€λ§΅μ κ³ μ νμΌλ‘ νμν΄λμμ΅λλ€.
μνκ΄μ μ ννλ©΄ μΉ΄μΉ΄μ€λ§΅μ μ νν μνκ΄μ μμΉλ‘ μ΄λνκ² λ©λλ€.
μλ§€ λλ²μ§Έ λ¨κ³λ λ μ§ μ ν λ° μμκ΄, μμμκ° μ νμ
λλ€.
λ§μ°¬κ°μ§λ‘ λ°μ€ν¬νμΌ κ²½μ°μλ μ’μΈ‘μ λ μ§ λ¦¬μ€νΈ, μ°μΈ‘μ μμμκ°νκ° λλλ§λκ³ , λͺ¨λ°μΌμ κ²½μ° μλ¨μ λ μ§ λ¦¬μ€νΈ, νλ¨μ μμμκ°νκ° λλλ§ λ©λλ€.
λ μ§λ¦¬μ€νΈλ νμ¬λ μ§λ₯Ό κΈ°μ€μΌλ‘ 2μ£Όλ€ λ μ§κΉμ§ dbμμ κ°μ Έμ€κ² λλλ°, dbλ
export interface DateType {
date: string; // λ μ§ (YYYYMMDD);
week: string; // μμΌ (μ ~ μΌ);
holiday_yn: string; // 곡ν΄μΌ μ¬λΆ (Y/N);
}μμ κ°μ ννλ‘ μ μ₯λμ΄ μμ΅λλ€.
μμΌμ λ°λΌ ν , μΌμ μκΉμ λ€λ₯΄κ² λλλ§λλ©°, 곡ν΄μΌ μ¬λΆμ λν μ 보λ₯Ό ν΅ν΄ 곡ν΄μΌμΌ κ²½μ° λΉ¨κ°μ μ²λ¦¬λ₯Ό ν΄μ£Όμμ΅λλ€.
λ μ§λ₯Ό μ ννλ©΄, ν΄λΉ λ μ§μ μ νν μν, μ νν μνκ΄ idλ₯Ό νλΌλ―Έν°λ‘ λ³΄λ΄ κ·Έμ ν΄λΉνλ μμμκ°νλ₯Ό κ°μ Έμ€κ²λ©λλ€.
μλ§€ λ§μ§λ§ λ¨κ³λ κ΄λμΈμ μ λ° μ’μ μ νμ
λλ€.
μ°μ , μ νν μμκ΄κ³Ό μμμκ°μ λ°λ₯Έ μ’μ μ 보λ₯Ό dbμμ κ°μ Έμ€κ² λκ³ , μ νν μμκ΄ idμ μΌμΉνλ μμκ΄ κ΅¬μ‘° μ 보λ₯Ό μμκ΄ κ³΅ν΅ μ»΄ν¬λνΈμ propsλ‘ μ λ¬νμ¬ μμκ΄μ λλλ§ μν΅λλ€.
κ΄λμΈμμ μ ννκ² λλ©΄, μ’μ μ 보μ λ°λ₯Έ μμ½μλ£ μκ³Ό μλ§€κ°λ₯ μμ νμν΄μ£Όκ³ , κ΄λμΈμμ λ§κ² μ’μμ μ ννκ²λ©λλ€.
μ’μμ νμ λ€μκ³Ό κ°μ μꡬμ¬νμ λ°λ¦ λλ€.
- μΈμ μκ° 2λͺ μ΄μμΌ κ²½μ°, νλ²μ 2μλ¦¬μ© μ ννλ€.
- μ’μ μ νμ΄ μ§νλκ³ μμ¬ μ ν μμ΄ 1κ°λΌλ©΄ λ€μ 1μλ¦¬λ§ μ νλλ€.
- 2μ리 μ© μ νν λ, μ νν μ’μ μ°μΈ‘μ’μμ΄ ν¨κ» μ νλλ€.
- λ§μ½, μ°μΈ‘ μ’μμ΄ μλ§€λ μ리거λ μλ μ리 μΌλλ μ’μΈ‘ μ’μμ΄ μ νλλ€.
- λ§μ½, μ’μΈ‘ μ’μλ μλ§€λ μ리거λ μλ μ리 μΌ κ²½μ°μλ νμλ¦¬λ§ μ νλλ€.
- μ νν μ’μμ ν΄λ¦νλ©΄ μ ν μ·¨μλλ€.
- μ ν μ·¨μν κ²½μ° νμ리 μ© μ·¨μλλ€.
- μ’μμ΄ μ νλ μνμμ μΈμμλ₯Ό λ³κ²½νλ©΄, μ νλ μ’μμ λͺ¨λ μ΄κΈ°ν λλ€.
λ°μνμ κ³ λ €νμ¬ λͺ¨λ°μΌ μ¬μ΄μ¦λ‘ μ€μ΄λ€ μ ν°νΈ μ¬μ΄μ¦μ μ»΄ν¬λνΈ μ¬μ΄μ¦κ° μΌλΆ μμμ§μ§λ§, μμκ΄ μ»΄ν¬λνΈλ overflow-autoλ₯Ό μ μ©νμ¬ μλ μ¬μ΄μ¦λ₯Ό μ μ§ν μ±, 보μ΄μ§ μλ μμμ μ€ν¬λ‘€λ‘ μ΄λνλλ‘ κ΅¬ννμμ΅λλ€.
λͺ¨λ μλ§€ μ μ°¨λ₯Ό μλ£νλ©΄ μλ μλ§€νκΈ° λ²νΌμ΄ νμ±νλκ³ , μλ§€νκΈ° λ²νΌ ν΄λ¦ μ μ νν μ’μμ 보λ dbμ λ°μλκ² λ©λλ€.
κ·Έλ¦¬κ³ Ticket λͺ¨λ¬μ΄ λλλ§λλ©΄μ λͺ¨λ μλ§€ μ μ°¨κ° μλ£λκ² λ©λλ€.
μνμλ§€μμ€ν
μ μ¬μ©μλ€μκ² λ§μ΄ λ
ΈμΆλμ΄μΌνλ μμ€ν
μ
λλ€.
κ·Έλ κΈ°λλ¬Έμ, SEOλ₯Ό μ°μ μ μΌλ‘ κ³ λ €ν΄μΌνκ³ , ν΄λΌμ΄μΈνΈμ λΉ htmlμ 보λ΄μ£Όκ³ μμ°¨μ μΌλ‘ javascript μ½λλ₯Ό 보λ΄μ£Όλ React보λ¨, μλ² λ¨μμ htmlμ μμ±μμΌ ν΄λΌμ΄μΈνΈλ‘ 보λ΄μ£Όλ Next.jsκ° μ μ νλ€κ³ μκ°νμ΅λλ€.
λν, Next.jsμ Image νκ·Έλ μλμΌλ‘ μ΄λ―Έμ§ μ΅μ νλ₯Ό μμΌμ€λλ€.
μν ν¬μ€ν°, μ€νΈμ»· λ± λ§μ μ΄λ―Έμ§κ° λλλ§λμ΄μΌνλ μλΉμ€μ΄κΈ° λλ¬Έμ, Next.jsμ Image νκ·Έλ₯Ό ν΅ν΄ μ΄λ―Έμ§ μ΅μ νλ₯Ό μ μ©μν€λ κ²μ΄ μ μ νμμ΅λλ€.
μ¬μ€, μ΄μ νμ¬μμ javascriptλ‘ νλ‘μ νΈλ₯Ό μ§νν λ, λ°νμμλ¬μ λν μ΄μλ₯Ό λ§μ΄ κ²½ννμμ΅λλ€.
mapμ΄λ filterκ°μ javascript λ΄μ₯ ν¨μλ₯Ό μ¬μ©ν λ, λ°μ΄ν° fetchingμ λν νμ΄λ° λλ¬Έμ μκΈ°μΉμμ nullκ°μ΄λ undefined λλ¬Έμ λ°νμμλ¬κ° λ°μν μΌμ΄ λ§μμμ£ .
νμ
μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄, λͺ¨λ propsλ λ³μμ λν΄ μ μ ν νμ
μ μ€μ νκΈ° λλ¬Έμ, μκΈ°μΉμμ λ€λ₯Έ νμ
μ΄ λ€μ΄μλ μ½λ©κ³Όμ μμ μλͺ»λ¨μ μΈμ§νκ³ μμ ν μ μλ€λ μ₯μ μ΄ μκΈ° λλ¬Έμ μΆν, λ²κ·Έλ₯Ό μ€μ΄κ³ μμ μ±μ ν보ν μ μκ² λ€κ³ μκ°νμ¬ νμ
μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ κ°λ°νμμ΅λλ€.
λ°μν μ± κ΅¬νμ΄ λͺ©νμκΈ° λλ¬Έμ, λ³λμ media queryλ₯Ό μ¬μ©νμ§ μκ³ λ, tailwind config νμΌμ κ° λλ°μ΄μ€ λ³ μ€ν¬λ¦° μ¬μ΄μ¦λ₯Ό μ§μ ν΄μ€μΌλ‘μ¨ κ°νΈνκ³ λΉ λ₯΄κ² λ°μνμ ꡬνν μ μλ€λ μ₯μ μ΄ μ΄λ² νλ‘μ νΈμ κ°μ₯ μ μ νλ€κ³ μκ°νμ΅λλ€.
next.js 곡μλ¬Έμλ₯Ό μ½μ΄λ³΄λ€κ° next.jsλ₯Ό νμ€ν νλ μμν¬μ²λΌ μ¬μ©ν μ μλ€λ κ²μ μ μ μμμ΅λλ€.
λ³λμ λ°±μλ μλ²λ₯Ό ꡬμΆνμ§ μμλ μ체μ μΌλ‘ apiλ₯Ό νΈλ€λ§νλλ‘ κ΅¬νν μ μλ€λ κ²μ΄ κ°μ₯ ν° μ₯μ μΌλ‘ λ€κ°μμ΅λλ€.
κ·Έλ¦¬κ³ , api μμ²μ λν api μ£Όμλ next.js direct routingμ²λΌ ν΄λλͺ
μΌλ‘ μ§μ ν μ μκ³ , node.jsμ²λΌ javascript λ¬Έλ²μ κΈ°λ°μΌλ‘ λ°±μλλ₯Ό ꡬμΆν μ μλ€λ μ μ΄ κ°μ₯ ν° λ§€λ ₯μ μΌλ‘ λκ»΄μ‘μ΅λλ€.
μ²μμλ μ¬μ΄λ νλ‘μ νΈμ΄κΈ° λλ¬Έμ, dummy dataλ₯Ό μ¬μ©νμ¬ κ΅¬ννκ³ μ νμ§λ§, μμμκ°νμ κ²½μ° κ΅μ₯ν λ§μ rowκ° λ°μκ°κ² λκ³ μ΄κ²μ νλνλ λλ―Έ λ°μ΄ν°λ‘ λ§λ€κΈ°μλ λ§μ νκ³κ° μμμ΅λλ€.
μ νμ¬μμ νμ€ν κ°λ°μλ‘ μΌνκΈ° λλ¬Έμ sqlλ¬Έλ²μ λν΄μλ μ΄λμ λ μ΅μν΄μ§ μν©μ΄μκΈ° λλ¬Έμ MySQL dbλ₯Ό μ¬μ©νλλ° ν° λ¬Έμ λ μλ€κ³ μκ°νμ΅λλ€.
κ·Έλ¦¬κ³ , λ°μ΄ν°κ° κ³ μ λμ΄μλ κ²μ΄ μλλΌ μκ°μ΄ κ²½κ³Όλ¨μ λ°λΌ μμμκ°νλ₯Ό κ³μ μ
λ°μ΄νΈλ₯Ό μμΌμ€μΌ νκΈ°λλ¬Έμ dbλ₯Ό μ¬μ©νλ κ²μ΄ λ§λ€κ³ μκ°ν΄μ MySQLμ μ¬μ©νμ΅λλ€.
Next.js Route Handlerλ₯Ό μ¬μ©ν΄μ λ³λμ λ°±μλ μΈμ€ν΄μ€λ₯Ό ꡬμΆνμ§ μκΈ° λλ¬Έμ DBλ₯Ό AWSμ RDSλ₯Ό ν΅ν΄ λ°°ν¬νμ¬ μ¬μ©ν νμκ° μμμ΅λλ€. AWSμ ν리ν°μ΄λ₯Ό μ μ©νλ©΄ 무λ£λ‘ 1λ κ° μ¬μ©ν μ μκΈ° λλ¬Έμ RDSλ₯Ό μ¬μ©νμ¬ DBλ₯Ό λ°°ν¬νκΈ°λ‘ κ²°μ νμ΅λλ€.
Vercelμ Next.jsμ μ μ‘°μ¬μΈ λ§νΌ, Next.js νλ‘μ νΈμ λ°°ν¬κ° μ λ§ κ°νΈνλ€λ μ₯μ μ΄ μμμ΅λλ€.
λν, μλμΌλ‘ repositoryμ pushκ° λ°μνλ©΄ μλ λ°°ν¬λλ ci/cdλ μ 곡ν΄μ£ΌκΈ° λλ¬Έμ, μΆν 2μ°¨ κ°λ° λλ λ²κ·Έμ΄μκ° λ°μνμ λ, λΉ λ₯΄κ² λμν μ μλ€λ μ μ΄ κ°μ₯ ν° μ₯μ μΌλ‘ λ€κ°μμ΅λλ€.
κ·Έλ¦¬κ³ λΉλκ³Όμ μμμ λ°νμ μν©μμμ λ‘κ·Έλ₯Ό μ€μκ°μΌλ‘ μ 곡ν΄μ£ΌκΈ° λλ¬Έμ κ·Έ μ λ, μμ€ν
μ μ μ§λ³΄μ ν΄λκ°λλ° λλ λ²κ·Έμ μμΈμ λΆμν λ μ λ§ κ°νΈν μ μ΄κ³ μκ°νμ΅λλ€.






