Skip to content

part4-team6/Pickly

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

563 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ‘€ Pickly

image

"Pickly"๋Š” ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ์ƒํ’ˆ์„ A/B ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ๋น„๊ตํ•˜๊ณ , ๋ฆฌ๋ทฐ์™€ ๋ณ„์ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ์ ์˜ ์„ ํƒ์„ ๋„์™€์ฃผ๋Š” ์ƒํ’ˆ ํ๋ ˆ์ด์…˜ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.


๐Ÿ”— ๋ฐฐํฌ ์ฃผ์†Œ

https://pickly-gamma.vercel.app/

  • ํ…Œ์ŠคํŠธ ์•„์ด๋””: test2639@naver.com
  • ํ…Œ์ŠคํŠธ ๋น„๋ฐ€๋ฒˆํ˜ธ: @00000000

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

๐ŸŽจ Frontend

React
Next.js
TypeScript
Tailwind CSS
Framer Motion
TanStack Query
Zustand

๐Ÿ”ง Backend

Next.js API โ€“ ์„œ๋ฒ„๋ฆฌ์Šค ๋ฐฑ์—”๋“œ
MongoDB โ€“ ์œ ํŠœ๋ธŒ, ์Šคํฌํ‹ฐํŒŒ์ด, OpenAI ๋“ฑ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ €์žฅ
Auth โ€“ ๋กœ๊ทธ์ธ ์‹œ ํ† ํฐ์„ HTTP-only ์ฟ ํ‚ค์— ์ €์žฅ

๐ŸŒ External APIs

Spotify API โ€“ ์Œ์•… ์ƒํ’ˆ โ†’ ํ•ด๋‹น ์•จ๋ฒ”์œผ๋กœ ์—ฐ๋™
YouTube API โ€“ ๋ฎค์ง๋น„๋””์˜ค ๋ฐ ์ฝ˜ํ…์ธ  ์ œ๊ณต
Google Maps API โ€“ ์œ„์น˜ ๊ธฐ๋ฐ˜ ์ •๋ณด ์—ฐ๋™
OpenAI API โ€“ ์ƒํ’ˆ๋ช…๊ณผ ์„ค๋ช…์„ ๋ถ„์„ํ•ด YouTube/Spotify/Google Maps ๋งํฌ ์ž๋™ ์ƒ์„ฑ


๐Ÿ‘€ ์„œ๋น„์Šค ๋‘˜๋Ÿฌ๋ณด๊ธฐ

๐Ÿ  ํ™ˆํŽ˜์ด์ง€

  • ์„œ๋น„์Šค ์†Œ๊ฐœ, ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ, ์ธ๊ธฐ ์ƒํ’ˆ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋“ฑ์ด ํฌํ•จ๋œ ์ฒซ ์ง„์ž… ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

๐Ÿ” ๋กœ๊ทธ์ธ / ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€

  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ Zustand๋ฅผ ํ™œ์šฉํ•ด ๋กœ๊ทธ์ธ ์‹œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ์‹œ Next.js API Routes ๊ธฐ๋ฐ˜ ์ž์ฒด ๋ฐฑ์—”๋“œ์—์„œ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ํ† ํฐ์€ HTTP-only ์ฟ ํ‚ค์— ์ €์žฅํ•ด ๋ณด์•ˆ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.

login-ezgif com-video-to-gif-converter


๐Ÿงญ ๋ฉ”์ธ ํŽ˜์ด์ง€

  • ์ƒํ’ˆ ๊ฒ€์ƒ‰, ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ •๋ ฌ, ๋ฌดํ•œ ์Šคํฌ๋กค, ๋กœ๋”ฉ ๊ธฐ๋Šฅ ๊ตฌํ˜„

main-ezgif com-video-to-gif-converter

  • ์ƒํ’ˆ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์œผ๋กœ ์ง์ ‘ ์ƒํ’ˆ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

main2-ezgif com-video-to-gif-converter


๐Ÿ“„ ์ƒํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€

  • ์ฐœํ•˜๊ธฐ, ๋ฆฌ๋ทฐ ์ž‘์„ฑ/์ˆ˜์ •/์‚ญ์ œ, ๋น„๊ต ๊ธฐ๋Šฅ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒํ’ˆ ๋“ฑ๋ก์ž์—๊ฒŒ๋Š” ํŽธ์ง‘ ๋ฐ ์‚ญ์ œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

