계기
“ nullable = false 대신 @NotNull 어때요? “
PR을 날리고 코드리뷰를 보던 중 이러한 코드리뷰를 보았다.
nullable = false과 @NotNull의 차이에 대해 그렇게 깊게 생각해본적이 없었던 것 같아 차이가 궁금해져서 찾아보게 되었다.
차이
@Column(nullable = false)는 해당 어노테이션을 사용한 필드가 생성될 때 DDL에 not null 이 입력된다고 한다. 그러면 @NotNull은 not null DDL이 입력되지 않을까?
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;
@Column(unique = true)
private String email;
@Column(nullable = false)
private String accountId;
@NotNull
private String name;
@Column(nullable = false)
private String password;
}
name 필드에만 @NotNull을 사용하고 로그를 확인했다.
결과는 이러하였다

왜 @NotNull에도 DDL이 수정될까?
이는 Hibernate가 @NotNull 어노테이션 역시 해석할 수 있기 때문이다.
그렇다면?
그렇다면 둘의 차이점은 무엇일까?
@Column(nullable = false) 는 table에 not null 옵션을 붙여주는 역할 만을 하는 어노테이션이기 때문에 SQL 쿼리가 데이터베이스에 도착한 순간에 오류가 발생한다
@NotNull은 데이터베이스 쪽으로 SQL 쿼리가 보내지기 전에, 정확히는 JPA가 만든 엔티티의 필드 값이 null로 채워지는 순간에 예외가 던져진다고 한다.
코드로 실습해보기
먼저, User 테이블의 필드들을 모두 nullable로 바꿔보았다.
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;
private String email;
private String accountId;
private String name;
private String password;
}
그리고 Request에서 NotNull과 @Column(nullable = false) 를 붙여보았다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class SignupRequest {
@NotNull
private String email;
@NotNull
private String accountId;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String password;
}
@Column(nullable = false)가 붙은 request는 오직 DDL 생성용 어노테이션이기 때문에 없어도 되는 반면, @NotNull 어노테이션이 붙은 email과 accountId는 null로 채워지는 순간 에러를 발생시키기에 넣어줘야 했다

해당 글에 따르면 @Column(nullable = false) 어노테이션보다 @NotNull 어노테이션을 선호해야한다고 한다.
@NotNull이 더 빠른 단계에서 예외를 검출하여, 더 안전하다고 볼 수 있다.

느낀점
만약 엔티티에서 not null 옵션만을 붙이는걸 원한다면 @Column(nullable = false)을 사용하는게 좋을 것 같다.
참고👇👇
https://kafcamus.tistory.com/15
https://www.baeldung.com/hibernate-notnull-vs-nullable
https://hyeon9mak.github.io/not-null-vs-column-nullable-false/
'Spring' 카테고리의 다른 글
| 프로젝트에 Swagger 도입해보기 (1) | 2024.10.24 |
|---|