Django ORM์์ `update()`์ `save()`์ ์ฐจ์ด
Django ORM์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ์ ์ฅํ๋ ๊ณผ์ ์์ `update()`์ `save()`๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํ์ง๋ง ์ด ๋์ ๋์ ๋ฐฉ์์ ๋ค๋ฅด๋ฉฐ, ๋ฐ์ดํฐ๊ฐ DB์ ๋ฐ์๋๋ ๋ฐฉ์์์๋ ์ฐจ์ด๊ฐ ์๋ค.
1. `update()`: QuerySet์ ํตํ ๋๋ ์ ๋ฐ์ดํธ
โ ํน์ง
- `update()`๋ QuerySet์ ์ง์ ์กฐ์ํ์ฌ DB์ ๋ฐ์ํ๋ ๋ฐฉ์์ด๋ค.
- ๋จ์ผ ๊ฐ์ฒด๊ฐ ์๋๋ผ ์ฌ๋ฌ ๊ฐ์ ๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์ ๋ฐ์ดํธํ ์๋ ์๋ค.
- Django ๋ชจ๋ธ์ `save()` ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ → ์ฆ, `pre_save` ๋ฐ `post_save` ๊ฐ์ ์ ํธ(signals)๋ ํธ๋ฆฌ๊ฑฐ๋์ง ์๋๋ค.
โ ์ฌ์ฉ ์์
from myapp.models import User
# ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ํ ๋ฒ์ ์
๋ฐ์ดํธ
User.objects.filter(is_active=False).update(is_active=True)
โ ๋์ ๋ฐฉ์
- `update()`๋ SQL์ `UPDATE` ๋ฌธ์ ์ง์ ์คํํ์ฌ ์กฐ๊ฑด์ ๋ง๋ ๋ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
- ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ง ์๊ณ ๋ฐ๋ก DB๋ฅผ ๋ณ๊ฒฝํ๋ฏ๋ก ์ฑ๋ฅ์ด ๋ ์ข๋ค.
- `save()`๊ฐ ํธ์ถ๋์ง ์์ผ๋ฏ๋ก, ๋ชจ๋ธ์์ ์ค๋ฒ๋ผ์ด๋ฉํ `save()` ๋ก์ง์ด ์ ์ฉ๋์ง ์๋๋ค.
โ ์ฅ์ ๊ณผ ๋จ์
์ฅ์ | ๋จ์ |
๋๋ ์ ๋ฐ์ดํธ ๊ฐ๋ฅ (QuerySet ๊ธฐ๋ฐ) | `save()`๋ฅผ ํธ์ถํ์ง ์๊ธฐ ๋๋ฌธ์ ํ์ฒ๋ฆฌ ๋ก์ง์ด ์คํ๋์ง ์์ |
๋ ์ ์ SQL ์ฟผ๋ฆฌ๋ก ์ฑ๋ฅ์ด ํฅ์๋จ | `pre_save`, `post_save` ๊ฐ์ signals๊ฐ ์คํ๋์ง ์์ |
๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ๋ฐฉ์งํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ด ์ข์ | ๋ชจ๋ธ์ ์ปค์คํ ํ๋ ๋ก์ง์ด ์ ์ฉ๋์ง ์์ ์ ์์ |
2. `save()`: ๊ฐ๋ณ ๊ฐ์ฒด ์ ์ฅ
โ ํน์ง
- `save()`๋ ๋จ์ผ ๊ฐ์ฒด์ ๋ณ๊ฒฝ ์ฌํญ์ DB์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
- ๊ฐ์ฒด์ ํ๋๋ฅผ ๋ณ๊ฒฝํ ํ `save()`๋ฅผ ํธ์ถํ๋ฉด ํด๋น ๊ฐ์ฒด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ํ๋ก ์ ์ฅ๋๋ค.
- ๋ชจ๋ธ์ `save()` ๋ฉ์๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ก์ง๊ณผ signals(`pre_save`, `post_save`)๊ฐ ์คํ๋จ.
โ ์ฌ์ฉ ์์
from myapp.models import User
# ํน์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์์ ํ ์ ์ฅ
user = User.objects.get(id=1)
user.is_active = True
user.save()
โ ๋์ ๋ฐฉ์
- ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ ํ ๋ณ๊ฒฝ๋ ํ๋๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
- ๋ชจ๋ธ์ ์ ์๋ `save()` ๋ฉ์๋๊ฐ ์คํ๋๋ฉฐ, ํ์ํ๋ฉด ์ถ๊ฐ์ ์ธ ๋ก์ง์ ์ฒ๋ฆฌํ ์ ์๋ค.
โ ์ฅ์ ๊ณผ ๋จ์
์ฅ์ | ๋จ์ |
๋ชจ๋ธ์ `save()` ๋ฉ์๋๋ฅผ ์คํํ์ฌ ์ปค์คํ ๋ก์ง์ ์ ์ฉ ๊ฐ๋ฅ | ๋ค์์ ๊ฐ์ฒด๋ฅผ ํ ๋ฒ์ ์ ๋ฐ์ดํธํ๊ธฐ ์ด๋ ต๊ณ , ๊ฐ๋ณ ํธ์ถํด์ผ ํจ |
`pre_save`, `post_save` ๋ฑ์ Django signals๊ฐ ์คํ๋จ | ๊ฐ์ฒด๋ฅผ ๋จผ์ ๋ก๋ํด์ผ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง์์ง ์ ์์ |
๊ฐ๋ณ ๊ฐ์ฒด์ ๋ํ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅ | ์ฑ๋ฅ์ ์ผ๋ก `update()`๋ณด๋ค ๋๋ฆด ์ ์์ |
3. `update()`์ `save()`์ ์ฐจ์ด์ ์ ๋ฆฌ
๋น๊ต ํญ๋ชฉ | `update()` | `save()` |
๋์ | QuerySet (์ฌ๋ฌ ๊ฐ์ฒด) | ๋จ์ผ ๊ฐ์ฒด |
์คํ ๋ฐฉ์ | SQL UPDATE ์คํ | Python ๊ฐ์ฒด์ ๋ฉ์๋ ์คํ ํ ์ ์ฅ |
์ฑ๋ฅ | ๋ ๋น ๋ฆ (DB์ ๋ฐ๋ก ์ ์ฉ) | ๋ ๋๋ฆผ (๊ฐ์ฒด ๋ก๋ ํ ์ ์ฅ) |
`save()` ์ค๋ฒ๋ผ์ด๋ฉ ์ ์ฉ | โ ์ ์ฉ๋์ง ์์ | โ ์ ์ฉ๋จ |
Signals (`pre_save`, `post_save`) | โ ์คํ๋์ง ์์ | โ ์คํ๋จ |
๋๋ ์ ๋ฐ์ดํธ | โ ๊ฐ๋ฅ | โ ๋ถ๊ฐ๋ฅ |
๋ชจ๋ธ์ ์ถ๊ฐ ๋ก์ง ์คํ | โ ์คํ๋์ง ์์ | โ ์คํ๋จ |
4. ์ธ์ `update()`๋ฅผ ์ฌ์ฉํ๊ณ , ์ธ์ `save()`๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
โ `update()`๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
- ์ฌ๋ฌ ๊ฐ์ ๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์ ๋ฐ์ดํธํด์ผ ํ ๋
- ์ฑ๋ฅ์ ์ต์ ํํด์ผ ํ ๋ (DB์์ ์ง์ ์คํ๋๋ฏ๋ก ๋ ๋น ๋ฆ)
- ๋ชจ๋ธ์ `save()` ๋ฉ์๋๋ signals๋ฅผ ํธ๋ฆฌ๊ฑฐํ ํ์๊ฐ ์์ ๋
- ์์: ๋นํ์ฑํ๋ ๋ชจ๋ ์ฌ์ฉ์์ ์ํ๋ฅผ ํ์ฑํํ๋ ๊ฒฝ์ฐ
User.objects.filter(is_active=False).update(is_active=True)
โ `save()`๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
- ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์์ ํ๊ณ ์ ์ฅํ ๋
- ๋ชจ๋ธ์ `save()` ๋ฉ์๋์์ ์ถ๊ฐ์ ์ธ ๋ก์ง์ด ์์ ๋
- signals(`pre_save`, `post_save`)๋ฅผ ์คํํด์ผ ํ ๋
- ์์: ํน์ ์ฌ์ฉ์์ ์ด๋ฉ์ผ์ ๋ณ๊ฒฝํ๊ณ ํ์ฒ๋ฆฌ ์์ ์ ์คํํด์ผ ํ ๋
user = User.objects.get(id=1)
user.email = "newemail@example.com"
user.save() # post_save signal์ด ์คํ๋จ
5. ๊ฒฐ๋ก
- `update()`: ๋๋ ์ ๋ฐ์ดํธ์ ์ ๋ฆฌํ์ง๋ง, `save()`์ ๋ก์ง์ ์ ์ฉํ ์ ์์.
- `save()`: ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ๋ ์ ํฉํ๋ฉฐ, ์ ํธ(signals)์ ์ค๋ฒ๋ผ์ด๋ฉ๋ `save()`๊ฐ ์คํ๋จ.
์ฆ, ๋น ๋ฅธ ์ฑ๋ฅ์ด ํ์ํ๊ณ ์ ํธ(signals)๋ ์ถ๊ฐ ๋ก์ง์ด ํ์ํ์ง ์๋ค๋ฉด `update()`๋ฅผ, ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ฉด์ ์ปค์คํ ๋ก์ง์
์คํํด์ผ ํ๋ค๋ฉด `save()`๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
'AI ๐ค > Django โ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250310] WebSocket์ด๋? (1) | 2025.03.10 |
---|---|
[250305] Soft Delete๋? (0) | 2025.03.05 |
[250219] Json Web Token์ ๋ํ์ฌ,,, (0) | 2025.02.19 |
[250217] ์ธ์ฆ(Authentication)๊ณผ ๊ถํ(Authorization) (0) | 2025.02.17 |
[250213] API ๋ช ์ธ์ ์์ฑ๋ฒ๊ณผ ํ์์ฑ์ ๋ํ์ฌ (5) | 2025.02.13 |