1 ) @NotNull?? (nullable = false)??
- 개요
- 플러스 주차 개인 과제 도중 nullable = false 의 제약 조건을 테스트를 하는 과제 도중 혼자 코드를 작성했지만 평소 테스트 코드를 작성하지 않기도 하고 발제를 정확히 이해하지 못하여 지금 작성한 테스트 코드가 맞는지 의문이 생겼다.
- 문제발생
- 스스로 생각한 과제는 'status = null' 이면 예외처리를 하면 된다는 생각에 객체에 직접 데이터를 값을 입력해주어서 테스트 진행하다가 이렇게 객체에 데이터를 넣으면 무조건 null 값인데 굳이 테스트를 해야되는 이유를 모르겠어서 튜터님에게 상담 요청하였고 튜터님이 과제의 목적을 정확히 설명해주셨다.
- 코드 수정 후 테스트 진행 중 코드의 문제점이 없다고 생각하였지만 계속해서 예외처리가 발생하지 않는다는 에러가 나왔다.
// 문제 해결 전 Entity의 status 필드
@Column(nullable = false, columnDefinition = "varchar(20) default 'PENDING'")
private String status;
- 해결
- 문제의 원인은 Repository에 데이터를 저장하고 사용하는 과정에서 null 값이 아니라서 예외처리가 안되고 있었다는 것을 확인하였다.
- 앞에 다른 과제들을 수행하는 도중 해당 Entity의 필드에 @Dynamicinsert로 인해 default 값이 설정되는 것을 확인하였다.
- @Column 어노테이션 위에 @NotNull을 추가하여 문제 해결.
// 문제 해결 후 Entity의 status 필드
@NotNull
@Column(nullable = false, columnDefinition = "varchar(20) default 'PENDING'")
private String status;
- 결론
- nullable = false 로 @Column 어노테이션을 속성을 붙이면 null을 넣은 엔티티를 생성히 된 뒤 Repository에 전달되고 이 값이 DB에 넘어간 뒤에 예외를 처리하기 때문에 null 인지 확인할 수 없었다.
- @Dynamicinsert로 인해 DB로 데이터가 들어가면 default 값이 저장되기 때문이다.
- @NotNull 어노테이션을 쓰면 DB에 SQL 쿼리를 보내기 전에 검증을 하기 때문에 null 값인지 확인할 수 있었다.
- 저 문제를 해결하는 방법은 생성자에 status를 추가하는 방법도 있지만 @NotNull 사용하는 방법도 있었다.