- ๋ชฉํ :
โ๏ธ Django๋ฅผ ์ด์ฉํ AI Image ๊ฐค๋ฌ๋ฆฌํ ๋ธ๋ก๊ทธ ๊ฐ๋ฐ
โ๏ธ ์ ์ ๋ค์ด Stable Diffusion API๋ฅผ ํตํด AI Image ์์ฑํ ์ ๋ก๋ ๋ฐ ๊ณต์ ํ๋ฉฐ AI Image์ ๊ด๋ จ ์ ๋ณด ๊ณต์
- ๋ฐฐ๊ฒฝ:
โ๏ธ Stable Diffusion, Dalle ๋ฑ AI Image์ ๊ธฐ์ ์ ๋ฐ๋ฌ
โ๏ธ AI ์ด๋ฏธ์ง์ ๋ํ ๊ด์ฌ๊ณผ AI์ด๋ฏธ์ง์ฉ ๋ธ๋ก๊ทธ ์ฃผ์ ๊ฐ ๋ง์ด ์๋ค๊ณ ์๊ฐ๋์ด ํด๋น ์ฃผ์ ๋ก ๋ธ๋ก๊ทธ ๊ฐ๋ฐ
- CRUD, ๋ก๊ทธ์ธ/ํ์๊ฐ์ , ๋๊ธ, ์ด๋ฏธ์ง ์ ๋ก๋, ์กฐํ์ ๊ธฐ๋ฅ ๊ตฌํ
- ๋ธ๋ก๊ทธ ํฌ์คํ
- ๋๊ธ ๊ธฐ๋ฅ
- ํ๊ทธ ๋ฐ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ
- UI ์คํ์ผ๋ง
- ํด๋์คํ ๋ทฐ ๋ฐ ํจ์ํ ๋ทฐ ์ค ํ ๊ฐ๋ฐ
- ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ตฌ์กฐ ์ค๊ณ
- ๋ชจ๋๋ก๊ทธ์ ์ฅ๊ณ
- 0๋จ๊ณ: Django Admin์ ์ด์ฉํ ๊ฒ์๊ธ ์ฝ๊ธฐ ๋ฐ ๋ฉ์ธํ์ด์ง ๊ตฌํํ๊ธฐ
- 1๋จ๊ณ: ๋ธ๋ก๊ทธ CRUD ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
- 2๋จ๊ณ: ๋ก๊ทธ์ธ/ํ์๊ฐ์ ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๋ธ๋ก๊ทธ ๊ตฌํํ๊ธฐ
- 3๋จ๊ณ: ๋ธ๋ก๊ทธ ๊ธฐ๋ฅ ์ธ ์ถ๊ฐ ๊ธฐ๋ฅ ์์ฑ ๋ฐ ๋ฐฐํฌ
-
4๊ฐ์ ์ฑ(main, accounts, blog(๋ฉ์ธ ๊ฐค๋ฌ๋ฆฌํ ๊ฒ์ํ), boardapp(๋ณด์กฐํ ์์ ๊ฒ์ํ))์ผ๋ก ๊ตฌ์ฑ
-
ํด๋์ค๋ทฐ ๋ฐ ํจ์ํ๋ทฐ
- ํด๋์ค ๋ทฐ๋ ์ ๋๋ฆญ๋ทฐ, ๋ฏน์ค์ธ๋ทฐ์ ์ฌ์ฉํ ์ ์๋ 'ํ์ฅ์ฑ'๊ณผ '์ฌ์ฌ์ฉ์ฑ'์ด๋ผ๋ ์ฅ์ ์ผ๋ก ์ฃผ์ ์ฑ(main, accounts,blog) ๋ ํด๋์คํ์ผ๋ก ์์ฑ
- ํจ์ํ ๋ทฐ๋ '๊ฐ๊ฒฐ'ํ๊ณ '์ง๊ด'์ ์ธ ํน์ง์ผ๋ก ๊ฐํธํ๊ฒ ์ฐ์ผ ์์๋ ๋ณด์กฐํ ์์ ๊ฒ์ํ์์ ์์ฑ
-
ํฌ์คํธ ๊ธฐ๋ฅ์ผ๋ก ์ข์์, ํ๊ทธ, ๋๋๊ธ, ์นดํ ๊ณ ๋ฆฌ ๋ฑ์ ์ฌ์ฉ ํจ
- ๋๊ธ์ ๋ฉ์ธ ๊ฐค๋ฌ๋ฆฌํ ๋ธ๋ก๊ทธ๋ ๋๋๊ธํ
- ๋ณด์กฐ ์์ ๊ฒ์ํ์ ์ผ๋ฐ ๋๊ธํ ๊ตฌํ
[FE]:
[BE]:
[API]:
[ENV]:
- ๋ถํธ์คํธ๋ฉ์ Startbootstrap์์ ํ ๋ง๋ฅผ ๋ฐ์ด
- ํน์ด์ฌํญ์ผ๋ก๋ tawk.to๋ผ๋ ์ค์๊ฐ ์ฑํ ์๋ฃจ์ ๊ณผ StableDiffusion API๋ก ์ด๋ฏธ์ง ์์ฑ ๊ฐ๋ฅํ๊ฒ ํจ(๋ฐฐํฌ ๋ฒ์ ผ์์๋ ํ์ฌ๋ ํ ํฐ์ ์์ง์ผ๋ก ์์ฑ์ด ์๋๋ ์ํฉ)
- Github์ ์ ๋ก๋ํ ๋ ํ์งํ ๋ฆฌ๋ฅผ AWS lightsail์ clone ํ์ฌ ๋ฐฐํฌ
3.2 ๋ฐฐํฌ URL: http://54.180.146.126:8000/
- ํ๋ก์ ํธ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ด accounts, blog, boardapp, main 4๊ฐ๋ก ๊ตฌ์ฑ๋จ
๐ฆmysite
โฃ ๐accounts
โ โฃ ๐models.py
โ โฃ ๐urls.py
โ โฃ ๐views.py
โฃ ๐blog
โ โฃ ๐models.py
โ โฃ ๐urls.py
โ โฃ ๐views.py
โฃ ๐boardapp
โ โฃ ๐models.py
โ โฃ ๐urls.py
โ โฃ ๐views.py
โฃ ๐main
โ โฃ ๐urls.py
โ โฃ ๐views.py
โฃ ๐templates
โ โฃ ๐accounts
โ โฃ ๐blog
โ โฃ ๐boardapp
โ โฃ ๐main
โฃ ๐static
โ โฃ ๐css
โ โฃ ๐js
โ โ โ ๐scripts.js
โฃ ๐media
โ โฃ ๐blog
โ โ โฃ ๐images
โฃ ๐tutorialdjango
โ โฃ ๐settings.py
โ โฃ ๐urls.py
โ ๐manage.py
- main
| App | URL | Views Function | HTML File Name | Note |
|---|---|---|---|---|
| main | '/' | home | main/home.html | ํํ๋ฉด |
| main | '/about/' | about | main/about.html | ์๊ฐํ๋ฉด |
| main | '/generator/' | generator | main/generator.html | AI์ด๋ฏธ์ง ์์ฑ๊ฒ์ํ |
- accounts
| App | URL | Views Function | HTML File Name | Note |
|---|---|---|---|---|
| accounts | 'register/' | register | accounts/register.html | ํ์๊ฐ์ |
| accounts | 'login/' | login | accounts/login.html | ๋ก๊ทธ์ธ |
| accounts | 'logout/' | logout | accounts/logout.html | ๋ก๊ทธ์์ |
| accounts | 'profile/' | profile | accounts/profile.html | ๋น๋ฐ๋ฒํธ๋ณ๊ฒฝ๊ธฐ๋ฅ / ํ๋กํ ์์ / ๋๋ค์์ถ๊ฐ |
- boardapp
| App | URL | Views Function | HTML File Name | Note |
|---|---|---|---|---|
| boardapp | 'board/' | board | boardapp/post_list.html | ๊ฒ์ํ ๋ชฉ๋ก |
| boardapp | 'board/int:pk/' | post_detail | boardapp/post_detail.html | ๊ฒ์๊ธ ์์ธ๋ณด๊ธฐ |
| boardapp | 'board/write/' | post_write | boardapp/post_write.html | ๊ฒ์๊ธ ์์ฑ |
| boardapp | 'board/edit/int:pk/' | post_edit | boardapp/post_edit.html | ๊ฒ์๊ธ ์์ |
| boardapp | 'board/delete/int:pk/' | post_delete | boardapp/post_delete.html | ๊ฒ์๊ธ ์ญ์ |
| boardapp | 'board/int:pk/comment/' | comment_create | boardapp/comment_form.html | ๋๊ธ ์์ฑ |
| boardapp | 'board/int:pk/comment/ int:comment_pk/edit/' |
comment_edit | boardapp/comment_form.html | ๋๊ธ ์์ |
| boardapp | 'board/int:pk/comment/ int:comment_pk/delete/' |
comment_delete | boardapp/comment_ confirm_delete.html |
๋๊ธ ์ญ์ |
- blog
| App | URL | Views Function | HTML File Name | Note |
|---|---|---|---|---|
| blog | 'blog/' | blog | blog/blog.html | ๊ฐค๋ฌ๋ฆฌํ ๊ฒ์ํ ๋ฉ์ธ ํ๋ฉด |
| blog | 'blog/int:pk/' | post | blog/post.html | ์์ธ ํฌ์คํธ ํ๋ฉด |
| blog | 'blog/write/' | write | blog/write.html | ์นดํ
๊ณ ๋ฆฌ ์ง์ , ์ฌ์ง์
๋ก๋, ๊ฒ์๊ธ ์กฐํ์ ๋ฐ์ |
| blog | 'blog/edit/int:pk/' | edit | blog/edit.html | ๊ฒ์๋ฌผ๋ชฉ๋ก๋ณด๊ธฐ |
| blog | 'blog/delete/int:pk/' | delete | blog/delete.html | ์ญ์ ํ๋ฉด |
| blog | 'blog/search/' | search | blog/search.html | ์ฃผ์ ์ ์นดํ
๊ณ ๋ฆฌ์ ๋ฐ๋ผ ๊ฒ์, ์๊ฐ์์ ๋ฐ๋ผ ์ ๋ ฌ |
| blog | 'post/int:post_pk/comment/' | comment_new | blog/comment_form.html | ๋๊ธ ์ ๋ ฅ ํผ |
| blog | 'post/int:post_pk/comment/ int:parent_pk/' |
reply_new | blog/comment_form.html | ๋๋๊ธ ํผ |
| blog | 'post/int:pk/like/' | like_post | blog/post.html | ์ข์์๋ฅผ ๋๋ฅด๋ฉด blog/post๋ก Redirect๋จ |
| blog | 'comment/int:pk/update/' | comment_update | blog/comment_form.html | ๋๊ธ ์ ๋ฐ์ดํฐ ๊ฒฝ๋ก |
| blog | 'comment/int:pk/delete/' | comment_delete | blog/comment_ confirm_delete.html |
๋๊ธ ์ญ์ ํผ |
- ๋ฉ์ธ ํ์ด์ง
- ์ค๋ช ํ์ด์ง
- ์ด๋ฏธ์ง์์ฑ ํ์ด์ง
- ๊ฒ์ํํ ๋ธ๋ก๊ทธ ํ์ด์ง
- ๊ฐค๋ฌ๋ฆฌํ ๋ธ๋ก๊ทธ ํ์ด์ง
- ๋ก๊ทธ์ธ/ํ์๊ฐ์ ํ์ด์ง ๋ฑ
- users, Post, Comment, Tag, PostLikes, PostTags, UserProfile, Board, BoardComment, Boardlikes(์ด 10๊ฐ์ ํ ์ด๋ธ)
- Post์ Board์ id ํ๋๋ users ํ ์ด๋ธ์ id ํ๋์ ์ฐ๊ฒฐ
- ๋ค๋๋ค ๊ด๊ณ : PostLikes โ (Post ์ User) / PostTags โ (Post ์ Tag)
- ๋ค๋์ผ ๊ด๊ณ : BoardComment - Board / Boardlikes - User
๐ ๋ฉ์ธํ์ด์ง ๊ตฌํ
- ํ์ด์ง ์ ๋ชฉ๊ณผ ๋ธ๋ก๊ทธ ์ ์ฅํ๊ธฐ ๋ฒํผ
- ํ์๊ฐ์ /๋ก๊ทธ์ธ ๋ฒํผ
- ํ์๊ฐ์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํ์๊ฐ์ ํ์ด์ง๋ก ์ด๋
- ๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋
๐ ํ์๊ฐ์ / ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ
- ํ์๊ฐ์ ์ ํ ์ ์๋ ํ์ด์ง
- ์ ๋ ฅ๋ฐ๋ ๊ฐ์ id, password
- ๋ก๊ทธ์ธ์ ํ ์ ์๋ ํ์ด์ง
- ์ ๋ ฅ๋ฐ๋ ๊ฐ์ id, password
๐ ๊ฒ์๊ธ ์์ฑ ๊ธฐ๋ฅ ๊ตฌํ
- ๋ก๊ทธ์ธ์ ํ ์ ์ ๋ง ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉ ํ ์ ์์
- ๊ฒ์๊ธ ์ ๋ชฉ๊ณผ ๋ด์ฉ์ ์์ฑ ํ ์ ์๋ ํ์ด์ง๊ฐ ์์
- ์์ฑํ ๊ฒ์๊ธ์ด ์ ์ฅ๋์ด ๊ฒ์๊ธ ๋ชฉ๋ก์ ๋ณด์ฌ์ผ ํจ
- ์ฌ์ง ์ ๋ก๋๊ฐ ๊ฐ๋ฅํ๋๋ก ํจ
- ๊ฒ์๊ธ ์กฐํ์๊ฐ ์ฌ๋ผ๊ฐ ์ ์๋๋ก ํจ
๐ ๊ฒ์๊ธ ๋ชฉ๋ก ๊ธฐ๋ฅ ๊ตฌํ
- ๋ชจ๋ ์ฌ์ฉ์๋ค์ด ๊ฒ์ํ ๋ธ๋ก๊ทธ ๊ฒ์๊ธ๋ค์ ์ ๋ชฉ์ ํ์ธ ํจ
๐ ๊ฒ์๊ธ ์์ธ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
- ๊ฒ์๊ธ์ ์ ๋ชฉ/๋ด์ฉ์ ๋ณด๋ ๊ธฐ๋ฅ
๐ ๊ฒ์๊ธ ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํ

