์ ๊ธ ๋ถํธ์บ ํ์์ ๋ฐฐ์ด ๋ด์ฉ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ณต์ตํ ์ ์๋ ๊ฐ์ธ ๋ฉ๋ชจ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
- ๐ ๋ฉ๋ชจ ์์ฑ & ๊ด๋ฆฌ: ํฌ์คํธ์ ์คํ์ผ๋ก ํ์ต ๋ด์ฉ ์ ๋ฆฌ, ๊ฐ์ธ์ ์ผ๋ก๋ง ๋ณผ ์ ์๋ ๋ ธ๋ ๋ฉ๋ชจ์ ๋ชจ๋์๊ฒ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ณด๋ผ์ ๋ฉ๋ชจ๋ก ์ ํํ ์ ์์
- ๐ ๊ฒ์ & ํ๊ทธ: ์ ๋ชฉ, ๋ด์ฉ, ํ๊ทธ ๊ธฐ๋ฐ ๊ฒ์
- ๐ ๋ณต์ต ์๋ฆผ: ์ผ์ ์๊ฐ ํ ๋ณต์ต ์๋ฆผ ์ ๊ณต
- ๐ฅ ๋ผ์ด์ง: ๋ค๋ฅธ ์ฌ์ฉ์์ ๋ฉ๋ชจ ๊ณต์ ๋ฐ ๋๊ธ
- ๐ ์ฌ์ฉ์ ์ธ์ฆ: JWT ๊ธฐ๋ฐ ์์ ํ ๋ก๊ทธ์ธ
- ๐ค AI ์ฑ๋ด: OpenAI๋ฅผ ํ์ฉํ ํ์ต ๋ด์ฉ ์์ฝ ๋ฐ ๋ถ์
Backend: Flask, MongoDB, JWT
Frontend: HTML/CSS/JS, Tailwind CSS
๊ธฐํ: Python, PyMongo, Werkzeug, OpenAI
git clone <repository-url>
cd jgnote
python -m venv myenv
source myenv/bin/activate # Windows: myenv\Scripts\activate
pip install -r requirements.txt- MongoDB ์ ์ (์ธ๋ถ ์๋ฒ ์ฌ์ฉ ์ค)
- ๋๋ ๋ก์ปฌ MongoDB ์ค์น ํ app.py์ ์ฐ๊ฒฐ ๋ฌธ์์ด ์์
- ํ์๊ฐ์ /๋ก๊ทธ์ธ โ ๊ณ์ ์์ฑ ํ ๋ก๊ทธ์ธ
- ๋ฉ๋ชจ ์์ฑ โ ํ๋กํ ๋ฒํผ(+)์ผ๋ก ๋ฉ๋ชจ ์ถ๊ฐ
- ๊ฒ์ โ ํค์๋ ๋๋
#ํ๊ทธ๋ช์ผ๋ก ๊ฒ์ - ๋ณต์ต ์๋ฆผ โ ํค๋์์ ๋ณต์ตํ ๋ฉ๋ชจ ํ์ธ
- ๋ผ์ด์ง โ ๋ฉ๋ชจ ๊ณต์ ํ๊ณ ๋๊ธ ์์ฑ
jgnote/
โโโ app.py # Flask ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์
โโโ README.md # ํ๋ก์ ํธ ๋ฌธ์
โโโ .env # ํ๊ฒฝ ๋ณ์ (์์ฑ ํ์)
โโโ static/ # ์ ์ ํ์ผ ํด๋
โ โโโ profile.png # ๊ธฐ๋ณธ ํ๋กํ ์ด๋ฏธ์ง
โโโ templates/ # HTML ํ
ํ๋ฆฟ ํด๋
โ โโโ login.html # ๋ก๊ทธ์ธ ํ์ด์ง
โ โโโ register.html # ํ์๊ฐ์
ํ์ด์ง
โ โโโ main.html # ๋ฉ์ธ ๋ฉ๋ชจ ๊ด๋ฆฌ ํ์ด์ง
โ โโโ memo_add.html # ๋ฉ๋ชจ ์์ฑ ํ์ด์ง
โ โโโ memo_review.html # ๋ฉ๋ชจ ์์ธ๋ณด๊ธฐ ํ์ด์ง
โ โโโ profile.html # ํ๋กํ ํ์ด์ง
โ โโโ profile_edit.html # ํ๋กํ ํธ์ง ํ์ด์ง
โ โโโ reminder.html # ๋ณต์ต ์๋ฆผ ํ์ด์ง
โ โโโ lounge.html # ๋ผ์ด์ง ํ์ด์ง
โโโ myenv/ # Python ๊ฐ์ํ๊ฒฝ ํด๋
โโโ bin/ # ์คํ ํ์ผ๋ค (Linux/Mac)
โโโ lib/ # ์ค์น๋ ํจํค์ง๋ค
โโโ pyvenv.cfg # ๊ฐ์ํ๊ฒฝ ์ค์
๐ Backend (app.py)
- Flask ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ๋ฐ ๋ผ์ฐํ
- MongoDB ์ฐ๊ฒฐ ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- JWT ์ธ์ฆ ๋ฐ ์ธ์ ๊ด๋ฆฌ
- RESTful API ์๋ํฌ์ธํธ ๊ตฌํ
- OpenAI API ์ฐ๋
๐จ Frontend (templates/)
login.html,register.html: ์ฌ์ฉ์ ์ธ์ฆmain.html: ๋ฉ๋ชจ ๋ชฉ๋ก ๋ฐ ๊ด๋ฆฌ ์ธํฐํ์ด์คmemo_add.html,memo_review.html: ๋ฉ๋ชจ ์์ฑ ๋ฐ ์์ธ๋ณด๊ธฐprofile.html,profile_edit.html: ์ฌ์ฉ์ ํ๋กํ ๊ด๋ฆฌreminder.html: ๋ณต์ต ์๋ฆผ ์์คํ lounge.html: ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ
MongoDB Collections:
{
_id: ObjectId,
title: String, // ๋ฉ๋ชจ ์ ๋ชฉ
content: String, // ๋ฉ๋ชจ ๋ด์ฉ
user_id: String, // ์์ฑ์ ID
tags: [String], // ํ๊ทธ ๋ฐฐ์ด
share: Boolean, // ๋ผ์ด์ง ๊ณต์ ์ฌ๋ถ
repeat_visible: Boolean, // ๋ณต์ต ์๋ฆผ ํ์ ์ฌ๋ถ
created_at: Date // ์์ฑ์ผ์
}{
_id: ObjectId,
user_id: String, // ๋ก๊ทธ์ธ ID
user_name: String, // ์ฌ์ฉ์ ์ด๋ฆ
user_email: String, // ์ด๋ฉ์ผ
user_pw: String // ์ํธํ๋ ๋น๋ฐ๋ฒํธ
}{
_id: ObjectId,
memo_id: ObjectId, // ๋ฉ๋ชจ ID (์ฐธ์กฐ)
user_id: String, // ๋๊ธ ์์ฑ์ ID
user_name: String, // ๋๊ธ ์์ฑ์ ์ด๋ฆ
content: String, // ๋๊ธ ๋ด์ฉ
created_at: Date // ์์ฑ์ผ์
}| ์๋ํฌ์ธํธ | ๋ฉ์๋ | ์ค๋ช |
|---|---|---|
/ |
GET | ๋ฃจํธ (๋ก๊ทธ์ธ์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ) |
/login |
GET/POST | ๋ก๊ทธ์ธ |
/logout |
POST | ๋ก๊ทธ์์ |
/make |
GET | ํ์๊ฐ์ ํ์ด์ง |
/register |
POST | ํ์๊ฐ์ ์ฒ๋ฆฌ |
/main |
GET | ๋ฉ๋ชจ ๋ชฉ๋ก |
/memo_add |
GET/POST | ๋ฉ๋ชจ ์์ฑ |
/memo/<id> |
GET | ๋ฉ๋ชจ ์์ธ๋ณด๊ธฐ |
/memo/<id> |
DELETE | ๋ฉ๋ชจ ์ญ์ |
/reminder |
GET | ๋ณต์ต ์๋ฆผ |
/hide_memo |
POST | ๋ณต์ต ์๋ฆผ ์จ๊ธฐ๊ธฐ |
/profile |
GET | ํ๋กํ ๋ณด๊ธฐ |
/profile_edit |
GET/POST | ํ๋กํ ํธ์ง |
/lounge |
GET | ๋ผ์ด์ง |
/memo/share |
POST | ๋ฉ๋ชจ ๊ณต์ |
/memo/unshare |
POST | ๋ฉ๋ชจ ๊ณต์ ํด์ |
/comments |
POST | ๋๊ธ ์์ฑ |
/comments/<memo_id> |
GET | ๋๊ธ ์กฐํ |
/comments/<comment_id> |
DELETE | ๋๊ธ ์ญ์ |
/chat |
POST | AI ์ฑ๋ด |
/refresh |
POST | JWT ํ ํฐ ๊ฐฑ์ |
- Python: 3.8+
- MongoDB: 4.0+
- ๋ธ๋ผ์ฐ์ : Chrome, Firefox, Safari