🧠 DRF와 Form 방식의 코드 생성 흐름 차이 - 왜 staticmethod를 써야 하고, commit=False를 쓰는가?
Django 개발을 하다 보면 URL 생성기 같은 로직에서 아래와 같은 두 가지 방식의 차이를 보게 됩니다:
- DRF에서는 serializer.save(code=code)로 code를 전달
- Form에서는 form.save(commit=False) 후 code를 삽입하고 .save()
이 차이의 구조적 이유와 왜 staticmethod를 써야 하는지, 정리해봅니다.
✅ 1. DRF에서는 왜 @staticmethod를 써야 하나?
code = ShortURL.generate_code_two()
short_url = serializer.save(code=code)
📌 이유:
- DRF에서 .save(code=...)를 호출할 때는 아직 인스턴스가 생성되지 않은 상태입니다.
- 따라서 generate_code_two() 같은 메서드를 인스턴스를 생성하지 않고 호출해야 합니다.
- 이럴 때 필요한 것이 @staticmethod
🔍 정리
- @staticmethod를 붙이면 ShortURL.generate_code_two()처럼 클래스명.메서드() 형태로 호출 가능
- 인스턴스 없이 실행해야 하는 상황에서 매우 유용
✅ 2. Form에서는 왜 commit=False를 쓰는가?
short_url = form.save(commit=False)
short_url.generate_code()
short_url.save()
📌 이유:
- Form에서는 .save() 시 바로 DB에 저장되기 때문에, 중간에 값을 조작하려면 저장을 미뤄야 함
- commit=False를 쓰면 인스턴스만 만들고 저장은 하지 않음
- 이 인스턴스를 이용해 generate_code() 같은 메서드 호출 가능
🔍 정리
- Form에서는 인스턴스를 먼저 만든 후, 그 인스턴스에 값을 추가하고 .save()로 최종 저장하는 흐름
- 이는 generate_code()가 인스턴스 내부 필드에 접근해야 할 수도 있기 때문
🔄 DRF vs Form 비교 정리
항목 DRF 방식 Form 방식
코드 생성 방식 | .save(code=code)로 전달 | commit=False로 인스턴스 생성 후 호출 |
메서드 형태 | @staticmethod 필요 | 인스턴스 메서드 (self) 사용 가능 |
인스턴스 접근 | 생성 전 → 접근 불가 | 생성 후 → 접근 가능 |
저장 시점 | .save() 시점에 DB 저장 | .save(commit=False) → 조작 후 저장 |
💬 결론 요약
- DRF는 구조상 생성자에서 값을 외부에서 주입받는 방식을 택하므로, @staticmethod를 써야 하고 create() 내부에서 처리하게 된다.
- Form은 인스턴스를 먼저 만들고 필요한 값을 채운 뒤 저장하는 방식을 택하므로 commit=False를 활용한다.
따라서 같은 "code 생성 후 저장"이라는 목적이지만,
사용하는 방식은 프레임워크의 동작 구조에 따라 달라지는 것입니다. ✅
'기술블로그-Django편' 카테고리의 다른 글
📌 Django ORM 완전 정복: 정참조, 역참조, select_related, prefetch_related, __문법 총정리 (0) | 2025.05.27 |
---|---|
🧩 Django 댓글 API 흐름 완전 정복 (0) | 2025.05.21 |
🧪 Django shell로 클래스/메서드 유효성 확인하는 방법 총정리 (0) | 2025.05.19 |
🔐 Django에서 make_random_password() 오류 해결기 (Django 5.x 대응) (0) | 2025.05.19 |
📘 Django에서 as_view()가 필요한 이유 - FBV vs CBV 완전 정리 (0) | 2025.05.19 |