기술블로그-Django편
🧠 Django ORM 객체 생성과 저장의 차이 완전 정리!
Chansman
2025. 5. 13. 11:25
🧠 Django ORM 객체 생성과 저장의 차이 완전 정리!
사용자 모델(CustomUser)을 생성하는 다양한 방식 중, __init__ + .save() 방식과 .objects.create() 방식의 차이를 정리해드립니다. 또한, 비밀번호 보안 처리 방식도 함께 알아봅니다.
✅ 1. 객체 생성 vs 저장 흐름
✍️ 코드 예시 ①: 객체만 생성한 경우
user1 = CustomUser(username="user1", password="password")
- 이 상태는 메모리 상의 객체만 존재
- 아직 DB에 저장되지 않았음
- 확인:
user1.id is None # True
💾 저장 후
user1.save()
user1.id # 이제 1 같은 실제 ID가 생김
시각적 흐름 도식
[생성] CustomUser(...)
↓ (아직 저장 X)
[저장] .save() 호출
↓
[DB 반영] → INSERT INTO custom_user ...
✅ 2. 한 줄로 객체 생성과 저장
✍️ 코드 예시 ②: objects.create() 사용
user2 = CustomUser.objects.create(username="user2", password="password")
- 객체 생성 + .save()까지 한 번에 수행
- 바로 DB에 저장되고, user2.id도 존재함
시각적 흐름 도식
[생성 + 저장] CustomUser.objects.create(...)
↓
[DB 반영] → INSERT INTO custom_user ...
⚠️ 비밀번호 저장 시 주의사항
password="password"처럼 평문 비밀번호를 그대로 저장하면 보안에 매우 위험합니다!
🔐 올바른 비밀번호 처리 방법
user = CustomUser(username="user3")
user.set_password("password") # 해시 처리
user.save()
from django.contrib.auth.hashers import make_password
user4 = CustomUser.objects.create(
username="user4",
password=make_password("password")
)
또는 Django가 제공하는 생성자 사용:
CustomUser.objects.create_user(username="user4", password="password")
🔒 왜 필요할까?
- Django는 내부적으로 pbkdf2_sha256 해시로 암호화 저장
- 평문 저장 시 로그인/인증 작동 안 함
✅ 기능별 정리표
구분 CustomUser(...) + save() CustomUser.objects.create() create_user()
객체 생성 | 수동 | 자동 | 자동 |
DB 저장 | 수동 (.save()) | 자동 | 자동 |
비밀번호 해시 처리 | ❌ 수동 필요 (set_password()) | ❌ 수동 필요 | ✅ 자동 처리 |
보안 추천도 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
🧠 요약
- .save()는 직접 저장 필요, .create()는 한 줄 저장
- 비밀번호는 set_password() 또는 **create_user()**로 안전하게 처리
- 개발 초기 실습에서는 create()도 가능하지만, 실제 서비스에서는 반드시 보안 처리 필수!
궁금한 부분이나 다른 ORM 메서드 (update, filter, get)도 정리해드릴 수 있어요. 댓글로 남겨주세요! 😊