관리 메뉴

notcherry

@NonNull vs. @NotNull vs. @Column(nullabe = false) 본문

어쩌면 모두 궁금할지도?

@NonNull vs. @NotNull vs. @Column(nullabe = false)

notcherry 2023. 10. 12. 16:54
반응형

 

프로젝트를 마무리하며 리팩토링을 시작했다.

객체 생성시 @NonNull을 사용했는데(첫 프로젝트에서는 이런 방식으로 했다. 왜냐면 단순히 null값을 받으면 안된다고 생각했기 때문) 프로젝트 진행하면서 validation의 @NotNull로 수정했다.(프로젝트에서 validation을 사용하기 때문)

하지만 마지막 리팩토링 기간에는 @Column(nullabe = false)으로 수정하면서 이 세 녀석에 대한 궁금증이 생겼다.

 

1. @NonNull

@NonNull은 주로 lombok 라이브러리에서 호출해서 많이 사용한다. 주로 NullPointException을 방지하기 위해 사용한다. 메서드의 매개변수나 객체의 필드가 null이 아니어야 호출한다. 즉, 해당 생성자를 호출할 때 null값을 전달하지 않는다.

 

2. @NotNull

@NotNull은 Bean Validation에서 제공하는 스펙이다. 객체나 필드의 값이 null이 아니어야 하고 주로 데이터 유효성 검사에 사용된다. null인 경우는 안되지만 비어있는 경우는 상관 없다. 

 

3. @Column(nullabe = false)

이 어노테이션은 jpa어노테이션으로 데이터 엔터티 필드에 대한 설정을 지정해준다. 필드가 데이터 베이스 테이블의 열(column)과 매핑될 때 해당 열이 null값을 허용하지 않도록 지정한다. 

 

정리하자면 상황의 차이, 스타일의 차이도 있는 것 같다. 유효성 검사까지 하려면 validation에서 제공하는 notnull을 사용하면 된다. null 포인터 예외를 방지하고 싶다면 notnull을 사용하면 된다.(나머지 친구들은 직접적으로 해주지 않기 때문)  데이터베이스 스키마에서 null값을 허용하지 않도록 엄격하게 정의하려면 @Column(nullabe = false)을 사용하면 된다. 우리가 마지막에 컬럼으로 수정한 이유는 entity와 직접적인 db에 null이 들어가지 않게 하기 위해서인 것 같다.

 

 

 

++ 프로젝트를 하면서 깨달은 건데 데이터베이스와 일관성을 유지하기 위해 entity에는 3번. 컬럼을 사용해 nullabe 안됨 처리를 해주고, dto에서 string에는 notblank를(스페이스바와 같은 공백도 감지하기 때문), long에는 notnull을 사용해준다.

반응형