detail-ezgif com-video-to-gif-converter review-ezgif com-video-to-gif-converter


โš–๏ธ ๋น„๊ตํ•˜๊ธฐ ํŽ˜์ด์ง€

  • ๋ฆฌ๋ทฐ ์ˆ˜, ํ‰๊ท  ๋ณ„์ , ์ฐœ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‘ ์ƒํ’ˆ์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•„๋„ ๊ฒŒ์ŠคํŠธ ๋ชจ๋“œ๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

compare-ezgif com-video-to-gif-converter


๐Ÿ‘ค ์œ ์ €ํŽ˜์ด์ง€ / ๋งˆ์ดํŽ˜์ด์ง€

  • ์œ ์ € ํŽ˜์ด์ง€์—์„œ ํŒ”๋กœ์ž‰, ํŒ”๋กœ์šฐ ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ๋ฆฌ๋ทฐ ๋“ฑ๋กํ•œ ์ƒํ’ˆ, ์ฐœํ•œ ์ƒํ’ˆ, ๋“ฑ๋กํ•œ ์ƒํ’ˆ ๋˜ํ•œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ดํŽ˜์ด์ง€์—์„œ๋Š” ์ถ”๊ฐ€๋กœ ํ”„๋กœํ•„ ํŽธ์ง‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mypage2-ezgif com-video-to-gif-converter

๐Ÿ“ ํด๋” ๊ตฌ์กฐ

โ”œโ”€โ”€โ”€public
โ”‚   โ”œโ”€โ”€โ”€animations
โ”‚   โ”œโ”€โ”€โ”€icons
โ”‚   โ””โ”€โ”€โ”€images
โ””โ”€โ”€โ”€src
    โ”œโ”€โ”€โ”€app
    โ”‚   โ”œโ”€โ”€โ”€api
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€cookie
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€login
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€logout
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€openai
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€โ”€extract-movie
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€โ”€extract-music
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€โ”€extract-place
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€spotify-token
    โ”‚   โ”‚   โ””โ”€โ”€โ”€youtube-search
    โ”‚   โ”œโ”€โ”€โ”€compare
    โ”‚   โ”œโ”€โ”€โ”€homepage
    โ”‚   โ”‚   โ””โ”€โ”€โ”€[id]
    โ”‚   โ”œโ”€โ”€โ”€landingpage
    โ”‚   โ”œโ”€โ”€โ”€mypage
    โ”‚   โ”œโ”€โ”€โ”€product
    โ”‚   โ”‚   โ””โ”€โ”€โ”€[id]
    โ”‚   โ”œโ”€โ”€โ”€providers
    โ”‚   โ”œโ”€โ”€โ”€signin
    โ”‚   โ”œโ”€โ”€โ”€signup
    โ”‚   โ”‚   โ””โ”€โ”€โ”€[provider]
    โ”‚   โ”œโ”€โ”€โ”€test
    โ”‚   โ”‚   โ””โ”€โ”€โ”€input
    โ”‚   โ””โ”€โ”€โ”€users
    โ”‚       โ””โ”€โ”€โ”€[id]
    โ”œโ”€โ”€โ”€components
    โ”‚   โ”œโ”€โ”€โ”€input
    โ”‚   โ””โ”€โ”€โ”€shared
    โ”œโ”€โ”€โ”€features
    โ”‚   โ”œโ”€โ”€โ”€compare
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€api
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€components
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€hooks
    โ”‚   โ”‚   โ””โ”€โ”€โ”€types
    โ”‚   โ”œโ”€โ”€โ”€header
    โ”‚   โ”‚   โ””โ”€โ”€โ”€hooks
    โ”‚   โ”œโ”€โ”€โ”€home
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€components
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€modals
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€โ”€store
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€services
    โ”‚   โ”‚   โ””โ”€โ”€โ”€types
    โ”‚   โ”œโ”€โ”€โ”€landing
    โ”‚   โ”‚   โ””โ”€โ”€โ”€components
    โ”‚   โ”œโ”€โ”€โ”€productId
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€components
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€โ”€modal
    โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€โ”€ProductCompareModal
    โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€โ”€ProductReviewModal
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€โ”€ProductApi
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€โ”€ProductIdDetail
    โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€โ”€ProductIdStats
    โ”‚   โ”‚   โ”‚   โ””โ”€โ”€โ”€ProductReviews
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€hooks
    โ”‚   โ”‚   โ””โ”€โ”€โ”€libs
    โ”‚   โ”œโ”€โ”€โ”€Profile
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€api
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€components
    โ”‚   โ”‚   โ”œโ”€โ”€โ”€hook
    โ”‚   โ”‚   โ””โ”€โ”€โ”€types
    โ”‚   โ”œโ”€โ”€โ”€signin
    โ”‚   โ”‚   โ””โ”€โ”€โ”€components
    โ”‚   โ””โ”€โ”€โ”€signup
    โ”‚       โ””โ”€โ”€โ”€components
    โ”œโ”€โ”€โ”€lib
    โ”‚   โ”œโ”€โ”€โ”€axios
    โ”‚   โ””โ”€โ”€โ”€utils
    โ””โ”€โ”€โ”€types

