오늘은 진행했던 개인 프로젝트를 리팩토링 하는 시간을 가졌다.
근데... 뭔가... 코드가.. 내 마음대로 안된다..
nullable = false 설정 했는데도 빈 값이 들어간다
뭐지??
근데 Null은 아니고 아예 비어있다.
Null이면 Null이라고 표시가 되어있어야 한다.
Null이 아닌 빈 값이 들어가는 거다!!
이유는?
Null이 아닌 빈값이 들어가는 이유
Null 이랑 빈 객체는 다른 거다.
nullable = false는 JPA에서 엔티티의 특정 필드가 Null이 아니어야 함을 지정하는 제약 조건이다.
하지만 이는 필드가 Null을 가질 수 없다는 것만 의미할 뿐
빈 문자열, 공백 문자열이 DB에 저장되는 것을 방지하지는 않는다.
String 객체가 초기화 될 때 Null이 아니라 빈 문자열로 초기화 된다..
이런 상황에서 nullable = false로 되어 있는 필드가 빈 문자열로 초기화 돼있으면
JPA는 통과 시킨다.
DB에서 Null과 빈 문자열은 서로 다른 것으로 취급된다.
Null은 값이 존재하지 않음을 의미하는 반면, 빈 문자열은 값이 존재하지만 그 값이 길이 0의 문자열임을 나타낸다.
어떻게 해결했어?
필드의 값이 빈 문자열인지 검증하는 로직을 추가하면 된다.
나는 isEmpty() 메소드를 추가해서 하나하나 검증했다.
더 좋은 방법 없을까?
분명 더 좋은 방법이 있을 거다!
언제 저렇게 하나하나 다 써줄 건가?
개발자들은 분명 그런 거 싫어할 거다.
라고 생각해서 찾아봤다.
Request의 유효성 검사를 하면 된다고 한다!
@NotNull
Null값을 허용해주지 않는 소리다.
nullable=false랑 뭐가 다르냐?
@NotNull은 애플리케이션 레벨에서 null 값을 허용하지 않는다.
@Column (nullable = false)는 데이터베이스 레벨에서 해당 필드에 null값을 허용하지 않는다.
notnull은 검증할 때 null 값이 있으면 예외가 발생한다
근데 둘다 "", " " 같은 빈 문자열은 통과한다고 한다ㅋㅋ
뒤에서 소개 해줄 두 개를 위해 이렇게 적었다.
@NotEmpty
NotNull의 진화버전
빈 문자열을 허용하지 않는다는 소리다.
문자열이 null이 아니며, 길이가 0보다 커야된다.
?
" " (띄어쓰기 있음) 이건 통과 된다는 소리 아니야?
맞다.
그래서 한번 더 진화한다.
@NotBlank
NotEmpty의 진화버전
빈 문자열을 허용하지 않고
문자열이 null이 아니며, 길이가 0보다 커야되고, 공백만으로 구성된 문자열 ( " " ) 은 통과하지 못한다.
이 셋중 선택해서 엔티티에 적용 시키면 된다.
근데 @Valid를 써야 된다고 한다!!
아직 쓰는 방법 몰라서 배우고 추후에 프로젝트 더 리팩토링 할 때 적용 시켜야겠다.
'TIL' 카테고리의 다른 글
TIL 2023-11-13 Session과 JWT 뭐가 더 좋을까? (2) | 2023.11.13 |
---|---|
TIL 2023-11-10 HttpServlet 및 쿠키 처리 (0) | 2023.11.10 |
TIL 2023-11-08 영속성 컨텍스트, Jpa의 트랜잭션 (0) | 2023.11.08 |
TIL 2023-11-07 Bean과 IoC 컨테이너 (0) | 2023.11.07 |
TIL 2023-11-06 개인프로젝트 완성 및 3 레이어 아키텍처 (0) | 2023.11.06 |