@gather_here
λ κ°λ°μ, λμμ΄λ, κΈ°νμ λ± 9κ°μ IT μ§κ΅° μ’
μ¬μλ€κ³Ό IT μ§κ΅° μ·¨μ
μ λͺ©νλ‘ νλ μ€λΉμλ€μ μ°κ²°ν΄μ£Όλ λ°μν νλ«νΌμ
λλ€.π μ°μμ μμ - [λ΄μΌλ°°μμΊ ν React 5κΈ°] (2024)
μλ
νμΈμ! 5λͺ
μ νλ‘ νΈμλ κ°λ°μμ 1λͺ
μ λμμ΄λλ‘ κ΅¬μ±λ κ²λ νμ΄νμ
λλ€.
`κ²λ νμ΄`λ κ°κΈ° λ€λ₯Έ μλμ κ°μ§ μ°λ¦¬κ° λͺ¨μ¬, νμ
μ μλμ§λ₯Ό κ·Ήλν μν¨λ€ λΌλ μλ―Έλ₯Ό κ°μ§κ³ μμ΅λλ€.
νμ μλ‘μ΄ κ°λ₯μ±μ λ°κ²¬νλ νμ
λλ€! π€²π₯
πκΉμλ² | π»μ‘°μμ | πμ΄νλ¦ | π‘κΉμ±μ€ | πͺμ΄λ³΄μ | π¨μ μ ν |
---|---|---|---|---|---|
μ€νμ±ν
μΊλ¦°λ (νμ¬ μΌμ ) IT νμ¬ κ²μκΈ°λ₯ |
κΈμμ± νμ΄μ§ λν μΌ νμ΄μ§ λΆλ§ν¬ |
λ©μΈ νμ΄μ§ μ¬λΌμ΄λ λμμΈ QA μ μ© |
μμ
λ‘κ·ΈμΈ λ‘κ·ΈμΈ μ€λ¬ΈνΌ |
λ§μ΄νμ΄μ§ λ°μν ν΄λ κ³΅ν΅ μ»΄ν¬λνΈ λμμΈκ΄λ ¨ μν΅ |
μΉ λμμΈ λͺ¨λ°μΌ λμμΈ μ»΄ν¬λνΈ λ‘κ³ μ μ |
github: kubap |
github: Eunyoung |
github: Hareum |
github: SungJoon |
github: Boa |
blog: Junghyun |
Next.jsλ νμ΄μ§ κ° μ½λλ₯Ό μλμΌλ‘ λΆν νμ¬ μ΄κΈ° λ‘λ© μκ°μ μ€μ¬μ€λλ€. νΉν, Next.jsμ App Routerλ μλ² μ»΄ν¬λνΈλ₯Ό μ§μνλ©°, κΈ°μ‘΄ νμ΄μ§ λΌμ°ν°λ³΄λ€ λ μ μ°νκ³ λ€μν κΈ°λ₯μ μ 곡ν΄μ€λλ€. μ€μκ° λ°μ΄ν° ν΅μ μ΄ μ€μν μ ν리μΌμ΄μ μμλ μ΄ κΈ°λ₯λ€μ΄ μ±λ₯ μ΅μ νμ ν° λμμ΄ λ©λλ€. μ΄λ¬ν μ΄μ λ‘, λμ μΈ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ λ° μ΅μ νλ Next.js App Routerλ₯Ό νλ μμν¬λ‘ μ ννμ΅λλ€.
Zustandλ₯Ό μ νν μ΄μ λ κ°λ¨ν μ€μ κ³Ό μ§κ΄μ μΈ μ½λλ‘ λΉ λ₯΄κ³ μ½κ² μν κ΄λ¦¬λ₯Ό ꡬνν μ μκΈ° λλ¬Έμ λλ€. Zustandλ μ μ μνμ λ‘컬 μνλ₯Ό μ μ°νκ² κ΄λ¦¬ν μ μμ΄ λ³΅μ‘ν μν κ΄λ¦¬ ꡬ쑰μμλ ν¨μ¨μ μ λλ€. React μΈμ νκ²½μμλ μ μ© κ°λ₯νκΈ° λλ¬Έμ νμ₯μ±κ³Ό μ μ°μ±μ λμμ μ 곡ν©λλ€.
Context APIλ νλ‘μ νΈμμ users ν μ΄λΈμ μ 보λ₯Ό μ¬λ¬ μ»΄ν¬λνΈμμ 곡μ ν΄μΌ νκΈ° λλ¬Έμ μ μ μν κ΄λ¦¬ λκ΅¬λ‘ μ¬μ©νμ΅λλ€. μΈλΆ λΌμ΄λΈλ¬λ¦¬ μμ΄ κ°λ¨νκ² μ€μ ν μ μμΌλ©°, νΉμ μ»΄ν¬λνΈ νΈλ¦¬ λ΄μμ μνλ₯Ό 곡μ νκ³ μ λ°μ΄νΈνλ λ° λ§€μ° μ ν©ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ½λμ 볡μ‘μ±μ μ€μ΄κ³ λ°μ΄ν° κ΄λ¦¬μ μΌκ΄μ±μ μ μ§ν μ μμμ΅λλ€.
Supabaseλ λ°±μλ ꡬμ±μ νμν μκ°μ ν¬κ² λ¨μΆμμΌμ€λλ€. λν μ€μκ° λ°μ΄ν° λκΈ°ν κΈ°λ₯κ³Ό λ€μν λ°μ΄ν°λ² μ΄μ€ κΈ°λ₯μ μ 곡νμ¬ μμ°μ±κ³Ό κΈ°λ₯μ±μ λμμ ν보ν μ μμ΅λλ€. νλ‘ νΈμλ κ°λ°μκ° λ°±μλ ꡬμ±μ μ½κ² μ κ·Όν μ μλλ‘ λμμ£Όλ Supabaseλ₯Ό μ ννμ΅λλ€.
Tailwind CSSλ μΆκ°μ μΈ CSS νμΌ μμ΄λ μ μ§λ³΄μκ° μ©μ΄νλ©°, μ§κ΄μ μΈ ν΄λμ€ λ€μ΄λ°μΌλ‘ λΉ λ₯Έ μ€νμΌλ§μ μ§μν©λλ€. μ‘°κ±΄λΆ μ€νμΌλ§μ΄ μ½κ³ , Next.jsμμ νΈνμ±λ λ°μ΄λκΈ° λλ¬Έμ ν¨μ¨μ μΈ κ°λ°μ μν΄ μ ννμ΅λλ€.
GitHubλ λΆμ°λ ν νκ²½μμ ν¨μ¨μ μΈ λ²μ κ΄λ¦¬μ νμ μ κ°λ₯νκ² ν©λλ€. CI/CD ν΅ν©, μ€νμμ€ μνκ³, μ½λ 리뷰 λ° μ΄μ κ΄λ¦¬ κΈ°λ₯μ ν΅ν΄ κ°λ° μν¬νλ‘μ°λ₯Ό μ΅μ ννκ³ μμ΅λλ€.
Figmaλ μ€μκ° νμ κ³Ό λμμΈ μμ€ν κ΄λ¦¬λ₯Ό μ§μνλ κ°λ ₯ν UI/UX λꡬμ λλ€. ν΄λΌμ°λ κΈ°λ°μΌλ‘ μΈμ μ΄λμλ μ κ·Όμ΄ κ°λ₯νλ©°, λμμ΄λμ κ°λ°μ κ° μνν νμ μ λμ λμμΈ νλ‘μΈμ€λ₯Ό μ΅μ νν©λλ€.
Excalidrawλ μμΌλ‘ κ·Έλ¦° λ―ν μ§κ΄μ μΈ λ€μ΄μ΄κ·Έλ¨ μμ± λꡬλ‘, μ€μκ° νμ κΈ°λ₯μ ν΅ν΄ μμ΄λμ΄λ₯Ό λΉ λ₯΄κ² μκ°ννκ³ κ³΅μ ν μ μμ΅λλ€. μ€νμμ€μ΄κΈ° λλ¬Έμ μμ λ‘κ² μ¬μ©νκ³ νμ₯ν μ μμ΅λλ€.
TypeScriptλ νμ μ§μ μΌλ‘ μΈν΄ μ½λμ μμ μ±μ λμ¬μ£Όκ³ , λ°νμ μ€λ₯λ₯Ό μ€μ¬μ€λλ€. μλμμ± κΈ°λ₯κ³Ό νμ κΈ°λ° κ²μ¦ λλΆμ νμ μ κ°λ° μμ°μ±μ ν¬κ² ν₯μμν΅λλ€. μ½λμ μμ μ±κ³Ό μ μ§λ³΄μμ± μΈ‘λ©΄μμ TypeScriptλ₯Ό μ ννμ΅λλ€.
Vercelμ λΉ λ₯΄κ³ κ°νΈν λ°°ν¬λ₯Ό μ§μνλ©°, μλ²λ¦¬μ€ νκ²½μμ μλμΌλ‘ μ€μΌμΌλ§λμ΄ μ±λ₯μ΄ μ°μν©λλ€. Next.jsμμ μλ²½ν ν΅ν©μ ν΅ν΄ μ΅μ μΉ μ ν리μΌμ΄μ μ μμ½κ² κ°λ°, λ°°ν¬, μ΅μ νν μ μμ΄ κ°λ°μ κ²½νμ κ·Ήλνν©λλ€.
ββ public
β ββ assets
β β ββ gif
β β ββ header
β β ββ mypage
β β ββ arrowsmall.svg
β β ββ back.svg
β β ββ blank.svg
β β ββ cardarrow.svg
β β ββ delete.svg
β β ββ down.svg
β β ββ toastcancel.svg
β β ββ toastcheck.svg
β β ββ top.svg
β ββ Calender
β ββ Chat
β ββ Common
β ββ Detail
β ββ Favicon
β ββ logos
β ββ Main
β ββ MyPage
β ββ Post
ββ src
β ββ app
β β ββ (auth)
β β ββ (mainpage)
β β ββ api
β β ββ eventsdetail
β β ββ maindetail
β β ββ mypage
β β ββ post
β β ββ favicon.ico
β β ββ globals.css
β β ββ layout.tsx
β β ββ not-found.tsx
β β ββ page.tsx
β ββ assets
β β ββ loadingBar.json
β β ββ loadingSpinner.json
β ββ components
β β ββ Common
β β ββ EventsDetail
β β ββ Layout
β β ββ Login
β β ββ MainDetail
β β ββ MainPage
β β ββ MyPage
β β ββ Post
β β ββ Signup
β ββ fonts
β ββ hooks
β ββ lib
β ββ provider
β ββ store
β ββ types
β ββ utils
β ββ middleware.ts
β ββ supabase
β ββ .env.local
β ββ .eslintrc.json
β ββ .gitignore
β ββ .nvmrc
β ββ .prettierrc
β ββ next-env.d.ts
β ββ next.config.mjs
β ββ package-lock.json
β ββ package.json
β ββ postcss.config.mjs
β ββ README.md
β ββ tailwind.config.ts
β ββ tsconfig.json
id
did not match. Server: "react-select-2-live-region" Client: "react-select-3-live-region"
κΈ°μ‘΄μ νλ‘μ°λ μμ λ‘κ·ΈμΈ μ΄νμ signupνμ΄μ§λ‘ μ΄λνκ³ signupFormμμμ λ°μ μ 보λ₯Ό λ°μμ νλ‘ν μ μ₯μ ν΄μΌμ§λ§ Usersν μ΄λΈλ‘ μ λ³΄κ° μ μ₯λκ³ λ©μΈνμ΄μ§λ‘ λμ΄κ°μλΆν° μ μ μ μ¬μ΄νΈ νλμ΄ κ°λ₯ν΄μ§λ λ°©μμ΄μλ€.
const ItEventCardLong: NextPage<EventsCardProps> = ({ post }) => {
const deadlineDate = new Date(post.date_done);
const daysLeft = Math.ceil(
(deadlineDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24)
);
const displayDaysLeft = daysLeft === 0 ? "D-day" : `D-${daysLeft}`;
return (
<ul className="flex items-center">
<li>
<span className="label-secondary rounded-full text-baseS px-3 py-1.5 mr-1">
{displayDaysLeft}
</span>
</li>
<li className="text-baseS text-labelNormal ml-2">
<time dateTime="YYYY-MM-DD">
{dayjs(post.date_start).format("YYYY-MM-DD")}
</time>
</li>
</ul>
);
};
const ItEventCardShort: NextPage<EventsCardProps> = ({ post }) => {
const { user: currentUser } = useUser();
const [isClient, setIsClient] = useState<boolean>(false);
const today = dayjs();
const deadlineDate = dayjs(post.date_done);
// const daysLeft = Math.ceil((deadlineDate.unix() - now.unix()) / (1000 * 60 * 60 * 24));
const daysLeft = today.diff(deadlineDate, "d", true);
const displayDaysLeft =
daysLeft === 0 ? "D-day" : daysLeft < 0 ? `D${daysLeft.toFixed(0)}` : `D+${Math.ceil(daysLeft)}`;
useEffect(() => {
setIsClient(true);
return () => {
setIsClient(false);
};
}, []);
return (
{isClient ? (
<ul className="flex justify-between items-center">
<li>
<span className="label-secondary rounded-full text-baseS px-3 py-1.5">{displayDaysLeft}</span>
</li>
<li>
<time dateTime={post.date_done} className="text-baseS text-labelNormal">
{dayjs(post.date_done).format("YYYY-MM-DD")}
</time>
</li>
<LikeButton eventId={post.event_id} currentUser={currentUser} />
</ul>
) : null})
}
Date.now()
κ°μ μ¬μ©νλ λΆλΆμ΄ μ»΄ν¬λνΈκ° λ§μ΄νΈλ νμ λ λλ§λλλ‘ useEffect()λ₯Ό μ¬μ©νμ¬, μ»΄ν¬λνΈκ° μ μμ μΌλ‘ λ§μ΄νΈλ μ΄νμ λ μ§κ° λ λλ§λλλ‘ κ΅¬ννμ΅λλ€.