-
์ฌ์ฉ์๊ฐ ์์ด ํํ ๋ฐ ์ธํฐ๋ทฐ๋ฅผ ์ฐ์ตํ ์ ์๋ ํ๋ซํผ
-
์์ด ์ธํฐ๋ทฐ ์ค๋น๊ฐ ์๊ฑฐ๋ ์์ด ์คํผํน ์ค๋ ฅ์ ๊ธฐ๋ฅด๊ณ ์ถ์ ์ฌ๋์ ์ํ ํ๋ซํผ
-
DRF ํ์ฉ ์น ๊ฐ๋ฐ: ๋ชจ๋ ๊ตฌํ์ Django Rest Framework๋ฅผ ์ฌ์ฉํ์ฌ ์งํ
-
API ๊ธฐ๋ฅ ๊ตฌํ: ๊ธฐ์กด OpenAI์์ ์ ๊ณตํ๋ API ๋์ ์ง์ ๊ตฌ์ถํ ์๋ฒ(DRF:Dangro Rest Framework)๋ฅผ ํตํด ์์ฒญ
-
ํ๋ก ํธ์ ๋ฐฑ์ค๋ ๋ถ๋ฆฌ : JS๋ฅผ ํตํด HTTP/HTTPS ๋ฐฑ์๋ ์๋ฒ ํต์
-
์ฌ์ฉ์ ์ธ์ฆ: Simple JWT๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ
-
์ฑ๋ด API: Django ์๋ฒ ๋ด ChatGPT API ๊ตฌํ
-
์ฌ์ฉ ์ ํ: ๊ฐ ์ฌ์ฉ์๋ ํ๋ฃจ์ ์ต๋ 5๋ฒ ์์ฒญ ๊ฐ๋ฅ
-
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ฑํ ๋ด์ญ ์ ์ฅ ๋ฐ ์กฐํ ๊ธฐ๋ฅ
โ Tailwind ์ฌ์ฉ์ผ๋ก css ๊ฐ๊ฒฐํ
โ Github ํ๋ก ํธ ๋ฐฐํฌ, AWS Lightsail ๋ฐฑ์๋ ๋ฐฐํฌ
๐Backend ๋ฐฐํฌ์ฉ : https://github.com/maxkim77/DRFChatService_BE
๐Frontend ๋ฐฐํฌ์ฉ : https://github.com/maxkim77/DRFChatService_FE
-
ํ๋ก ํธ์๋(Git ๋ฐฐํฌ) : https://dev.maxworld7070.net/
-
๋ฐฑ์๋(Nginx ๋ฐฐํฌ) : https://back.maxworld7070.net/
- Tool : Mindmeister
-
DRF ํ์ฉ: ๋ชจ๋ ๊ตฌํ์ Django Rest Framework๋ฅผ ์ฌ์ฉํ์ฌ ์งํ
-
์ฌ์ฉ์ ์ธ์ฆ: ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ
-
์ฑ๋ด API: Django ์๋ฒ ๋ด ChatGPT API ๊ตฌํ
-
์ฌ์ฉ ์ ํ: ๊ฐ ์ฌ์ฉ์๋ ํ๋ฃจ์ ์ต๋ 5๋ฒ ์์ฒญ ๊ฐ๋ฅ
-
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ฑํ ๋ด์ญ ์ ์ฅ ๋ฐ ์กฐํ ๊ธฐ๋ฅ
-
๋๋ฉ์ธ ๋ฐ ๋ฐฐํฌ: ๊ฐ์ธ ๋๋ฉ์ธ ๋ฑ๋ก ๋ฐ HTTPS ์ ์ฉ
-
OAuth2 ์ฐ๋: ์นด์นด์ค, GitHub ๋ฑ OAuth2 ์ฐ๊ฒฐ
| Scope | WBS Level | WBS ID | WBS Element Title | Completion (Completed Date) |
|---|---|---|---|---|
| Planning | 1 | plan1 | WBS, Model, Requirements | โ 11.21. |
| Planning | 1 | plan2 | ERD | โ 11.21. |
| Design | 2 | des1 | Screen Design | โ 11.21. |
| Design | 2 | des2 | URL Design | โ 11.21. |
| Development | 3 | dev1 | Page Implementation | โ 11.22. |
| Development | 3 | dev2 | CRUD Implementation | โ 11.22. |
| Development | 3 | dev3 | User Registration & Login | โ 11.25.(์ผ๋ฐํ ํฐ->JWT ๊ตฌํ์์ ์๊ฐ์ ๋ง์ด ์ฌ์ฉ) |
| Development | 3 | dev4 | Unique User Permissions | โ 11.26 |
| Development | 3 | dev5 | ChatGPT Integration | โ 11.27. |
| UI/UX | 4 | ui1 | UI Implementation | โ 11.27. |
| Deployment | 5 | dep1 | Deployment | โ 11.28. |
| Final Preparations | 6 | prep1 | Readme Completion | โ 11.29. |
| Final Preparations | 6 | prep2 | Presentation Preparation | โ 11.30. |
| Presentation | 7 | pres1 | Final Presentation | โ 12.01. |
๐ฆproject
โฃ ๐accounts
โ โฃ ๐migrations
โ โฃ ๐admin.py
โ โฃ ๐apps.py
โ โฃ ๐managers.py
โ โฃ ๐models.py
โ โฃ ๐tests.py
โ โฃ ๐urls.py
โ โฃ ๐views.py
โ โ ๐__init__.py
โฃ ๐chat
โ โฃ ๐migrations
โ โฃ ๐__pycache__
โ โฃ ๐admin.py
โ โฃ ๐apps.py
โ โฃ ๐models.py
โ โฃ ๐tests.py
โ โฃ ๐urls.py
โ โฃ ๐views.py
โ โ ๐__init__.py
โฃ ๐project
โ โฃ ๐asgi.py
โ โฃ ๐settings.env
โ โฃ ๐settings.py
โ โฃ ๐urls.py
โ โฃ ๐wsgi.py
โ โ ๐__init__.py
โฃ ๐staticfiles
โฃ ๐.env
โฃ ๐.gitignore
โฃ ๐db.sqlite3
โฃ ๐manage.py
โ ๐requirements.txt
๐ฆenv
๐ฆFE
โฃ ๐css
โฃ ๐js
โฃ ๐Repo
โ ๐index.html
- Tool : draw.io
- ์ ์ ์์ฒญ์ ๊ดํ Pool์ ๋ํ๋ธ ํ๋ก์ฐ ์ฐจํธ
- ๊ฐ ํน์ง์ ๋ง๊ฒ Lane์ ๊ตฌ๋ถ ํจ
| ์๋ํฌ์ธํธ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | ์ฑ | ๋น๊ณ |
|---|---|---|---|---|
| /admin/ | - | ๊ด๋ฆฌ์ ํจ๋ ์ ์ | admin | |
| /account/join/ | POST | ์ฌ์ฉ์ ๋ฑ๋ก | accounts | |
| /account/login/ | POST | ๋ก๊ทธ์ธ | accounts | |
| /account/logout/ | POST | ๋ก๊ทธ์์ | accounts | |
| /account/mypage/ | GET | ๋ด์ ๋ณด์กฐํ | accounts | * ๋ก๊ทธ์ธํ mypage๋ก ๋ฆฌ๋ค์ด๋ ํธ ๋ ๋ HTTP ์๋ต 200 ์ฑ๊ณต์ฌ๋ถ ํ ์คํธ ์ฉ url |
| /api/chat/gpt/ | POST | GPT ์ฑ๋ด API | chat | |
| /account/token/ | POST | JWT ํ ํฐ ํ๋ | accounts | |
| /account/token/refresh/ | POST | JWT ํ ํฐ ๊ฐฑ์ | accounts | * ํ๋ก ํธ์์ ์ฒ๋ฆฌํ ๋ JS ์ฝ๋์์ refresh url ๋ถ๋ถ๋ fetch์ ํฌํจํด์ฃผ์ด์ผ accesstoken์ ์ ๋๋ก ๋ฐํํจ |
- HTTP ๋ฉ์๋ ์ฐจ์ด์ ๋ฐ๋ผ ํ์ด์ง ํน์ฑ์ ๋ง๊ฒ ์ ํ
- GET ๋ฐฉ์ : ๋ฐ์ดํฐ๋ฅผ url์ ํฌํจ์์ผ ์ ๋ฌ ex) ์ ๋ณด์กฐํ
- POST ๋ฐฉ์ : ๋ฐ์ดํฐ๋ฅผ HTTP์์ฒญ ๋ณธ๋ฌธ์ ํฌํจ์์ผ ์ ๋ฌ ex) ๋ฐ์ดํฐ ์ ์ถ ๋ฐ ๋ณ๊ฒฝ
๐ (์ฐธ๊ณ ์ฌํญ) API ๊ธฐ๋ฅ๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ช ํํ ์ ๋ฌ ํ๊ธฐ ์ํ Swegger drf-yasg ์ฌ์ฉํ์ฌ ๋ฌธ์ํ
- ์๋ํ๋ ๋ฌธ์ ์์ฑ
- ์ธํฐ๋ ํฐ๋ธํ ํ ์คํ ์ธํฐํ์ด์ค
๐ DRF API Document Pdf : https://drive.google.com/file/d/1kwkup07S1y43iVe64-FYTy0PvZ68nh5c/view?usp=sharing
- Tool : Uizard
-
User Table: CustomUser ๋ชจ๋ธ์์ ๊ธฐ๋ณธํค id, ๊ณ ์ ํ๋ email ํฌํจ ํจ.
-
Chat Table: role ํ๋ ๋ฑ ํฌํจ ํ๊ณ , ์ธ๋ํค id๋ฅผ ํตํด ์ฌ์ฉ์ ํ ์ด๋ธ ์ฐธ์กฐํจ.
-
UserChatRequest Table: UserChatRequest ๋ชจ๋ธ์์ ์ธ๋ํค user_id๋ฅผ ํตํด ์ฌ์ฉ์ ํ ์ด๋ธ ์ฐธ์กฐํ๊ณ , ์์ฒญ ์, ๋ ์ง ํฌํจ.
-
Chat ๋ชจ๋ธ๊ณผ UserChatRequest ๋ชจ๋ธ์์ user ํ๋๋ฅผ ํตํด ์ฌ์ฉ์ ํ ์ด๋ธ๊ณผ ๋ค๋์ผ ๊ด๊ณ
- Tool : draw.io
(Back-End Deployment Stack Features)
-
AWS Lightsail: (Amazon Web Services์ ๊ฐ์ ํ๋ผ์ด๋น ์๋ฒ(VPS) ์๋น์ค) ์๋ฒ, ์คํ ๋ฆฌ์ง, ๋คํธ์ํน, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์ ์ ์ฉ.
-
Ubuntu: (Linux ๊ธฐ๋ฐ ์ด์ ์ฒด์ ) ์๋ฒ ํ๊ฒฝ์ ์ต์ ํ๋์ด ์์ผ๋ฉฐ, ์์ ์ฑ๊ณผ ๋ณด์์ ๊ฐ์ ์ ๊ฐ์ง.
-
Gunicorn: (Python WSGI HTTP ์๋ฒ) Django ์ ํ๋ฆฌ์ผ์ด์ ์คํ๊ณผ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ธํฐ๋ท์ ์ธํฐํ์ด์ค ์ ๊ณต์ ์ฌ์ฉ.
-
Nginx: (HTTP ๋ฐ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ) ํด๋ผ์ด์ธํธ ์์ฒญ์ Gunicorn ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก ์ ๋ฌํ๊ณ ์ ์ ํ์ผ ์ ๊ณต.
- '์ฝ๋์ ๊ฐ์น'์ 'ํจ์จ์ฑ'์ ๋์ด๊ธฐ ์ํด ์๋์ ๋ฐฉ์์ ์ฑํํด ๊ฐ๋ฐ ํจ.
- TDD : ๊ธฐ๋ฅ ๊ตฌํ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋จผ์ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ก
- DRF & Class View : DRF - API ๊ตฌ์ถ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, Class View - View๋ฅผ ์ ์ ํ ๋ ํด๋์ค๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ์
- Simple JWT : ์ผ๋ฐ ํ ํฐ์ ๋นํด ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํด Simple JWT ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํจ.
- ํน๋ณ๊ธฐ๋ฅ : AI, Speech to Text
- ์ฃผ์ ํ์ด์ง ๊ตฌํ
- Signup ๊ธฐ๋ฅ
- Login ๊ธฐ๋ฅ
- Logout ๊ธฐ๋ฅ
- Chat Gpt - DRF ์ฐ๊ฒฐ
Gpt.-.DRF.mp4
- ๋ก๊ทธ์ธ์ ํ ์ ์ ๋ง ์ฌ์ฉ๊ฐ๋ฅ
- ๊ฐ ์ ์ ๋น 5๋ฒ ์์ฒญ ์ ํ
- ์ฑํ ๋ด์ญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ ๋๋ฉฐ ์ฌ๋ก๊ทธ์ธํ ์กฐํ ๊ฐ๋ฅ
(Front-End Deployment)
- Github ๋ฐฐํฌ ์ปค์คํ ๋๋ฉ์ธ ํ์ฑํ / Https ํด์
(Back-End Deployment)
-
Nginx ๋ฐฐํฌ:
- AWS Lightsail์์ Ubuntu ํ๊ฒฝ vscode ssh ์ฐ๊ฒฐ
- Django repository git clone
- Gunicorn ์ค์น ๋ฐ ์ฐ๊ฒฐ
- Nginx ์ค์น / Gunicorn ์ฐ๊ฒฐ ๋ฐ ๋ฐฐํฌ
โ ์ค๋ฅ 1: "400 (Bad Request)" ์ค๋ฅ ๋ฐ์
-
์์ธ: ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ์ ๋ฐ์ดํฐ ๋ถ์ผ์น
-
ํด๊ฒฐ์ฑ :
-
ํ๋ก ํธ์๋ ์์ :
ํ์ ํ๋์ ๋ฐ์ดํฐ ํ์ ํ์ธ ํ ์ ์ก
fetch('http://127.0.0.1:8000/api/user/register/', { method: 'POST', mode: 'cors', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: username, email: email, password: password, password2: confirmPassword }) })
-
ํ๋ก ํธ์๋์์ ์ค๋ฅ ๋ฉ์์ง ์ฒ๋ฆฌ ํ ์๋ฒ ๋ก๊ทธ ์ ์์๋ ํ์ธ
-
โ ์ค๋ฅ 2: AssertionError in Allauth
-
์ฌ์ฉ์ ์ธ์ฆ, ๋ฑ๋ก, ๋ก๊ทธ์ธ, ๋น๋ฐ๋ฒํธ ๊ธฐ๋ฅ๋ฑ ์ ๋๋ก ๋์ ํ์ง ์์ ๋ ๋ฐ์ํ๋ ์๋ฌ ๋ค์
-
์์ธ: ACCOUNT_USERNAME_REQUIRED ์ค์ ์ด False๋ก ๋์ด ์์
-
ํด๊ฒฐ์ฑ :
settings.py์์ACCOUNT_USERNAME_REQUIRED๋ฅผ True๋ก ์ค์
โ ์ค๋ฅ 3: ํ ํฐ ์ ์ฅ ๋ฐ ์ฌ์ฉ ์ค๋ฅ
-
์ผ๋ฐ token ์ธ์ฆ ๊ตฌํ์ ๋ฐ์ํ ์ค๋ฅ
-
ํด๊ฒฐ์ฑ :
-
ํด๋ผ์ด์ธํธ ์ฝ๋ ์์ :
ํ ํฐ ํค ์ผ์น ํ์ธ
localStorage.setItem('token', data.Token);
-
API ํธ์ถ ์ ํ ํฐ ํฌํจ:
Authorization ํค๋์ ํ ํฐ ์ถ๊ฐ
headers: { 'Content-Type': 'application/json', 'Authorization': `Token ${localStorage.getItem('token')}` }
-
โ ์ค๋ฅ 4: Failed to Start A high performance web server and a reverse proxy server
-
nginx๋ฅผ ์ฌ์์ ํ๋ ์ํฉ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํด systemctl status nginx.service ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ธํด ๋ณด๋ ์ ์ค๋ฅ์ ๊ฐ์ด ๋ฐ์ํจ.
-
ํด๊ฒฐ์ฑ :
- sudo nginx -t ๋ฅผ ํตํด ํ์ผ ๋ฌธ๋ฒ ๊ฒ์ฌ๋ฅผ ํด๋ด - nginx.conf ํ์ผ 68๋ฒ์งธ ์ค ๋ฌธ์ ๊ฐ ์์์ ๋ํ๋ด์ ํ์ธ - include /etc/nginx/sites-enabled/*; ์ง์์ด๊ฐ ์ค๋ณต๋์๊ธฐ ๋๋ฌธ์ ์ญ์ - ๋ค์ sudo nginx -t ๋ฅผ ํตํด ๊ฒ์ฌํด๋ณด๋ ๋ฌธ์ ๊ฐ ์์ด์ ์๋ฒ ์ฌ์์
๐ก ์๊ฒ๋ ์ :
-
ํ ํฐ ๊ด๋ จ ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ ๋ฐ ํ ํฐ ๊ด๋ฆฌ ๋ฐฉ์์ ์ฐจ์ด(JWT vs. Token Authentication)๋ฅผ ์๊ฒ ๋จ.
-
ํด๋์ค ์ค์ ์ต์ ์์ ๋จ์ผํด๋์ค์์ ๊ฐ๊ฐ ์๋์ ๊ฐ์ด ์ฐจ์ด๊ฐ ์์์ ์๊ฒ ๋จ.
-
Simple Jwt Authentication in Views
-
์ค์ :
rest_framework_simplejwt.authentication.JWTAuthentication์authentication_classes์ ์ถ๊ฐ -
์ฌ์ฉ ์์:
from rest_framework_simplejwt.authentication import JWTAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework.views import APIView class ExampleView(APIView): authentication_classes = [JWTAuthentication] permission_classes = [IsAuthenticated] def get(self, request): pass
-
-
Token Authentication in Views
-
์ค์ : rest_framework.authentication.TokenAuthentication์ authentication_classes์ ์ถ๊ฐ
-
์ฌ์ฉ ์์:
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class ExampleView(APIView):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
def get(self, request):
pass- DRF์ฑ ์ ์งํํ๋ฉด์ ๊ฐ๋ ๋ง ๊ณต๋ถ๋ฅผ ํ๋๋ฐ, ์ค์ ๋ก ์ ์ฉํด๋ณด๋ ๋จ์ํด๋ณด์ด๋ฉด์๋ ๋งค์ฐ ์ด๋ ต๊ฒ ๋๋
- ํนํ ์ผ๋ฐํ ํฐ์ ํตํด ๊ตฌํ์ ๋ง์ณค์ง๋ง, JWTํ ํฐ๋ ํ๋ฒ ๋์ ํด๋ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ WBS ๊ณํ๋ณด๋ค ๊ธฐ๊ฐ์ ๋๋ ค 6๋ฒ์ ํ๋ก์ ํธ ์ฌ์์ฑ์ ๋์ ํต์ ์ ์ฑ๊ณตํจ
- ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ๊ณต๋ถ๋ฅผ ํ๊ณ ์์ง๋ง, ํ๋ก ํธ๊ฐ๋ฐ์์ ์ํตํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด Js ์ง์๋ ๊ฐ์ถฐ์ผ ํจ์ ๋๋ ์ถ๊ฐ์ ์ผ๋ก Vanilla Js ๋ง๊ณ ๋ React ๋ฑ ๋ค์ํ ๊ณต๋ถ๋ฅผ ํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ฌ
- DRF๋ฅผ ํ๋ฉฐ ์ด๋ ค์ ๋ ์ : ์๊ฐ๋ณด๋ค ์ฐธ๊ณ ํ ๋งํ ๊ฐ์๋ ์์์ด ์ ์๋ ์ . ์ฐพ์๋ณด๋ฉด ๋ธ๋ก๊ทธ ๊ธ์ด ์๊ธดํ๋ฐ ์๋ฌ ์ํฉ์ด ๋ฌ๋ผ ์ ์ฉํ ์ ์์๋์ . ์์ด๋ก ๋ ๊ฐ์๋ ๋ฌธ์๊ฐ ๋ง์๋ ์ . DRF๋ GPT์ ํ ๋ฃจ์๋ค์ด์ ์ด ์กฐ๊ธ ์ฌํ๋ ์
- ํ์ง๋ง ์ด๋ ค์ด ๋งํผ DRF๋ ํฌ์์ฑ ์๊ณ ๊ฒฝ์๋ ฅ ์๋ ๊ธฐ์ ์ด๋ผ๋ ์๊ฐ์ด ๋ฌ
- ์๋ฒ ๋ฐฐํฌ๋ฅผ ํ๋ฉฐ ์ด๋ ค์ ๋ ์ : ๋ง์ฐฌ๊ฐ์ง๋ก ๊ด๋ จ ํ๊ตญ์ด ๊ฐ์ ๋ฑ์ด ์ ์ด ์ ์ฉํ๊ธฐ ์ด๋ ค์ ์. ๊ธ๋ง ๋ณด๊ณ ์ดํดํ๊ธฐ ๋ถ์กฑํ๋ค๋ ๋๋์ด ๋ฌ.
- ์ค์ ๋ฐฑ์๋ ๋ฐฐํฌ๋ฅผ AWSlightsail Ubuntu, Gunicorn, Nginx ๋ฑ์ ํตํด ํด๋ณด๋ ์๋ฒ๊ด๋ จ ๊ฐ ์คํ๋ค์ ๋ํด ๊ฐ๋ต์ ์ธ ๋๋์ ์ตํ ์ ์์์












