Spring

@NotNull과 nullable = false, 뭐가 다를까? ✍️

HipPopoTamUs 2025. 2. 28. 23:33
@NotNull 과 @Colunm(nullable = false), 뭐가 다른걸까?

✨ 차이점을 한눈에

먼저, 두 어노테이션의 차이를 직관적으로 이해할 수 있도록 표로 정리해봤습니다.

항목 nullable = false @NotNull
DDL 생성 데이터베이스에 NOT NULL 제약 조건 생성 기본적으로 DDL에 영향 없지만, 설정에 따라 NOT NULL 생성 가능해요.
Null 검증 애플리케이션 검증 없이 데이터베이스에서 null 체크 데이터베이스에 가기 전, 애플리케이션에서 null을 검증해요.
예외 발생 시점 삽입 쿼리 후 데이터베이스에서 예외가 터짐 쿼리 실행 전 애플리케이션에서 예외를 미리 잡아요.
커스텀 메시지 지원 X 예외 메시지를 원하는 대로 커스터마이징할 수 있어요!
추가 검증 X @Size 같은 다른 검증과 함께 쓸 수 있어요.
추천 사용 데이터베이스 제약 조건 확실히 걸고 싶을 때! 애플리케이션 검증과 설정에 따라 데이터베이스 제약까지 원할 때!

 

 

✨ 하나씩 풀어보기

표를 바탕으로 하나씩 설명해보겠습니다 : )

 

1. DDL 생성: 데이터베이스에 미치는 영향 

  • nullable = false: 데이터베이스에 직접적으로 "이 컬럼은 null을 용납하지 않아요!"라고 말해줍니다. 그래서 테이블 생성 시 NOT NULL 제약 조건이 딱 붙습니다.
  • @NotNull: Bean Validation에서 온 어노테이션입니다. 기본적으로는 DDL에 영향을 안 주지만, hibernate.validator.apply_to_ddl=true 같은 설정을 켜면 NOT NULL 조건을 붙일 수 있습니다.

 

2. Null 검증: 어디서 잡히나? 

  • nullable = false: 애플리케이션 단계에서는 아무것도 안 해요. 데이터가 데이터베이스로 넘어가서 삽입될 때 null이면 그때서야 에러가 터집니다.
  • @NotNull: 반대로, 데이터베이스에 가기 전에 애플리케이션에서 null을 잡아줘요. 코드 실행 중에 미리 문제를 알려주니까 디버깅이 한결 편해집니다 ㅎㅎ

 

3. 예외 발생 시점: 언제 터지냐가 중요! 

  • nullable = false: 쿼리가 데이터베이스까지 간 뒤에야 예외가 발생합니다
  • @NotNull: 쿼리가 날아가기 전에 예외를 던져줘서, 문제 파악이 더 빠릅니다!

 

4. 커스텀 메시지: 사용자 친화적으로! 

  • nullable = false: 수정 불가능합니다
  • @NotNull: "이 필드는 필수입니다." 와 같은 메시지를 직접 설정할 수 있습니다

 

5. 추가 검증: 더 똑똑하게! 

  • nullable = false: 단순히 null만 막는 역할이라 추가 기능은 없습니다.
  • @NotNull: @Size@Pattern 같은 검증을 같이 붙일 수 있어서 필드에 더 많은 규칙을 걸 수 있습니다.

 

6. 추천 사용: 언제 쓰면 좋을까? 

  • 데이터베이스에 강력한 제약을 걸고 싶다면 nullable = false
  • 애플리케이션에서 미리 검증하고, 필요하면 DDL까지 조정하고 싶다면 @NotNull