Skip to content

bigmooon/shift

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

346 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

SHIFT - MZ ์ž๊ธฐ๊ฐ๊ด€ํ™” ํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ

Shift Logo

๐Ÿ“‹ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

SHIFT๋Š” MZ ์„ธ๋Œ€๋ฅผ ์œ„ํ•œ ์ž๊ธฐ๊ฐ๊ด€ํ™” ํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ํ‚ค์›Œ๋“œ์™€ ํƒ€์ธ์ด ๋ณด๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ฐ๊ด€์ ์ธ ์ž๊ธฐ ์ธ์‹์„ ๋„์™€์ฃผ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

๐ŸŽฏ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ž๊ธฐ ์ธ์‹ ํ…Œ์ŠคํŠธ: ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์„ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ํ‚ค์›Œ๋“œ๋กœ ํ‘œํ˜„
  • ํƒ€์ธ์˜ ์‹œ๊ฐ: ์ง€์ธ๋“ค์ด ๋ณด๋Š” ์‚ฌ์šฉ์ž์˜ ๋ชจ์Šต์„ ํ‚ค์›Œ๋“œ๋กœ ์ˆ˜์ง‘
  • ๊ฒฐ๊ณผ ๋ถ„์„: EPA(Evaluation, Potency, Activity) ๋ชจ๋ธ ๊ธฐ๋ฐ˜ ์„ฑ๊ฒฉ ๋ถ„์„
  • MZ ์œ ํ˜• ๋ถ„๋ฅ˜: 8๊ฐ€์ง€ MZ ์œ ํ˜•์œผ๋กœ ์„ฑ๊ฒฉ ๋ถ„๋ฅ˜ (TRO, TRS, TCO, TCS, PRO, PRS, PCO, PCS)
  • ์†Œ์…œ ๋กœ๊ทธ์ธ: ์นด์นด์˜ค ๊ณ„์ •์„ ํ†ตํ•œ ๊ฐ„ํŽธ ๋กœ๊ทธ์ธ
  • ๋งํฌ ๊ณต์œ : ํ…Œ์ŠคํŠธ ๋งํฌ๋ฅผ ์ง€์ธ๋“ค๊ณผ ๊ณต์œ ํ•˜์—ฌ ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘

๐Ÿ—๏ธ ๊ธฐ์ˆ  ์Šคํƒ

Frontend (React)

  • React 19.2.0 - ๋ฉ”์ธ ํ”„๋ ˆ์ž„์›Œํฌ
  • React Router DOM 7.9.6 - ๋ผ์šฐํŒ…
  • SCSS - ์Šคํƒ€์ผ๋ง
  • Framer Motion 11.0.24 - ์• ๋‹ˆ๋ฉ”์ด์…˜
  • Swiper 11.1.1 - ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋”
  • Recharts 2.12.6 - ์ฐจํŠธ ๋ฐ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”

Backend (Flask)

  • Flask 3.0.3 - ์›น ํ”„๋ ˆ์ž„์›Œํฌ
  • Flask-CORS 4.0.0 - CORS ์ฒ˜๋ฆฌ
  • Flask-Session 0.8.0 - ์„ธ์…˜ ๊ด€๋ฆฌ
  • Pyrebase4 4.7.1 - Firebase ์—ฐ๋™
  • Google Cloud Storage - ๋ฐ์ดํ„ฐ ์ €์žฅ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

  • Firebase Realtime Database - ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

์ธ์ฆ

  • Kakao OAuth 2.0 - ์†Œ์…œ ๋กœ๊ทธ์ธ

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

