- Look My Dog / ๋ฃฉ๋ง๋ (2023.05.20 ~ 2023. 7.10)
- https://lookmydog.vercel.app/
- Vercel
- https://www.flaticon.com/search?word=puppy
- React Icons
- NextJS 13
- Nextjs Auth
- TypeScript
- Prisma Client
- mongoDB
- Storybook
- Zustand
- Tailwind.css
- axios
- react-hook-from
- react-hot-toatst
- query-string
- react-select
- react-spinners
- zod
- swiper slide
- lottie json
- React-hook-form ๋ผ์ด๋ธ๋ฌ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ http ํต์
- ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ Prisma Client๋ฅผ ์ด์ฉํด ํด๋ผ์ด์ธํธ์์ fetch API ๊ฐ ์๋ ์๋ฒ์ ํจ๊ป ๋ฐ๋ก ํต์
- Next Auth ๋ก SNS Login ๊ตฌํ. (๊ตฌ๊ธ,๊นํ๋ธ,๋ค์ด๋ฒ)
- Query-string ์ ์ด์ฉํด url ํ๋ผ๋ฏธํฐ ์ปจํธ๋กค
- React hot toast๋ก http ํต์ ์ success , fail(reject) ํด๋ผ์ด์ธํธ์๊ฒ ํ์
๊ธฐ์กด ๋ฆฌ์กํธ์ฒ๋ผ ๋นhtml ํ๊ทธ์ ๋ฐ์ดํฐ๋ฅผ fetch ํด์์ ์ฐ๋ ๋ฐฉ์์ด ์๋ ,Prisma Client๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ํต์ ํ๊ธฐ๋๋ฌธ์ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ๊ตฌํ ํ ์ ์๊ณ , ํด๋ผ์ด์ธํธ์ฌ์ด๋๋ ๋๋ง์ ๋จ์ ์ธ SEO๋ , ์ด๊ธฐ ๋ก๋ฉ์๋๋ฅผ ๊ฐ์ ํ ์ ์์.
ex: page.tsx -> ListClient.tsx . ์๋ฒ์ปดํฌ๋ํธ์์ ์๋ฒ์์ฌ์ด๋๋ ๋๋ง ํ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ props๋ก ์ ๋ฌ
/mypost
/favorite
/listing/[$listingId]
/edit/[$listingId]
/lost
- CREATE ์ข์์ ๊ธฐ๋ฅ ๊ฒ์๊ธ ํฌ์คํธ
- READ ์ ์ ๋ณธ์ธ์ด ๋ฑ๋กํ ๊ฒ์๊ธ /mypost ์ ์ ๊ฐ ์ข์์ ๋ฒํผ์ ๋๋ฅธ ๊ฒ์๊ธ /favorite ์ ๊ธฐ๊ฒฌ ๊ฐ์์ง ๋ณด๊ธฐ /lost
- DELETE ์ ์ ๋ณธ์ธ์ด ๋ฑ๋กํ ๊ฒ์๊ธ /mypost -> DELETE ์ ์ ๋ณธ์ธ์ด "์ข์์" ๊ฒ์๊ธ -> ์ข์์ ์ทจ์ -> DELETE
- UPDATE (edit) ์ ์ ๋ณธ์ธ์ด ๋ฑ๋กํ ๊ฒ์๊ธ ์์ /mypost -> UPDATE
* action:
1.์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ํ๊ธฐ์ํ ํด๋ Prisma Client๋ก ์๋ฒ์ ๋ค์ด๋ ํธ๋ก ํต์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์ด
2.๋ฐ์ดํฐ๋ฅผ ๋ ๋๋ง ํ pageํ์ผ์ action์ ์ ์ธ ํด๋์ ๋ฐ์ดํฐ ์์ฒญ์ ๊ฐ๊ณ ์์ ํ์ ์ปดํฌ๋ํธ(ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ)๋ก ์ ๋ฌ
์๋ฒ์ฌ์ด๋๋ ๋๋ง๊ณผ ํด๋ผ์ด์ธํธ์ฌ์ด๋ (hydrate)๋ ๋๋ง์ ์ํด.
* getDoglisting
- qs ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ url ํ๋ผ๋ฏธํฐ์ ์๋ฌด๋ฐ ๊ฐ์ด ์์ผ๋ฉด ์ ์ฒด ๋ฆฌ์คํธ ๋ฐํ , query์ ํ๋ผ๋ฏธํฐ๊ฐ ๋ด๊ฒจ์๋ค๋ฉด ๊ฐ์ด ์ผ์นํ ๋ฆฌ์คํธ ๋ ๋๋ง
Prisma query:findMany({query})
const getDogList = await prisma.dogListing.findMany({
where: query,
orderBy: {
createdAt: 'desc'
}
})
* getListBtId
-์๋ฒ ์ปดํฌ๋ํธ์ parmas๊ฐ์ ์ธ์๋ก ๋ฃ์ด์ ํ๊ฐ์ ๋ฆฌ์คํธ ๋ ๋๋ง
Prisma query: findUnique()
where:{
id:listingId
},
include:{
user:true,
}
* getFavoite
-user์ ๊ฐ์ ๊ฐ๊ณ ์์ favoriteIds๊ฐ ์กด์ฌํ๋คํ๋ฉด favoriteIds์ ๋ฆฌ์คํธ ๋ ๋๋ง
Prisma query: findMany()
where: {
id: {
in: [
...(currentUser.favoriteIds || [])
]
}
}
* getLoggedInUser
-getSession() ์ผ๋ก user.email ๊ฐ ๋ด๊ฒจ์๋์ง ์ฒดํฌ
Prisma query: findUnique()
where: {
email: session.user.email as string
}
* getLostDogListing
-์ธ๋ถ ๊ณต๊ณต๋ฐ์ดํฐ API HTTP GETํธ์ถ
axios.get(process.env.LOST_DOG_API_URL)
* API:
http api ๋ค์ ์ ์ธํด๋์. ์ฌ๊ธฐ์ ๋ํ prisma client๋ฅผ ์ด์ฉํด์ Resopnse๋ฅผ ์ ๊ณตํด์ค.
-* auth:
Nextjs์ login auth ๊ด๋ฆฌ . provider์์ sns ๋ก๊ทธ์ธ ๊ด๋ฆฌ.
* hooks:
Zustand๋ฅผ ์ด์ฉํด Modal์ ์ํ๊ด๋ฆฌ (on , off , action on/off)๋ฅผ ๊ด๋ฆฌํจ.
* Components:
DogListCard
Modal
Input
Button
Validation
* Sever component , Client component ๊ตฌ๋ถ
* ๋์ ๋ผ์ฐํ
listing/[listingId]
* ์๋ฒ์ปดํฌ๋ํธ์ default props๋ก params์ ๊ฐ์ ๊ฐ๊ณ ์ฌ ์์์.
- ๊ฐ์์ง ์ฌ์ง ์ ๋ก๋ 2์ฅ ์ด์
- ๋๊ธ๊ธฐ๋ฅ
- ์ข์์ ๊ฐฏ์ ํ์