SHIFT๋ MZ ์ธ๋๋ฅผ ์ํ ์๊ธฐ๊ฐ๊ดํ ํ ์คํธ ํ๋ซํผ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์์ ์ ๋ํด ์๊ฐํ๋ ํค์๋์ ํ์ธ์ด ๋ณด๋ ํค์๋๋ฅผ ๋น๊ตํ์ฌ ๊ฐ๊ด์ ์ธ ์๊ธฐ ์ธ์์ ๋์์ฃผ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
- ์๊ธฐ ์ธ์ ํ ์คํธ: ์ฌ์ฉ์๊ฐ ์์ ์ ์ด๋ป๊ฒ ์๊ฐํ๋์ง ํค์๋๋ก ํํ
- ํ์ธ์ ์๊ฐ: ์ง์ธ๋ค์ด ๋ณด๋ ์ฌ์ฉ์์ ๋ชจ์ต์ ํค์๋๋ก ์์ง
- ๊ฒฐ๊ณผ ๋ถ์: EPA(Evaluation, Potency, Activity) ๋ชจ๋ธ ๊ธฐ๋ฐ ์ฑ๊ฒฉ ๋ถ์
- MZ ์ ํ ๋ถ๋ฅ: 8๊ฐ์ง MZ ์ ํ์ผ๋ก ์ฑ๊ฒฉ ๋ถ๋ฅ (TRO, TRS, TCO, TCS, PRO, PRS, PCO, PCS)
- ์์ ๋ก๊ทธ์ธ: ์นด์นด์ค ๊ณ์ ์ ํตํ ๊ฐํธ ๋ก๊ทธ์ธ
- ๋งํฌ ๊ณต์ : ํ ์คํธ ๋งํฌ๋ฅผ ์ง์ธ๋ค๊ณผ ๊ณต์ ํ์ฌ ํผ๋๋ฐฑ ์์ง
- React 19.2.0 - ๋ฉ์ธ ํ๋ ์์ํฌ
- React Router DOM 7.9.6 - ๋ผ์ฐํ
- SCSS - ์คํ์ผ๋ง
- Framer Motion 11.0.24 - ์ ๋๋ฉ์ด์
- Swiper 11.1.1 - ์ด๋ฏธ์ง ์ฌ๋ผ์ด๋
- Recharts 2.12.6 - ์ฐจํธ ๋ฐ ๋ฐ์ดํฐ ์๊ฐํ
- 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 ์ฑ ๋ฑ๋ก
git clone <repository-url>
cd shift# ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ์ฑํ
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 ์ค์ ์ถ๊ฐcd react
npm install- Firebase Console์์ ์ ํ๋ก์ ํธ ์์ฑ
- Realtime Database ํ์ฑํ
- ์๋น์ค ๊ณ์ ํค ์์ฑ ํ
flask/resources/shift_key.json์ ์ ์ฅ config.py์ Firebase ์ค์ ์ ๋ณด ์ ๋ ฅ
- Kakao Developers์์ ์ฑ ์์ฑ
- OAuth ๋ฆฌ๋ค์ด๋ ํธ URI ์ค์ :
http://localhost:3000/kakao_callback config.py์ ํด๋ผ์ด์ธํธ ID์ ์ํฌ๋ฆฟ ํค ์ ๋ ฅ
# Backend ์คํ (ํฌํธ 5000)
cd flask
python app.py
# Frontend ์คํ (ํฌํธ 3000)
cd react
npm start- ๋ฉ์ธ ํ์ด์ง์์ ์นด์นด์ค ๋ก๊ทธ์ธ
- ๊ธฐ๋ณธ ์ ๋ณด ์ ๋ ฅ (๋๋ค์, ๋์ด, ์ฑ๋ณ)
- ์๊ธฐ ์ธ์ ํค์๋ ์ ํ:
- ๋์ ์ ์ฒด์ฑ: ํ์ฌ ์์ ์ ๋ชจ์ต
- ๋์ ์ด๋ง: ๋๊ณ ์ถ์ ๋ชจ์ต
- ํ์ธ์ด ๋ณด๋ ๋: ๋จ๋ค์ด ๋ณด๋ ์์ ์ ๋ชจ์ต
- ํ ์คํธ ๋งํฌ ์์ฑ ๋ฐ ๊ณต์
- ๊ณต์ ๋ฐ์ ๋งํฌ ์ ์
- ๊ธฐ๋ณธ ์ ๋ณด ์ ๋ ฅ (๋๋ค์, ๊ด๊ณ, ๋์ด๋, ์ฑ๋ณ)
- ํด๋น ์ฌ์ฉ์์๊ฒ ์ด์ธ๋ฆฌ๋ ํค์๋ ์ ํ
- ํค์๋ ์ ํ ์ด์ ์์ฑ
- ํ ์ค ์๊ฐ ์์ฑ
- ๋์๋ณด๋์์ ์๋ต ํํฉ ํ์ธ
- ์์ธ ๊ฒฐ๊ณผ์์ MZ ์ ํ ๋ฐ ๋ถ์ ๊ฒฐ๊ณผ ํ์ธ
- ์์ ์ ์ธ์๊ณผ ํ์ธ์ ์ธ์ ๋น๊ต ๋ถ์
EPA ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก 8๊ฐ์ง ์ ํ์ผ๋ก ๋ถ๋ฅ:
- TRO (MZ ๋ฐ์ด๋ธํ): ์์งํ๊ณ MZ๋ ฅ ๋ง๋
- TRS (MZ ๋น๋ฐํ): ์ง์ค์ ์ด๊ณ ๊ฐํ ์ฑ๊ฒฉ
- TCO (MZ ํํฐํ): ๊ท์ฝ๊ณ ์ฌ๋์ค๋ฌ์ด ์ฑ๊ฒฉ
- TCS (MZ ์๋ฉํ): ์์ํ๊ณ ์ฐฉํ ์ฑ๊ฒฉ
- PRO (MZ ํ๋กํ): ์ ๋ฌธ์ ์ด๊ณ ๋ฅ๋ ฅ์๋ ์ฑ๊ฒฉ
- PRS (MZ ์ํฌํ): ์ฐจ๋ถํ๊ณ ์ ์คํ ์ฑ๊ฒฉ
- PCO (MZ ํ๋งํ): ํธ์ํ๊ณ ์น์ ๋๋ ์ฑ๊ฒฉ
- PCS (MZ ์ฒ์ฌํ): ์๋ฒฝํ๊ณ ์ด์์ ์ธ ์ฑ๊ฒฉ
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๋ก ๋๋ฅผ ๋ ๊ฐ๊ด์ ์ผ๋ก ์์๋ณด์ธ์! ๐