shift/
โ”œโ”€โ”€ flask/                          # Backend (Flask)
โ”‚   โ”œโ”€โ”€ app.py                      # ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง
โ”‚   โ”œโ”€โ”€ flask_app.py                # Flask ์•ฑ ์„ค์ •
โ”‚   โ”œโ”€โ”€ config.py                   # ์„ค์ • ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ DBhandler.py                # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ธ๋“ค๋Ÿฌ
โ”‚   โ”œโ”€โ”€ EPAKeyword.py               # EPA ํ‚ค์›Œ๋“œ ์ฒ˜๋ฆฌ
โ”‚   โ”œโ”€โ”€ model.py                    # ๋ฐ์ดํ„ฐ ๋ชจ๋ธ
โ”‚   โ”œโ”€โ”€ notification.py             # ์•Œ๋ฆผ ๊ธฐ๋Šฅ
โ”‚   โ”œโ”€โ”€ question.py                 # ์งˆ๋ฌธ ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ logs.py                     # ๋กœ๊น… ์„ค์ •
โ”‚   โ””โ”€โ”€ resources/                  # ๋ฆฌ์†Œ์Šค ํŒŒ์ผ
โ”‚       โ”œโ”€โ”€ keywords.txt            # EPA ํ‚ค์›Œ๋“œ ๋ชฉ๋ก
โ”‚       โ””โ”€โ”€ question_list.txt       # ์งˆ๋ฌธ ๋ชฉ๋ก
โ”œโ”€โ”€ react/                          # Frontend (React)
โ”‚   โ”œโ”€โ”€ public/                     # ์ •์  ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ components/             # ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Button/             # ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Header/             # ํ—ค๋” ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Footer/             # ํ‘ธํ„ฐ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Modal/              # ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Login/              # ๋กœ๊ทธ์ธ ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”œโ”€โ”€ pages/                  # ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ LinkSender/         # ํ…Œ์ŠคํŠธ ์ƒ์„ฑ์ž ํŽ˜์ด์ง€
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ LinkReceiver/       # ํ…Œ์ŠคํŠธ ์ฐธ์—ฌ์ž ํŽ˜์ด์ง€
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Result/             # ๊ฒฐ๊ณผ ํŽ˜์ด์ง€
โ”‚   โ”‚   โ”œโ”€โ”€ assets/                 # ์ •์  ์ž์›
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ images/             # ์ด๋ฏธ์ง€ ํŒŒ์ผ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ fonts/              # ํฐํŠธ ํŒŒ์ผ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ styles/             # SCSS ์Šคํƒ€์ผ
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ data/               # ์ •์  ๋ฐ์ดํ„ฐ
โ”‚   โ”‚   โ””โ”€โ”€ App.js                  # ๋ฉ”์ธ ์•ฑ ์ปดํฌ๋„ŒํŠธ
โ”œโ”€โ”€ requirements.txt                # Python ์˜์กด์„ฑ
โ””โ”€โ”€ README.md                       # ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ

๐Ÿš€ ์„ค์น˜ ๋ฐ ์‹คํ–‰

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.8+
  • Node.js 16+
  • Firebase ํ”„๋กœ์ ํŠธ ์„ค์ •
  • Kakao Developers ์•ฑ ๋“ฑ๋ก

1. ์ €์žฅ์†Œ ํด๋ก 

git clone <repository-url>
cd shift

2. Backend ์„ค์ •

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
cd flask
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# ์˜์กด์„ฑ ์„ค์น˜
pip install -r ../requirements.txt

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • (.env ํŒŒ์ผ ์ƒ์„ฑ)
cp .env.example .env
# .env ํŒŒ์ผ์— Firebase ๋ฐ Kakao OAuth ์„ค์ • ์ถ”๊ฐ€

3. Frontend ์„ค์ •

cd react
npm install

4. Firebase ์„ค์ •

  1. Firebase Console์—์„œ ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
  2. Realtime Database ํ™œ์„ฑํ™”
  3. ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค ์ƒ์„ฑ ํ›„ flask/resources/shift_key.json์— ์ €์žฅ
  4. config.py์— Firebase ์„ค์ • ์ •๋ณด ์ž…๋ ฅ

5. Kakao OAuth ์„ค์ •

  1. Kakao Developers์—์„œ ์•ฑ ์ƒ์„ฑ
  2. OAuth ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI ์„ค์ •: http://localhost:3000/kakao_callback
  3. config.py์— ํด๋ผ์ด์–ธํŠธ ID์™€ ์‹œํฌ๋ฆฟ ํ‚ค ์ž…๋ ฅ

6. ์‹คํ–‰

# Backend ์‹คํ–‰ (ํฌํŠธ 5000)
cd flask
python app.py

