๋ฐฐํฌ ๋งํฌ: https://holo-psi.vercel.app/
| ์ฐ์ง์ | ๊น๋ฏผ์ง | ์ต๊ฐ๊ฑด | ์ ์์ฉ | ์ ์ํ |
|---|---|---|---|---|
| @zi0w | @minji7901 | @Choi-kanggun | @tkddyd0817 | @gracejelly125 |
1๏ธโฃ ๋ก๊ทธ์ธ, ํ์๊ฐ์ , ๋ง์ดํ์ด์ง
-
๐ ํผ ๊ด๋ฆฌ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ
- react-hook-form๊ณผ zod๋ฅผ ํ์ฉํ ํผ ๊ด๋ฆฌ
- ์ค์๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ ๊ธฐ๋ฐ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ ์ ๊ณต
- ์ปค์คํ ์๋ฌ ๋ฉ์ธ์ง ์ ๊ณต์ ํตํ ์ฌ์ฉ์ ์นํ์ UI ๊ตฌํ
- ๋น๋ฐ๋ฒํธ ๊ท์น, ์ด๋ฉ์ผ ํ์, ๋๋ค์ ์ ํ ๋ฑ ์์ธ ๊ฒ์ฆ
-
๐ฅ ์์ ๋ก๊ทธ์ธ (Google, Kakao, Github)
- OAuth 2.0 ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๊ฐํธํ ์ฌ์ฉ์ ์ธ์ฆ ์ ๊ณต
- ๊ฐ ํ๋ซํผ์์ ์ ๊ณตํ๋ OAuth Provider๋ฅผ ํตํด ๋ก๊ทธ์ธ/ํ์๊ฐ์ ์ง์
-
๐ป ์ฌ์ฉ์ ์ํ ๊ด๋ฆฌ (Zustand)
- Zustand๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ญ ์ํ๋ก ์ฌ์ฉ์ ์ ๋ณด ๋ฐ ์ธ์ฆ ์ํ ๊ด๋ฆฌ
- ๋ก๊ทธ์ธ ์ํ( isLogin )์ ์ฌ์ฉ์ ์ ๋ณด( user )๋ฅผ ์ ์ญ์ผ๋ก ์ ์ง
-
๐ ๋ก๊ทธ์์ ๊ธฐ๋ฅ
- ์๋ฒ ์ก์ ์ ํตํ ๋ก๊ทธ์์ ์ฒ๋ฆฌ
- supabase.auth.signOut()์ ํตํด ์ธ์ฆ ์ธ์ ์ ํด์ ํ๊ณ , ๋ก๊ทธ์์ ๊ธฐ๋ฅ ์ ๊ณต
-
โ๏ธ ํ์ ํํด ๊ธฐ๋ฅ
- Supabase์ Admin API๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ์ฌ์ฉ์ ๊ณ์ ์ญ์
- SERVICE_ROLE_KEY ๋ฅผ ํ์ฉํ์ฌ ์๋ฒ ํ๊ฒฝ์์๋ง ์คํ๋๋๋ก ์ค์
-
โ๏ธ ์ ๊ทผ ์ ์ด (Next.js Middleware)
- ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ฅธ ํ์ด์ง ์ ๊ทผ ์ ์ด
-
๐ค ๋ง์ดํ์ด์ง (React Query)
- React Query๋ฅผ ํ์ฉํ ์ํ๊ด๋ฆฌ์ ๋๊ด์ ์ ๋ฐ์ดํธ๋ก ์ฌ์ฉ์ ๊ฒฝํ ์ต์ ํ
- ํ์ด์ง๋ค์ด์ ์ ์ฉ์ผ๋ก ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๋ ๋๋ง ๊ตฌํ
- ๋ชจ๋ฌ ๊ธฐ๋ฐ์ ํ๋กํ ์์ ์์คํ (์ด๋ฏธ์ง, ๋๋ค์, ๋น๋ฐ๋ฒํธ ๊ฐ๋ณ ์์ ๊ฐ๋ฅ)
- ์ ๋ ฅ๊ฐ ์์ ์ ๊ธฐ์กด ๋ฐ์ดํฐ ์ ์ง ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉ์ ํธ์์ฑ ํฅ์
- ์ข์์, ๋๊ธ, ์์ฑ๊ธ ์ค์๊ฐ ์ํ ๋๊ธฐํ ๋ฐ ๋ฆฌ์คํธ ์ ๋ฐ์ดํธ ๊ตฌํ
-
๐จ ์ค์ผ๋ ํค UI
- ์ค์ผ๋ ํค UI๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ UX ํธ์์ฑ ํฅ์ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ ์ต์ ํ
2๏ธโฃ ์ค๋์ ๋ฉ๋ด ์ถ์ฒ, ์ค๋์ ์ด์ธ ํ์ด์ง
-
๐ ์ค๋์ ๋ฉ๋ด ์ถ์ฒ
- Funnel ํจํด์ ์ฌ์ฉํด ์ฌ์ฉ์๊ฐ 4๊ฐ์ ์ง๋ฌธ์ ์๋ตํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ ์ ์๋๋ก ๊ตฌํ
- ์ด์ ๋จ๊ณ๋ก ๋์๊ฐ๋ ์ ๋ ฅํ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๋๋ก ์ฒ๋ฆฌ
- OpneAI API๋ฅผ ํตํด ์ฌ์ฉ์ ์๋ต ๊ธฐ๋ฐ ์ค๋์ ์ถ์ฒ ๋ฉ๋ด ์ ๊ณต
- ํ๋ก๊ทธ๋ ์ค๋ฐ๋ฅผ ํตํด ํ์ฌ ์งํ ๋จ๊ณ ์๊ฐ์ ์ผ๋ก ํ์
- Funnel ํจํด์ ์ฌ์ฉํด ์ฌ์ฉ์๊ฐ 4๊ฐ์ ์ง๋ฌธ์ ์๋ตํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ ์ ์๋๋ก ๊ตฌํ
-
๐ ์ค๋์ ์ด์ธ
- OpenAI API๋ฅผ ํตํด ์ค๋์ ์ด์ธ ์ ๊ณต
- ์ฌ์ฉ์๊ฐ ์ง๊ด์ ์ผ๋ก ์ ํํ ์ ์๋๋ก ํฌ์ถ์ฟ ํค UI ์ ๊ณต
- framer-motion ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ํฌ์ถ์ฟ ํค ํด๋ฆญ ์ ์ ๋๋ฉ์ด์ ํจ๊ณผ ์ ๊ณต
-
๐ฅ ์ถ์ฒ ๊ฒฐ๊ณผ ์ ์ฅ
- toPng, file-saver ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๊ฒฐ๊ณผ ํ์ด์ง๋ฅผ PNG ํ์์ผ๋ก ๋ค์ด๋ก๋ ๊ฐ๋ฅ
-
๐ ์ถ์ฒ ๊ฒฐ๊ณผ ๊ณต์
- Route Handler๋ฅผ ํตํด ์ถ์ฒ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ Map ๊ฐ์ฒด(์์ ์ ์ฅ์)์ ์ ์ฅ ํ, UUID๋ฅผ ๋ฐํํด ๋งํฌ๋ฅผ ๋จ์ถ
- ๋ฐํ๋ UUID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณต์ ํ์ด์ง์ URL ์์ฑ(+ ์ค๋์ ๋ฉ๋ด ์ถ์ฒ์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๋ฉ๋ด ํ์
ํฌํจ)
- navigator.clipboard๋ฅผ ์ฌ์ฉํด ๋ฒํผ ํด๋ฆญ ์ URL์ด ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ๋๋๋ก ๊ตฌํ
- ํด๋น URL์ ์ ์ํ๋ฉด GET ์์ฒญ์ ํตํด ์ถ์ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ ํ์ด์ง์ ํ์
- Kakao SDK for JavaScript๋ฅผ ํ์ฉํ feed ํ์์ ์นด์นด์คํก ๊ณต์ ๊ธฐ๋ฅ ์ ๊ณต
3๏ธโฃ ์ฐ๋ฆฌ๋๋ค ์ฐ๋ ๊ธฐ ์ ๋ณด, ์ฒญ๋ ์ ์ฑ ํ์ด์ง
-
๐ ์ง์ญ๋ณ ์ฐ๋ ๊ธฐ ๋ฐฐ์ถ ์์ผ ์กฐํ
- OpenAI API๋ฅผ ํ์ฉํ ์ง์ญ๋ณ ์ฐ๋ ๊ธฐ ๋ฐฐ์ถ ์ผ์ ์ ๋ณด ์ ๊ณต
- ๋ด ์์น ๋ถ๋ฌ์ค๊ธฐ ๊ธฐ๋ฅ์ ํตํ ํ์ฌ ์์น ๊ธฐ๋ฐ ์ ๋ณด ์กฐํ
- ์/๊ตฐ/๊ตฌ/๋ ๋จ์์ ์ฃผ์ ๊ฒ์ ์์คํ ๊ตฌํ
- ์ฌํ์ฉ, ์ผ๋ฐ, ๋ํ, ์์๋ฌผ ์ฐ๋ ๊ธฐ ๋ฑ ์ข ๋ฅ๋ณ ๋ฐฐ์ถ ์์ผ ์๋ด
-
๐ฅ ์์๋ฌผ ์ฐ๋ ๊ธฐ ๋ถ๋ฅ ํ์ธ
- OpenAI API๋ฅผ ํ์ฉํ ์์๋ฌผ ์ฐ๋ ๊ธฐ ํ๋ณ ์์คํ ๊ตฌํ
- ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ ๋ํ ์ค์๊ฐ AI ๊ธฐ๋ฐ ๋ถ๋ฅ ์ฒ๋ฆฌ
- ์๊ฐ์ ํผ๋๋ฐฑ์ ํตํ ์ง๊ด์ ์ธ ๊ฒฐ๊ณผ ํ์ (FoodYesIcon/FoodNoIcon)
-
๐ ์ ์ฑ ๊ฒ์ ์์คํ
- ๊ณต๊ณต๋ฐ์ดํฐํฌํธ ์ฒญ๋ ์ ์ฑ API ์ฐ๋์ ํตํ ์ค์๊ฐ ์ ์ฑ ์ ๋ณด ์ ๊ณต
- xml2js๋ฅผ ์ฌ์ฉํ์ฌ XML ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ํ์ฑํ์ฌ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ตฌํ
- ์ง์ญ๋ณ, ๋ถ์ผ๋ณ ํํฐ๋ง ๊ธฐ๋ฅ์ผ๋ก ๋ง์ถคํ ์ ์ฑ ๊ฒ์ ์ง์
-
๐ ์ ์ฑ ๋ชฉ๋ก ๋ฐ ํ์ด์ง๋ค์ด์
- React Query๋ฅผ ํ์ฉํ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์บ์ฑ ๋ฐ ์ํ ๊ด๋ฆฌ
- ์ปค์คํ ํ์ด์ง๋ค์ด์ ํ ์ ํตํ ๋๋์ ์ ์ฑ ๋ฐ์ดํฐ ํจ์จ์ ํ์
- ๋์ ๋ผ์ฐํ ์ ํตํ ์ ์ฑ ์์ธ ํ์ด์ง ๊ตฌํ
-
๐ ์ ์ฑ ์์ธ ์ ๋ณด ํ์
- Next.js ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๊ตฌํ
- ์ ์ฑ ๋ณ ์์ธ ์ ๋ณด ํฌ๋งทํ ๋ฐ ๋ ์ด์์ ์ต์ ํ
- ์ ์ฒญ ์ฌ์ดํธ ๋ฐ ์ฐธ๊ณ ์ฌ์ดํธ ๋งํฌ ์ ๊ณต
4๏ธโฃ ๊ฟํ ๊ฒ์ํ ํ์ด์ง
-
๐ ๊ฒ์๊ธ ๊ด๋ฆฌ
- Supabase๋ฅผ ํ์ฉํ ๊ฒ์๊ธ CRUD ๊ธฐ๋ฅ ์ ๊ณต
- Day.js๋ก ์์ฑ ์ผ์๋ฅผ ์ง๊ด์ ์ผ๋ก ํ์
- ํค์๋ ๊ฒ์์ ํตํด ์ํ๋ ๊ฒ์๊ธ์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ ๊ธฐ๋ฅ ์ ๊ณต
- ์นดํ ๊ณ ๋ฆฌ ํํฐ๋ง์ ์ง์ํ์ฌ ์ํ๋ ์ฃผ์ ์ ๊ฒ์๊ธ๋ง ์กฐํ ๊ฐ๋ฅ
- ์ต์ ์/์ธ๊ธฐ์ ์ ๋ ฌ ๊ธฐ๋ฅ์ผ๋ก ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ฒ์๊ธ ์ ๋ ฌ
- ์๋ฒ์ก์ ์ ํ์ฉํ์ฌ ๊ฒ์๊ธ ์์ ์ ์ค์๊ฐ ์ ๋ฐ์ดํธ ์ ์ฉ
- ํ์ด์ง๋ค์ด์ ์ ์ฉ์ผ๋ก ์ฌ์ฉ์ ํธ์์ฑ ํฅ์
-
๐งก ์ข์์/๋๊ธ ๊ธฐ๋ฅ
- Supabase๋ฅผ ํ์ฉํ ์ข์์/๋๊ธ CRUD ๊ธฐ๋ฅ ์ ๊ณต
- TanStack Query๋ฅผ ํ์ฉํ์ฌ ์ ์ญ ์ํ๋ก ์ข์์ ๋ฐ ๋๊ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ
- ๋๊ด์ ์ ๋ฐ์ดํธ ์ ์ฉ์ผ๋ก ์ฌ์ฉ์ ์ก์ ์ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ ์ ๊ณต
- ๊ฒ์๊ธ๋ณ ์ข์์ ๋ฐ ๋๊ธ ์ ํ์๋ก ์ฌ์ฉ์ ์ฐธ์ฌ๋ ํ์ธ ๊ฐ๋ฅ
- ๋๊ธ ์์ฑ์ ๋ฑ์ง ์ถ๊ฐ๋ก ํด๋น ๊ฒ์๊ธ ์์ฑ์๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถ
5๏ธโฃ ์ฐ๋ฆฌ๋๋ค ํซํ ํ์ด์ง
-
๐บ๏ธ ์ง๋ ํ์
- Kakao Map API๋ฅผ ํ์ฉํ์ฌ ์ง๋๋ฅผ ์ ๊ณต
-
๐ ๋ด ์์น ํ์
- Geolocation API๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ํ์ฌ ์์น๋ฅผ ์ง๋์ ํ์
-
๐ ์ง๋ ์กฐ์ ๊ธฐ๋ฅ
- ์ง๋ ํ๋/์ถ์ ๋ฐ ํ์ฌ ์์น๋ก ์ด๋ํ ์ ์๋ ์ปจํธ๋กค ๋ฒํผ ์ ๊ณต
-
๐ข ์นดํ ๊ณ ๋ฆฌ๋ณ ์ฅ์ ๊ฒ์
- ์์์ , ํธ์์ , ์ฝ๊ตญ ๋ฑ ๋ค์ํ ์นดํ ๊ณ ๋ฆฌ ๋ฒํผ ์ ๊ณต
- ํน์ ์นดํ ๊ณ ๋ฆฌ ์ ํ ์, ์ฃผ๋ณ ํด๋น ์์ค ๊ฒ์ ํ ์ง๋์ ๋ง์ปค์ ๋ฆฌ์คํธ๋ก ํ์
-
๐ ๋ง์ปค ๋ฐ ์ฅ์ ์ ๋ณด
- ๊ฒ์๋ ์ฅ์๋ฅผ ์ง๋ ๋ง์ปค๋ก ํ์
- ๋ง์ปค ํด๋ฆญ ์, ํด๋น ์ฅ์์ ์์ธ ์ ๋ณด ์ ๊ณต
แแ กแแ ตแแ ฆแแ ตแแ ต แแ ฉแแแ กแแ ญ, แแ ขแบแแ ณแฏ, แแ ขแแ ก แแ ณแซ แแ ณแฏ แแ ฉแจแ แ ฉแจ แแ ตแพ แแ กแจแแ ฆ
2024.12.31 ~ 2025.02.04
๐ฆsrc
โฃ ๐app
โ โฃ ๐api # API ์์ฒญ ๊ด๋ จ ๋ก์ง
โ โฃ ๐recommend # ์ค๋์ ๋ฉ๋ด ์ถ์ฒ ํ์ด์ง (๋๋จธ์ง ํ์ด์ง๋ค๋ ํด๋ ๊ตฌ์กฐ ๋์ผ)
โ โ โฃ ๐_actions # recommend์์ ์ฌ์ฉ๋๋ ์๋ฒ ์ก์
โ โ โฃ ๐_components # recommend์์ ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ
โ โ โฃ ๐_constants # recommend์์ ์ฌ์ฉ๋๋ ์์
โ โ โฃ ๐_hooks # recommend์์ ์ฌ์ฉ๋๋ ํ
โ โ โฃ ๐_layout # recommend์์ ์ฌ์ฉ๋๋ ๋ ์ด์์
โ โ โฃ ๐_types # recommend์์ ์ฌ์ฉ๋๋ ํ์
โ โ โฃ ๐_utils # recommend์์ ์ฌ์ฉ๋๋ ์ ํธ ํจ์
โ โ โฃ ๐error.tsx
โ โ โ ๐page.tsx
โ โฃ ๐fortune # ์ค๋์ ์ด์ธ ํ์ด์ง
โ โฃ ๐honeytips # ๊ฟํ ๊ฒ์ํ ํ์ด์ง
โ โฃ ๐map # ๋๋ค ํซํ ํ์ด์ง
โ โฃ ๐mypage # ๋ง์ดํ์ด์ง
โ โฃ ๐policy # ์ฒญ๋
์ ์ฑ
ํ์ด์ง
โ โฃ ๐trash-guide # ์ฐ๋ ๊ธฐ ๊ฐ์ด๋ ํ์ด์ง
โ โฃ ๐sign-in # ๋ก๊ทธ์ธ ํ์ด์ง
โ โฃ ๐sign-up # ํ์๊ฐ์
ํ์ด์ง
โ โฃ ๐global-error.tsx
โ โฃ ๐globals.css
โ โฃ ๐layout.tsx
โ โฃ ๐not-found.tsx
โ โ ๐page.tsx
โฃ ๐assets
โ โฃ ๐fonts
โ โ ๐images
โฃ ๐components # ๊ณตํต ์ปดํฌ๋ํธ
โฃ ๐lib # ๊ณตํต type, util ํจ์
โฃ ๐store # zustand ์คํ ์ด
โฃ ๐.eslintrc.json # ESLint ์ค์ ํ์ผ
โฃ ๐.prettierrc # Prettier ์ฝ๋ ํฌ๋งทํ
์ค์
โฃ ๐next.config.mjs # Next.js ์ค์ ํ์ผ
โฃ ๐pull_request_template # Pull request ํ
ํ๋ฆฟ
โ ๐tailwind.config.ts # TailwindCSS ์ค์ ํ์ผ











