웹프로그래밍/Django

[Django] Model Field의 Null vs Blank

ssung.k 2020. 8. 6. 20:53

django에서는 기본적으로 orm을 지원해주고 있습니다. 따라서 테이블을 생성할 때도 orm으로 생성할 수 있습니다. 테이블을 생성하다보면 필드 옵션으로 null와 blank 속성이 존재하고 이는 꽤나 헷갈리는 내용입니다. 따라서 이번 포스팅에서는 각각에 대해 알아보도록 하겠습니다.

 

Null vs Blank

Null 은 데이터베이스와 관련되어 있습니다. 기본값은 false로 Null 을 허용하지 않으며, True로 할 시에는 데이터베이스에 Null 값을 저장할 수 있습니다.

Blank는 유효성과 관련되어 있습니다. 기본값은 false로 해당 필드 없이 저장하고자 하면 유효성 검사에서 걸러지며, True로 할 시에는 해당 필드가 없어도 정상적으로 동작합니다.

 

다음과 같은 모델을 만들고 이에 대한 쿼리를 확인한 결과 아래와 같았습니다.

DB는 mysql 8 버전을 사용하였습니다.

class NullBlank(models.Model):
    nothing = models.TextField()
    null_only = models.TextField(null=True)
    blank_only = models.TextField(blank=True)
    both = models.TextField(null=True, blank=True)
CREATE TABLE `plant_nullblank` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nothing` longtext NOT NULL,
  `blank_only` longtext NOT NULL,
  `both` longtext,
  `null_only` longtext,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

다음 결과와 같이 Blank는 데이터베이스에 아무런 영향을 주지 않는 것을 확인할 수 있습니다.

 

그리고 위의 테이블 정의는 해당 필드에서 한 가지 문제점이 생깁니다.

null_only = models.TextField(null=True)

 

문자열 기반 필드에는 Null 을 True로 설정할 경우 문제가 생깁니다. Null이 의미하는 데이터없음 을 문자열에서는 빈 문자열로 표현할 수 있기 때문이죠. 즉, 데이터없음 에 대해서 두 가지 값을 중복하여 가지게 되므로 Null이 아닌 빈 문자열로 표현하는 것을 django에서 권유하고 있습니다.