728x90
728x90
배경
프로젝트 MyPill은 도메인을 나누었고, 독립적으로 개발을 진행했다.
전체 리팩토링 과정에서 살펴보니 @NotNull 과 @Column(nullable = false) 를 혼용해서 사용하고 있었다.
필드에 Null 값이 들어올 수 없다는 공통적인 목적을 가진 것인데,
통일시키기 이전에 두 방식의 차이가 궁금해 찾아보았다.
공통 환경
엔티티
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "categories")
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "category_id")
private Long id;
//이 컬럼에 not null 조건을 추가한다.
@Column(name = "name")
private String name;
}
- 실제 프로젝트에 쓰인 Category 엔티티(Categories 테이블)를 생성한 후 not null을 가지는 두 방식을 비교했다.
DB 저장 메소드
public void nullTest() {
categoryRepository.save(new Category());
}
- name = null 인 객체를 저장하는 메소드를 실행해 디버깅하며 로그를 살펴봤다.
실행 환경
로컬 dev 환경으로, ddl-auto : create 인 상황이다.
@NotNull
@NotNull
@Column(name = "name")
private String name;
- name 컬럼에 @NotNull을 추가한 경우이다.
프로젝트 실행 시 스키마 생성
- DDL에 의해 name 컬럼에 not null 제약조건이 설정된 것을 확인할 수 있다.
null 값 저장 메서드 실행 시
- jakarta.validation.ConstraintViolationException이 발생한 것을 확인할 수 있다.
- save 메소드에 해당하는 insert 쿼리가 실행되지 않았다는 것을 확인할 수 있다.
@Column(nullable = false)
@Column(name = "name", nullable = false)
private String name;
- name 컬럼에 nullable = false를 추가한 경우이다.
프로젝트 실행 시 스키마 생성
- @NotNull과 동일하게 name 컬럼에 not null 제약조건이 설정된 것을 확인할 수 있다.
null 값 저장 메서드 실행 시
- @NotNull 과 달리, insert 문이 실행되었다.
- 이후 SQLIntegrityConstraintViolationException 이 발생한 것을 확인할 수 있다.
정리
- 두 방식 모두 null 값에 대해 오류를 발생시킨다.
- @NotNull이 더 추천된다고 한다.
- 더 앞선 단계에서 예외를 검출하기 때문에 안전하다고 한다.
참고
Hibernate @NotNull vs @Column(nullable = false) | Baeldung
@NotNull vs @Column(nullable = false)
728x90
728x90
'프로젝트 > 팀 프로젝트 - MyPill' 카테고리의 다른 글
Ncloud 크레딧 사용 후기 (0) | 2023.07.27 |
---|---|
[트러블 슈팅] - MultipartFile 테스트 케이스 (0) | 2023.07.25 |
[트러블 슈팅] - MultipartFile 예외 처리 (0) | 2023.07.20 |
[개선 작업] @Value → @ConfigurationProperties (0) | 2023.07.20 |