๐Ÿ› ๏ธ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ๋ฐฉ๋ฒ•

git clone https://github.com/part4-team6/Pickly.git
cd pickly
npm install
npm run dev

์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ & ๋ธŒ๋žœ์น˜ ์ „๋žต

๐Ÿ—‚๏ธ ํด๋”/ํŒŒ์ผ๋ช… ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜

๋Œ€์ƒ ๊ทœ์น™ ์˜ˆ์‹œ
ํด๋”๋ช… ์ผ€๋ฐฅ์ผ€์ด์Šค (kebab-case) components, user-profile
์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋ช… ํŒŒ์Šค์นผ์ผ€์ด์Šค (PascalCase) UserProfile.jsx
์Šคํƒ€์ผ ํŒŒ์ผ๋ช… ์ผ€๋ฐฅ์ผ€์ด์Šค + .styles.js user-profile.styles.js
์ด๋ฏธ์ง€/์•„์ด์ฝ˜ ํŒŒ์ผ๋ช… ์ผ€๋ฐฅ์ผ€์ด์Šค logo-icon.png, profile-default.png
ํ•จ์ˆ˜๋ช…/๋ณ€์ˆ˜๋ช… ์นด๋ฉœ์ผ€์ด์Šค (camelCase) fetchUserData, userList
ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋Œ€๋ฌธ์ž+์Šค๋„ค์ดํฌ์ผ€์ด์Šค REACT_APP_API_URL

๐ŸŒด ๋ธŒ๋žœ์น˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜

์—ญํ•  ๋„ค์ด๋ฐ ์˜ˆ์‹œ
๋ฉ”์ธ ๋ธŒ๋žœ์น˜(๋ฐฐํฌ์šฉ) main main/
๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜ feature/๊ธฐ๋Šฅ๋ช… feature/์ด๋ฆ„/dashboard-modal
๊ธด๊ธ‰ ์ˆ˜์ • ๋ธŒ๋žœ์น˜ hotfix/์ด์Šˆ๋ช… hotfix/์ด๋ฆ„/login-error
๋ฆด๋ฆฌ์ฆˆ ์ค€๋น„ ๋ธŒ๋žœ์น˜ release/๋ฒ„์ „๋ช… release/์ด๋ฆ„/v1.0.0
์Šคํƒ€์ผ ์ˆ˜์ • ๋ธŒ๋žœ์น˜ style/์Šคํƒ€์ผ์ด๋ฆ„ style/์ด๋ฆ„/login-mobile

๐Ÿ—“๏ธ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

2025.05.26 ~ 2025.06.24 (์•ฝ ํ•œ ๋‹ฌ, ์ผ์š”์ผ ์ œ์™ธ)

๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ ํŒ€ ์†Œ๊ฐœ ๋ฐ ์—ญํ•  ๋ถ„๋‹ด

๋ฉค๋ฒ„ ์—ญํ•  ๋ฐ ๊ธฐ์—ฌ

@๊น€์ˆ˜์—ฐ
์ƒ์„ธ ํŽ˜์ด์ง€ / ์™ธ๋ถ€ API ์—ฐ๋™
- ์ƒ์„ธ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ํ‘œ์‹œ
- Spotify, YouTube, Google Maps, OpenAI ๋“ฑ ์™ธ๋ถ€ API ํ†ตํ•ฉ
- MongoDB ์—ฐ๊ฒฐ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ (Zustand)
- ๋น„๊ต ์ƒํ’ˆ ๋“ฑ๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„