- ์ฃผ์ ์ ํ๊ทธ์ ๋ฐ๋ผ ๊ฒ์์ด ๊ฐ๋ฅ
- ๊ฒ์ํ ๊ฒ์๋ฌผ์ ์ต์ ์์ ๋ฐ๋ผ ์ ๋ ฌ
๐ ๊ฒ์๊ธ ์์ ๊ธฐ๋ฅ ๊ตฌํ
- ๋ก๊ทธ์ธ์ ํ ์ ์ ๋ง ํด๋น ๊ธฐ๋ฅ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ณธ์ธ์ ๊ฒ์๊ธ์ด ์๋๋ผ๋ฉด ์์ ์ด ๋ถ๊ฐ๋ฅ
- ๊ฒ์๊ธ์ ์ ๋ชฉ ๋๋ ๋ด์ฉ์ ์์ ํ๋ ๊ธฐ๋ฅ
- ์์ ๋ ๋ด์ฉ์ ๊ฒ์๊ธ ๋ชฉ๋ก๋ณด๊ธฐ/์์ธ๋ณด๊ธฐ์ ๋ฐ์
๐ ๊ฒ์๊ธ ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ
- ๋ก๊ทธ์ธ์ ํ ์ ์ ๋ง ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉ ํ ์ ์์
- ๋ณธ์ธ์ ๊ฒ์๊ธ์ด ์๋๋ผ๋ฉด ์์ ์ด ๋ถ๊ฐ
- ๊ฒ์๊ธ์ ์ญ์ ํ๋ ๊ธฐ๋ฅ
- ์ญ์ ๋ฅผ ์๋ฃํ ์ดํ์ ๊ฒ์๊ธ ๋ชฉ๋ก ํ๋ฉด์ผ๋ก ๋์๊ฐ
- ์ญ์ ๋ ๊ฒ์๊ธ์ ๊ฒ์๊ธ ๋ชฉ๋ก๋ณด๊ธฐ/์์ธ๋ณด๊ธฐ์์ ์ ๊ทผ์ด ๋ถ๊ฐ
๐ ํ์ ๊ด๋ จ ์ถ๊ฐ ๊ธฐ๋ฅ(UI ์ง์ ๊ตฌํ ํ์)
- ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ๊ธฐ๋ฅ
- ํ๋กํ ์์
- ๋๋ค์(Username) ์ถ๊ฐ
๐ ๋๊ธ ๊ธฐ๋ฅ(UI ์ง์ ๊ตฌํ ํ์)
- ๋๊ธ ์ถ๊ฐ
- ๋๊ธ ํธ์ง/์ญ์
- ๋๋๊ธ
๐ ๋ถ๊ฐ ๊ธฐ๋ฅ
- ์ ์ ํ์ผ ๋ชจ์ผ๊ธฐ (collectstatic)
# settings.py
# ์ ์ ํ์ผ ๊ธฐ๋ณธ URL
STATIC_URL = '/static/'
# ์ถ๊ฐ์ ์ธ ์ ์ ํ์ผ ๋๋ ํ ๋ฆฌ (๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฌ์ฉ)
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
#(์ด์ํ๊ฒฝ์์ ์ฌ์ฉ)
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
์๋ฒ์์ python manage.py collectstatic ๋ช ๋ น ์ ๋ ฅ
- ๊ณต์ง์ฌํญ ๊ธฐ๋ฅ
- ๊ด๋ฆฌ์๋ง ๊ด๋ฆฌ์ํ์ด์ง์์ ์ค์ ๊ฐ๋ฅ
- ๋ชจ๋ธ์์ is_notice ์ค์
- views.py์์ get_context_data ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต์ง์ฌํญ๊ณผ ์ผ๋ฐ ๊ฒ์๊ธ์ ๋ถ๋ฆฌ
# models.py
class Post(models.Model):
# <์๋ต>
is_notice = models.BooleanField(default=False, verbose_name="๊ณต์ง์ฌํญ ์ฌ๋ถ")
# views.py
class BlogListView(ListView):
# <์๋ต>
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
notice_list = Post.objects.filter(is_notice=True).order_by('-created_at')
regular_post_list = Post.objects.filter(is_notice=False).order_by('-created_at')
# <์๋ต>
- Tawk API๋ฅผ ํ์ฉํ ์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ(About ํ์ด์ง)
๐ Link : https://www.tawk.to/
- Stable Diffusion์ ํ์ฉํ AI ์ด๋ฏธ์ง ์์ฑ ํ๋ฉด(Generator ํ์ด์ง)
๐ Link : https://stablediffusionapi.com/docs/stable-diffusion-api/text2img
๐ (์ ํ) AWS Lightsail๋ก ๋ฐฐํฌ
๐ Link : https://aws.amazon.com/ko/lightsail/
Video.2.mp4
- RDBMS Postgre๋ฅผ ์ฌ์ฉํ์ฌ Django์ ์ฐ๊ฒฐํ post ์ฟผ๋ฆฌ ์กฐํ
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'tutorialdjango',
'USER': 'postgres',
'PASSWORD': '1234',
'HOST': 'localhost',
'PORT': '5432',
}
}
๐ IntegrityError
- ์๋ฌ๋ช : 'IntegrityError'
- ๋ฌธ์ ์ํฉ: ๋ชจ๋ธ ํ๋๊ฐ null ๊ฐ์ ํ์ฉ ์ํจ
- ํด๊ฒฐ๋ฐฉ์: ํด๋น ํ๋์ 'null=True' ์ต์ ์ถ๊ฐ
# models.py
summary = models.TextField(null=True)๐ก ํด๋์คํ ๋ทฐ ๋ชฉ๋ก
-
์ ๋๋ฆญ๋ทฐ
- ListView: ๊ฒ์๋ชฉ๋ก์ ๋ณด์ฌ ์ค
- DetailView: ๊ฒ์๋ฌผ ์์ธ ์ ๋ณด ๋ณด์ฌ ์ค
- CreateView: ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑ
- UpdateView: ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์
- DeleteView: ๊ฐ์ฒด๋ฅผ ์ญ์ ํ ๋ ์ฌ์ฉ
- TemplateView: ์ ์ ํ์ด์ง๋ฅผ ๋ ๋๋ง
-
๋ฏน์ค์ธ(Mixins)
- LoginRequiredMixin: ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํด์ผ๋ง ์ ๊ทผ ํ ์ ์๋ ๋ทฐ
- UserPssesTextMixin: ์ฌ์ฉ์๊ฐ ํน์ ํ ์คํธ๋ฅผ ํต๊ณผํด์ผ๋ง ๋ทฐ์ ์ ๊ทผ
๐ก django-widget-tweaks
- Django์ ํผ ํ๋์ HTML์ ๋ณด๋ค ์ฝ๊ฒ ์ ์ดํ ์ ์๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ CSS ํด๋์ค ์ถ๊ฐ, ์์ฑ ๋ณ๊ฒฝ ๊ฐ๋ฅ
{% load widget_tweaks %}
<form method="post">
{% csrf_token %}
</form>{% render_field form.field_name class="form-control" %} # ํ๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ ๋๋งํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
{{ field|add_class:"form-control" }} # | ๊ธฐํธ๋ ํํฐ๋ฅผ ์๋ฏธ ์ด ํํฐ๋ ์ง์ ๋ ํ๋์ ํด๋์ค๋ฅผ ์ถ๊ฐ๋ณธ ํ๋ก์ ํธ์์๋ ๋ ๋ฒ์งธ ๋ฐฉ์์ผ๋ก ํด๋์ค์ ๋ถํธ์คํธ๋ฉ ํด๋์ค๋ฅผ ์ถ๊ฐํ์ฌ ๋์์ธ ํ์์
๐ก ๋๋๊ธ ๊ตฌํ ๋ฐฉ์
- Comment ๋ชจ๋ธ์ parent ํ๋๋ฅผ ํตํด ๊ตฌํ
- ์ฌ์ฉ์๊ฐ B๋ผ๋ ๋๊ธ์ ๋ฌ ๋ A์ ๋๋๊ธ๋ก ์ง์ ํ๋ ค๋ ๊ฒฝ์ฐ, A๋ผ๋ ๋๋๊ธ ID๋ parent_pk ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ
- CommentCreateView ์์ ์ด๋ฅผ ํ์ธํ์ฌ B ๋๊ธ์ ๋ถ๋ชจ๋๊ธ 'parent' ๋๊ธ๋ก A๋ฅผ ์ค์
- ์ด๋ ๋ฏ parent ํ๋๋ฅผ ํตํด ๋ถ๋ชจ-์์๊ฐ์ ๊ด๊ณ๊ฐ ํ์ฑ๋จ
- ํ ํ๋ฆฟ์์๋ ์ฃผ๋๊ธ์ ๋ํ ๋ฃจํ๋ฅผ ๋๋ฉด์ replies ๊ด๊ณ ํ์ฑ
{% for reply in comment.replies.all %}
{% endfor %}- Django์ ํธ๋ฆฌํจ๊ณผ Python์ ๊ฐ๋ ฅํจ์ ๋๋ ์ ์์๋ ์ ์ตํ ํ๋ก์ ํธ์์
- ์คํ๋ง๋ถํธ ์๋ฐ ๊ฐ์๋ฅผ ์กฐ๊ธ์ฉ ๋ฃ๊ณ ์๋๋ฐ ๋ง์ ๊ฒฝํ์ด ์๋๊ฑด ์๋์ง๋ง ๋ฐ๋ฅธ ํ๋ ์ ์ํฌ์ ๋นํด ํจ์จ์ ์ด๊ณ ๋น ๋ฅด๊ฒ ๊ฒ์ํ์ ๋ง๋ค ์ ์์์ ๋๋
- ํจ์ํ๊ณผ ํด๋์คํ ๋ทฐ ์ฝ๋๋ฅผ ๋ชจ๋ ์ฌ์ฉํด๋ณด๊ธฐ ์ํด ์ฑ ๊ฐ์๊ฐ ๋์ด๋๋ค ๋ณด๋ URL์ด ๋ณต์กํด์ก์ง๋ง, ๋์ ์ฐจ์ด์ ์ ๋ํด ์ ์ ์์์
- ์ฅ๊ณ ์ ๋ค์ํ ๊ธฐ๋ฅ๊ณผ ์ฝ๋ ๋ฐฉ์์ ๋ํด ๊น์ด ์ฐ๊ตฌ ํ ์ ์๋ ๊ธฐํ๊ฐ ๋จ
- AWS ๋ฐฐํฌ๋ฅผ ํตํด ์๋ง์กด ์น ์๋น์ค๋ฅผ ์ฒ์ ํ์ฉ ํด๋ณผ ์ ์๋ ์ข์ ๊ธฐํ๊ฐ ๋จ
๐ Velog : https://han.gl/btewiM
โค๏ธ EST soft : ๋์ ์์ ํ๋ก์ ํธ(https://url.kr/br6yg7)