# Frontend ์‹คํ–‰ (ํฌํŠธ 3000)
cd react
npm start

๐ŸŽฎ ์‚ฌ์šฉ๋ฒ•

1. ํ…Œ์ŠคํŠธ ์ƒ์„ฑ (Host)

  1. ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ
  2. ๊ธฐ๋ณธ ์ •๋ณด ์ž…๋ ฅ (๋‹‰๋„ค์ž„, ๋‚˜์ด, ์„ฑ๋ณ„)
  3. ์ž๊ธฐ ์ธ์‹ ํ‚ค์›Œ๋“œ ์„ ํƒ:
    • ๋‚˜์˜ ์ •์ฒด์„ฑ: ํ˜„์žฌ ์ž์‹ ์˜ ๋ชจ์Šต
    • ๋‚˜์˜ ์—ด๋ง: ๋˜๊ณ  ์‹ถ์€ ๋ชจ์Šต
    • ํƒ€์ธ์ด ๋ณด๋Š” ๋‚˜: ๋‚จ๋“ค์ด ๋ณด๋Š” ์ž์‹ ์˜ ๋ชจ์Šต
  4. ํ…Œ์ŠคํŠธ ๋งํฌ ์ƒ์„ฑ ๋ฐ ๊ณต์œ 

2. ํ…Œ์ŠคํŠธ ์ฐธ์—ฌ (Guest)

  1. ๊ณต์œ ๋ฐ›์€ ๋งํฌ ์ ‘์†
  2. ๊ธฐ๋ณธ ์ •๋ณด ์ž…๋ ฅ (๋‹‰๋„ค์ž„, ๊ด€๊ณ„, ๋‚˜์ด๋Œ€, ์„ฑ๋ณ„)
  3. ํ•ด๋‹น ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ด์šธ๋ฆฌ๋Š” ํ‚ค์›Œ๋“œ ์„ ํƒ
  4. ํ‚ค์›Œ๋“œ ์„ ํƒ ์ด์œ  ์ž‘์„ฑ
  5. ํ•œ ์ค„ ์†Œ๊ฐœ ์ž‘์„ฑ

3. ๊ฒฐ๊ณผ ํ™•์ธ

  1. ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์‘๋‹ต ํ˜„ํ™ฉ ํ™•์ธ
  2. ์ƒ์„ธ ๊ฒฐ๊ณผ์—์„œ MZ ์œ ํ˜• ๋ฐ ๋ถ„์„ ๊ฒฐ๊ณผ ํ™•์ธ
  3. ์ž์‹ ์˜ ์ธ์‹๊ณผ ํƒ€์ธ์˜ ์ธ์‹ ๋น„๊ต ๋ถ„์„

๐Ÿ“Š MZ ์œ ํ˜• ๋ถ„๋ฅ˜

EPA ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ 8๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋ถ„๋ฅ˜:

  • TRO (MZ ๋ฐ”์ด๋ธ”ํ˜•): ์†”์งํ•˜๊ณ  MZ๋ ฅ ๋งŒ๋ ™
  • TRS (MZ ๋นŒ๋Ÿฐํ˜•): ์ง์„ค์ ์ด๊ณ  ๊ฐ•ํ•œ ์„ฑ๊ฒฉ
  • TCO (MZ ํํ‹ฐํ˜•): ๊ท€์—ฝ๊ณ  ์‚ฌ๋ž‘์Šค๋Ÿฌ์šด ์„ฑ๊ฒฉ
  • TCS (MZ ์ˆœ๋”ฉํ˜•): ์ˆœ์ˆ˜ํ•˜๊ณ  ์ฐฉํ•œ ์„ฑ๊ฒฉ
  • PRO (MZ ํ”„๋กœํ˜•): ์ „๋ฌธ์ ์ด๊ณ  ๋Šฅ๋ ฅ์žˆ๋Š” ์„ฑ๊ฒฉ
  • PRS (MZ ์‹œํฌํ˜•): ์ฐจ๋ถ„ํ•˜๊ณ  ์‹ ์ค‘ํ•œ ์„ฑ๊ฒฉ
  • PCO (MZ ํž๋งํ˜•): ํŽธ์•ˆํ•˜๊ณ  ์น˜์œ ๋˜๋Š” ์„ฑ๊ฒฉ
  • PCS (MZ ์ฒœ์‚ฌํ˜•): ์™„๋ฒฝํ•˜๊ณ  ์ด์ƒ์ ์ธ ์„ฑ๊ฒฉ

