** ๋์ ์ปดํฌ๋ํธ ๋ก๋ฉ์ ํ ์ ์๊ฒ ํด์ฃผ๋ ์ญํ -> ์ปดํฌ๋ํธ๋ฅผ ๋์ค์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ถ๋ฌ์์ ์ฑ๋ฅ ์ต์ ํ -> ์ด๊ธฐ ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ์ค์ด๊ธฐ ์ํด -> ์ธ์ฆ ์ํ์ ๋ฐ๋ผ ์กฐ๊ฑด์ ์ผ๋ก ๋ณด์ฌ์ค์ผ ํ๋ ui์ ์์ฃผ ์ฌ์ฉ
** ๋ฅ์คํธ ์ฑ์ ์ํ ์์ ํ ์ธ์ฆ ์๋ฅ์ -> OAuth, ์ด๋ฉ์ผ, ์์ฒด, JWT์ธ์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์ , ์๋ฒ๋ฆฌ์ค ์นํ์ (API ๋ผ์ฐํธ ๊ธฐ๋ฐ์ผ๋ก ๋์) /auth/[...nextauth]/route.ts -> ์ธ์ฆ ๋ผ์ฐํธ ์๋ํฌ์ธํธ๋ก ๋์
** ์ธ์ ์ ์ฅ๋ฐฉ์ -> ์๋ฒ์ ์ฅ์์ด ์ฟ ํค์ ์ ๋ณด ํฌํจ JWT ๊ธฐ๋ฐ ์ธ์ , DB ์ฐ๊ฒฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์ ๋ฐฉ์๋ ๊ฐ๋ฅ
** ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ํ์ธํ๋ ํ
** JSX ๋ฌธ๋ฒ์ ์ฌ์ฉ ์ฌ๋ถ์ ์์
** ์ฌ์ฉ์๊ฐ ๊ฒ์์ฐฝ์ ์ ๋ ฅํ ๋๋ง๋ค ๋ฐ๋ก APIํธ์ถํ๋ฉด, ๋๋ฌด ๋ง์ ์์ฒญ ์๊ฒจ ์๋ฒ ๋ถ๋ด/ ์ง์ฐํด์ ์ค์ ๊ฒ์์ด API ์์ฒญ ๋ฐ์
- Next.js 14 - React ๊ธฐ๋ฐ ํ์คํ ํ๋ ์์ํฌ
- TypeScript - ํ์ ์์ ์ฑ์ ์ํ ์ ์ ํ์ ์ธ์ด
- Tailwind CSS - ์ ํธ๋ฆฌํฐ ํผ์คํธ CSS ํ๋ ์์ํฌ
- React Hooks - ์ํ ๊ด๋ฆฌ ๋ฐ ์ฌ์ด๋ ์ดํํธ ์ฒ๋ฆฌ
- Next.js API Routes - ์๋ฒ๋ฆฌ์ค API ์๋ํฌ์ธํธ
- Spotify Web API - ์์ ๋ฐ์ดํฐ ๋ฐ ์ํฐ์คํธ ์ ๋ณด
- Prisma - ๋ฐ์ดํฐ๋ฒ ์ด์ค ORM
- SQLite - ๊ฐ๋ฐ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- NextAuth.js - OAuth ์ธ์ฆ ์์คํ (Google ๋ก๊ทธ์ธ)
- JWT - JSON Web Token ๊ธฐ๋ฐ ์ธ์ ๊ด๋ฆฌ
- Prisma Schema - ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๊ด๋ฆฌ
- Vercel - ์๋ฒ๋ฆฌ์ค ๋ฐฐํฌ ํ๋ซํผ
- GitHub - ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ํ์
- Environment Variables - ๋ณด์์ ์ํ ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ
- ์ค์๊ฐ ๊ฒ์: Debounced ๊ฒ์์ผ๋ก API ํธ์ถ ์ต์ ํ
- ์ํฐ์คํธ ์ ๋ณด: Spotify API๋ฅผ ํตํ ์์ธ ์ํฐ์คํธ ์ ๋ณด
- ์ฆ๊ฒจ์ฐพ๊ธฐ: ๋๋๊ทธ ์ค ๋๋กญ์ผ๋ก ์ํฐ์คํธ ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ด๋ฆฌ
- ์จ๋ฒ ์์ธ: ์ํฐ์คํธ๋ณ ์ต์ ์จ๋ฒ ์ ๋ณด ํ์
- ํธ๋ ๋ชฉ๋ก: ์จ๋ฒ์ ๋ชจ๋ ํธ๋ ์ ๋ณด ๋ฐ ์ฌ์ ์๊ฐ
- Spotify ์ฐ๋: ์ง์ Spotify์์ ์ฌ์ ๊ฐ๋ฅํ ๋งํฌ
- Google OAuth: ์์ ํ ์์ ๋ก๊ทธ์ธ
- ์ธ์ ๊ด๋ฆฌ: JWT ๊ธฐ๋ฐ ์ฌ์ฉ์ ์ธ์ ์ ์ง
- ๊ฐ์ธํ: ์ฌ์ฉ์๋ณ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ํฐ์คํธ ๊ด๋ฆฌ
- ์ฌ์ด๋ฒํํฌ ํ ๋ง: ๋ฏธ๋์งํฅ์ ์ธ ๋์์ธ
- ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ ๋๋ฐ์ด์ค์์ ์ต์ ํ๋ ๊ฒฝํ
- ์ค์ผ๋ ํค UI: ๋ก๋ฉ ์ค ์ฌ์ฉ์ ๊ฒฝํ ํฅ์
- ์ปค์คํ ์คํฌ๋กค๋ฐ: ๋์์ธ๊ณผ ์กฐํ๋ก์ด ์คํฌ๋กค ์ธํฐํ์ด์ค
- ๋์ ์ํฌํธ: Next.js dynamic import๋ก ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํ
- ์ด๋ฏธ์ง ์ต์ ํ: Next.js Image ์ปดํฌ๋ํธ๋ก ์ด๋ฏธ์ง ์ฑ๋ฅ ํฅ์
- API ์ต์ ํ: Rate limiting ๋ฐ ๋ฐฐ์น ์ฒ๋ฆฌ๋ก Spotify API ํจ์จ์ ์ฌ์ฉ
- ๋ฐ์ํ ์น ๋์์ธ - Tailwind CSS๋ก ๋ชจ๋ ํ๋ฉด ํฌ๊ธฐ ์ง์
- ์ค์๊ฐ ๊ฒ์ - Debounced ๊ฒ์์ผ๋ก ์ฌ์ฉ์ ์ ๋ ฅ ์ต์ ํ
- OAuth ์ธ์ฆ - Google ๋ก๊ทธ์ธ ๋ฐ ์ธ์ ๊ด๋ฆฌ
- API ํตํฉ - Spotify Web API ์ฐ๋
- ์ํ ๊ด๋ฆฌ - React Hooks๋ฅผ ํตํ ํจ์จ์ ์ธ ์ํ ๊ด๋ฆฌ
- ๋ก๋ฉ ์ํ - Skeleton UI ๋ฐ ์งํ๋ฅ ํ์
- ์๋ฌ ํธ๋ค๋ง - ์ฌ์ฉ์ ์นํ์ ์ธ ์๋ฌ ๋ฉ์์ง
- ๋๋๊ทธ ์ค ๋๋กญ - ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ด๋ฆฌ
- ์ปค์คํ ์คํฌ๋กค๋ฐ - ๋์์ธ๊ณผ ์กฐํ๋ก์ด ์คํฌ๋กค ์ธํฐํ์ด์ค
- PWA ์ง์ - ์น ์ฑ์ผ๋ก ์ค์น ๊ฐ๋ฅ
- SEO ์ต์ ํ - ๋ฉํ ํ๊ทธ ๋ฐ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ
- ๊ณ ๊ธ ํํฐ๋ง - ์ฅ๋ฅด, ๊ตญ๊ฐ๋ณ ์์ ๋ถ๋ฅ
- ์ถ์ฒ ์์คํ - AI ๊ธฐ๋ฐ ์์ ์ถ์ฒ
- ํ๋ ์ด๋ฆฌ์คํธ ๊ด๋ฆฌ - ์ฌ์ฉ์๋ณ ํ๋ ์ด๋ฆฌ์คํธ ์์ฑ
- ์ค์๊ฐ ์๋ฆผ - ์ข์ํ๋ ์ํฐ์คํธ ์ ๊ณก ์๋ฆผ
- ์์ ๊ธฐ๋ฅ - ์น๊ตฌ์ ์์ ์ทจํฅ ๊ณต์
- ์คํ๋ผ์ธ ์ง์ - Service Worker๋ฅผ ํตํ ์คํ๋ผ์ธ ๊ธฐ๋ฅ
- Next.js 14 App Router ์ฌ์ฉ
- TypeScript๋ก ํ์ ์์ ์ฑ ํ๋ณด
- ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ
- ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค
- ๋น ๋ฅธ ๋ก๋ฉ ์๋
- ์ ๊ทผ์ฑ ๊ณ ๋ ค
- ๋ชจ๋ํ๋ ์ปดํฌ๋ํธ
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ API ์๋ํฌ์ธํธ
- ํ๊ฒฝ ๋ณ์๋ฅผ ํตํ ์ค์ ๊ด๋ฆฌ
if you want to find new song, you can see your favorite artist's album easily and comfortabily. So I consider some functions about such needs.
- artist keyword - It shows artist who release new songs .clicking this button, we provide the information about artist's new album.
- categorized new-released music Information can be categorized by genre, searching and country if user want resources - debounced search
- fetching data by spotify API you can use most of data by spotify API. it provides releated image and information of Album what you pick. resources - spotify api
- Login If you want to this site, you must sign in by your google email. Not only you can enroll your favorite artists, but also see their new-released album. resources - nextAuth, useSession
- Skeleton UI Because of fetching lots of data, you can see empty blocks somtimes. So I consider Conditional Rendering such as Skeleton UI, dynamic import and responsive design.
done: Login, route API, SEO-friendly
to do: Design, favorite function, filtering
์ด ํ๋ก์ ํธ๋ฅผ ์คํํ๋ ค๋ฉด Spotify API ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
- ํ๋ก์ ํธ ๋ฃจํธ์
.env.localํ์ผ ์์ฑ - ๋ค์ ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ:
SPOTIFY_CLIENT_ID=your_spotify_client_id_here
SPOTIFY_CLIENT_SECRET=your_spotify_client_secret_here- Vercel ๋์๋ณด๋์์ ํ๋ก์ ํธ ์ ํ
- Settings > Environment Variables๋ก ์ด๋
- ๋ค์ ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ:
SPOTIFY_CLIENT_ID: Spotify Developer Dashboard์ Client IDSPOTIFY_CLIENT_SECRET: Spotify Developer Dashboard์ Client Secret
- Spotify Developer Dashboard ์ ์
- ์ ์ฑ ์์ฑ ๋๋ ๊ธฐ์กด ์ฑ ์ ํ
- Client ID์ Client Secret ๋ณต์ฌ
- Redirect URIs์
http://localhost:3000/api/auth/callback/spotify์ถ๊ฐ (๋ก์ปฌ ๊ฐ๋ฐ์ฉ)
1. What additional features could I implement to make this project more challenging and improve my skills?
- component libarary, implementubg drag and ddrop ordering to your favirutes , try to figuure out goood patttern for using ssr.
Things you can do to make this project more difficult.
-
Try using component libraries if you haven't already.
-
Try adding Drag and Drop ordering to your favorites pages.
-
Try figure a good pattern for using server side rendered pages - maybe just the main page on first load.
- Are there any security aspects you would recommend me to study more deeply?
- RBAC: Role based access control (Artist vs Listener users) Secrets Manager
https://aws.amazon.com/secrets-manager/
3. What testing strategies would you recommend for this kind of project to ensure code quality and reliability?
- testing,
- unit testing - compoenents make sure contunue to work
- end testing - flowes throught that act
Unit testing: tests your components End to end (or integration) testing: tests your flows through the app
Playwright for end to end: https://playwright.dev/
Start with unit tests. Then try out end to end tests
4. Are there any popular libraries or tools youโd recommend for enhanced security or UX?
ux - i use mantine - compoenet library https://mantine.dev/ https://dndkit.com/
5. How have you approached learning frontend development? Are there any experiences or resources you would recommend?
- gettingn good reading documentation ai for test