기술블로그-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)도 정리해드릴 수 있어요. 댓글로 남겨주세요! 😊