๐Ÿ”ง ์ฃผ์š” API ์—”๋“œํฌ์ธํŠธ

์ธ์ฆ

  • GET /kakao_login - ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  • POST /kakao_callback - ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ
  • GET /verify_login - ๋กœ๊ทธ์ธ ์ƒํƒœ ํ™•์ธ
  • POST /logout - ๋กœ๊ทธ์•„์›ƒ

ํ…Œ์ŠคํŠธ ๊ด€๋ฆฌ

  • POST /save_epa - EPA ํ…Œ์ŠคํŠธ ์ƒ์„ฑ
  • POST /save_epa_reply - EPA ํ…Œ์ŠคํŠธ ์‘๋‹ต ์ €์žฅ
  • GET /epa_test_reply/<tid> - ํ…Œ์ŠคํŠธ ์ •๋ณด ์กฐํšŒ
  • GET /result/epa - ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์กฐํšŒ

๊ธฐํƒ€

  • GET /get_epa_keywords - EPA ํ‚ค์›Œ๋“œ ๋ชฉ๋ก ์กฐํšŒ
  • GET /my_tests - ๋‚ด ํ…Œ์ŠคํŠธ ๋ชฉ๋ก ์กฐํšŒ
  • GET /total_num - ์ „์ฒด ํ…Œ์ŠคํŠธ ์ˆ˜ ์กฐํšŒ

๐ŸŽจ ๋””์ž์ธ ํŠน์ง•

  • ๋ชจ๋˜ํ•œ UI/UX: ๊น”๋”ํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค
  • ๋ฐ˜์‘ํ˜• ๋””์ž์ธ: ๋ชจ๋ฐ”์ผ ๋ฐ ๋ฐ์Šคํฌํ†ฑ ์ตœ์ ํ™”
  • ์• ๋‹ˆ๋ฉ”์ด์…˜: Framer Motion์„ ํ™œ์šฉํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ์ „ํ™˜ ํšจ๊ณผ
  • Pretendard ํฐํŠธ: ํ•œ๊ตญ์–ด์— ์ตœ์ ํ™”๋œ ํฐํŠธ ์‚ฌ์šฉ
  • ์ปฌ๋Ÿฌ ์‹œ์Šคํ…œ: ๋ณด๋ผ์ƒ‰ ๊ณ„์—ด์˜ ๋ธŒ๋žœ๋“œ ์ปฌ๋Ÿฌ ์ ์šฉ

๐Ÿ”’ ๋ณด์•ˆ ๋ฐ ๊ฐœ์ธ์ •๋ณด

  • OAuth 2.0: ์•ˆ์ „ํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ
  • ์„ธ์…˜ ๊ด€๋ฆฌ: Flask-Session์„ ํ†ตํ•œ ์•ˆ์ „ํ•œ ์„ธ์…˜ ์ฒ˜๋ฆฌ
  • ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”: Firebase์˜ ๋ณด์•ˆ ๊ทœ์น™ ์ ์šฉ
  • ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ: ์ตœ์†Œํ•œ์˜ ๊ฐœ์ธ์ •๋ณด๋งŒ ์ˆ˜์ง‘

๐Ÿ“ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ฐœ์ธ ํฌํŠธํด๋ฆฌ์˜ค ๋ชฉ์ ์œผ๋กœ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ฅ ๊ธฐ์—ฌ์ž

  • ๊ฐœ๋ฐœ์ž: [Your Name]
  • ๋””์ž์ธ: [Designer Name]

๐Ÿ“ž ๋ฌธ์˜


SHIFT๋กœ ๋‚˜๋ฅผ ๋” ๊ฐ๊ด€์ ์œผ๋กœ ์•Œ์•„๋ณด์„ธ์š”! ๐Ÿš€

About

shift project

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • JavaScript 62.1%
  • SCSS 26.3%
  • Python 11.3%
  • HTML 0.3%