@๋ฐ•ํ•˜์€
๋น„๊ตํ•˜๊ธฐ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
- A/B ํ…Œ์ŠคํŠธ ๊ธฐ๋ฐ˜ UI/UX ์„ค๊ณ„ ๋ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
- Zustand์™€ ์—ฐ๋™๋œ ๋น„๊ต ์ƒํ’ˆ ๊ธฐ๋Šฅ ํ†ตํ•ฉ

@์†ํ˜์ง„
๋งˆ์ดํŽ˜์ด์ง€ / ์œ ์ €ํŽ˜์ด์ง€
- ์œ ์ € ๊ฐœ์ธ์ •๋ณด ๋ฐ ํ™œ๋™ ๋‚ด์—ญ ํŽ˜์ด์ง€ ๊ตฌํ˜„
- ํŒ”๋กœ์šฐ/ํŒ”๋กœ์ž‰ ๊ธฐ๋Šฅ ๋ฐ ๊ด€๋ จ ๋ชจ๋‹ฌ ๊ฐœ๋ฐœ

@์†ก๋ฏธ์ง„
ํšŒ์› ์ธ์ฆ / ์—๋Ÿฌ ํ•ธ๋“ค๋ง
- ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ (์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํฌํ•จ)
- ์ „์ฒด ์„œ๋น„์Šค์˜ ์—๋Ÿฌ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ

@ํ™์Šน์›
ํ™ˆํŽ˜์ด์ง€ / ์ธํ”„๋ผ / ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ
- ๋žœ๋”ฉ ๋ฐ ๋ฉ”์ธ ํŽ˜์ด์ง€ UI ๊ฐœ๋ฐœ
- ๋ฐฑ์—”๋“œ API (Next.js API Routes) ๊ตฌํ˜„
- ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ (ํ—ค๋” ๋“ฑ) ๋ฐ ๋กœ๋”ฉ ์ฒ˜๋ฆฌ
- SEO ์ตœ์ ํ™” ๋ฐ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ์„ค์ •

โš”๏ธ ์ฐจ๋ณ„์ 

  • ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ์ƒํ’ˆ์„ ๋น„๊ต(A/B ํ…Œ์ŠคํŠธ)ํ•˜๊ณ , ๋ฆฌ๋ทฐ ๊ธฐ๋ฐ˜ ๋žญํ‚น ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • OpenAI๋ฅผ ํ™œ์šฉํ•ด ์œ ํŠœ๋ธŒยท์Šคํฌํ‹ฐํŒŒ์ดยท์ง€๋„ ์ฝ˜ํ…์ธ ๋ฅผ ์ž๋™ ์—ฐ๋™ํ•˜์—ฌ ์ •๋ณด ํƒ์ƒ‰ ๋น„์šฉ์„ ์ ˆ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ํŠœ๋ธŒ API๋Š” MongoDB ์บ์‹ฑ์„ ํ†ตํ•ด ํ• ๋‹น๋Ÿ‰์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์€ Next.js API Routes ๊ธฐ๋ฐ˜์˜ ์ž์ฒด ๋ฐฑ์—”๋“œ๋กœ ๊ตฌํ˜„ํ•˜์˜€๊ณ , HTTP-only ์ฟ ํ‚ค์— ํ† ํฐ์„ ์ €์žฅํ•˜๋Š” ํ•œํŽธ, CSRF ํ† ํฐ์„ ๋„์ž…ํ•ด ๊ต์ฐจ ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ณด์•ˆ์„ฑ์„ ์ถ”๊ฐ€๋กœ ๊ฐ•ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ์—†์ด๋„ ๋น„๊ต ๊ธฐ๋Šฅ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์ง„์ž… ์žฅ๋ฒฝ์„ ๋‚ฎ์ท„๊ณ , ํ•„์ˆ˜ ๊ธฐ๋Šฅ์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

About

Pickly is a community-based web platform where users can add products, compare them, and share opinions through reviews. It features product registration with image uploads, infinite scroll, category filtering, and a smooth modal-based comparison interface.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages