Django에서 모델을 작성할 때 자주 사용되는 필드 옵션 중 하나가 blank=Truenull=True다. 두 옵션 모두 필드에 값을 비워둘 수 있는 여지를 제공하지만, 그 목적과 실제 기능에서는 차이가 있다. 이 글에서는 각각의 옵션이 의미하는 바와 차이점, 그리고 언제 어떻게 활용하면 좋을지에 대해 설명한다.


1. blank=True

blank=True 옵션은 폼 검증 단계에서 필드를 비워둘 수 있도록 허용할지를 결정한다. 이는 주로 Django의 폼(Form)과 관련이 있다.

  • 의미: 필드가 비어 있어도 폼에서 검증 오류가 발생하지 않게 한다.
  • 활용 상황: 사용자로부터 입력을 받을 때 필드가 비어 있어도 허용하려는 경우에 사용한다. 예를 들어, 사용자의 프로필 정보에서 특정 필드가 필수가 아니고, 사용자가 입력하지 않아도 되는 항목이라면 blank=True를 사용한다.
from django.db import models

class Profile(models.Model):
    bio = models.TextField(blank=True)  # 사용자가 필수적으로 입력하지 않아도 되는 자기소개 필드

2. null=True

null=True데이터베이스에서 해당 필드의 값이 NULL이 될 수 있음을 허용한다. 즉, 데이터베이스 레벨에서 빈 값이 허용되는지 여부를 결정한다.

  • 의미: 필드가 데이터베이스에서 NULL 값을 가질 수 있도록 허용한다.
  • 활용 상황: 데이터베이스에 값이 저장될 때 비어 있는 경우를 처리해야 할 때 사용한다. 문자열 필드가 아닌 경우, Django에서 null=True를 지정하지 않으면 빈 값 대신 기본값을 저장하게 된다. 예를 들어, 날짜나 숫자 필드에서 값이 없을 때 NULL 처리를 원하면 null=True를 설정한다.
from django.db import models

class Event(models.Model):
    end_date = models.DateTimeField(null=True)  # 종료일이 없는 이벤트를 허용하기 위한 필드

3. blank=Truenull=True의 차이점

두 옵션의 차이는 주로 폼 검증과 데이터베이스 저장 방식에 있다.

옵션 기능 설명 사용 목적
blank=True 폼 검증 시 필드를 비워둘 수 있음 사용자 입력을 필수로 하지 않음
null=True 데이터베이스에서 NULL 값 허용 데이터베이스에서 필드를 비워둘 수 있음

Django에서 blank=True폼 레벨에서의 비움을 허용하는 것이고, null=True데이터베이스 레벨에서의 비움을 허용하는 것이라고 생각하면 된다.


4. 언제 두 옵션을 함께 사용할까?

일반적으로 문자열 필드(CharField, TextField 등)에서는 blank=True만 설정하고 null=True는 사용하지 않는다. Django에서는 문자열 필드에서 빈 문자열('')과 NULL 값을 별개로 처리하지 않기 때문에, 빈 문자열은 NULL 대신 빈 값으로 처리하는 것이 일반적이다.

반면, 문자열이 아닌 필드(예: DateTimeField, IntegerField)에서 필드가 필수가 아니라면 blank=Truenull=True를 함께 사용하는 것이 좋다. 이렇게 하면 폼에서 값을 비워둘 수 있고, 데이터베이스에도 NULL 값을 저장할 수 있다.

class Task(models.Model):
    name = models.CharField(max_length=200, blank=True)   # 문자열 필드는 blank=True 만
    due_date = models.DateTimeField(blank=True, null=True) # 날짜 필드는 blank=True, null=True 둘 다 사용

5. 요약 및 정리

  • blank=True: 폼에서 필드가 비어 있어도 오류가 발생하지 않도록 한다. 주로 사용자 입력이 필수가 아닌 경우에 사용한다.
  • null=True: 데이터베이스에서 필드가 NULL 값을 가질 수 있도록 허용한다. 문자열이 아닌 필드에서 사용한다.
  • 함께 사용: 문자열이 아닌 필드에서 값을 선택적으로 비워둘 때 blank=True, null=True를 함께 사용한다.

Django 모델을 설계할 때 이 두 옵션을 적절하게 활용하면, 데이터베이스 구조와 사용자 입력의 유연성을 높이는 데 도움이 된다.

다음 포스트에서는 ForeignKey 설정에서 자주 사용되는 related_name 필드 옵션에 대해 알아보겠다. 이것도 ORM에서 상당히 유용한 옵션이므로 다음 포스트도 관심 있게 봐주길 바란다.