WEB/JPA

Hibernate 에서 제공하는 @NotNull & @NotEmpty & @NotBlank 사용하기

Hibernate 가 뭐지?

하이버네이트 ORM은 자바 언어를 위한 객체 관계 매핑 프레임워크이다.
객체 지향 도메인 모델을 관계형 데이터베이스로 매핑하기 위한 프레임워크를 제공한다. 
JPA의 구현체의 한 종류로, JPA 인터페이스를 구현하며 내부적으로 JDBC API 를 사용한다.

 

Hibernate 는 SQL 을 직접 사용하지 않고 메서드 호출만으로 쿼리를 수행합니다. ( SQL 반복작업을 하지 않아도 된다 )

컬럼이 변경되었을 때, 테이블과 관련된 DAO 의 파라미터, 쿼리 ,SQL 등을 대신 수행해주기 때문에 특정 벤더사에 종속적이지 않습니다. 이러한 특징은 유지보수 측면에서도 큰 장점입니다.

예를 들어 Mysql 을 사용하다가 ORCLE 로 변경하더라도 Hibernate 는 변경한 ORCLE 로 쿼리로 수행해줍니다.

한마디로 DB Table 을 객체로 만들어 관리하기 때문에 쿼리 결과를 JAVA 객체로 매핑해서 사용할 수 있게 해줍니다.

 

하지만 메서드로 호출하기 때문에 직접 SQL 을 작성하는 것보다는 성능상 좋지 않을 때가 발생합니다.

이 문제를 보완하기 위해 JPQL, NativeQuery 를 지원하며 Querydsl 을 사용할 수 있습니다.

 

왜 사용할까?

객체에 책임을 위임할 수 있습니다.

기존에는 SQL 중심으로 개발을 했지만, Hibernate 를 사용하게 되면서 객체를 불러올때 연관된 객체 또한 함께 불러오기 때문에 SQL 에 의존적이지 않을 수 있습니다.

 

 

 

그렇다면  @NotNull & @NotEmpty & @NotBlank 가 뭘까?

 

API 개발시 유효성 검사를 위한 Bean Validation(Hibernate Validation) 에서 제공하는 표준 Validation 입니다.

보통 Controller, Service, Repostiory 에서 전역적으로 Validation 이 분산되어 코드 중복과 검사 로직 추적이 어려워 애플리케이션이 복잡해집니다. 이러한 문제점을 해결하기 위해 유효성 검사가 필요한 객체에 직접 정의하는 방법입니다.

 

필수값에 대한 조건 체크일 경우 역활과 책임을 명확하게 하기 위해 DOMAIN 로직이 아닌 DTO 에서 사용합니다.

 

@NotNull 은 말 그대로 Null 만을 허용하지 않습니다. ( "", " " 은 허용 )

- 모든 타입 사용 가능

The annotated element must not be null. Accepts any type

@NotNull(message = "비밀번호 는 Null 일 수 없습니다.")

 

@NotEmpty 은 Null, "" 을 허용하지 않습니다 (" " 허용)

- 문자,Collection,배열,맵 사용 가능

The annotatd element must not be null nor empty.

Supported types are : 

- CharSequence (length of character sequence is evaluated)

- Collection (collection size is evaluated)

- Map (map size is evaluated)

- Array (array length is evaluated)

 

@NotBlank 은 가장 강력해서 Null, "", " "  모두를 허용하지 않습니다.

The annotated element must not be null and must contain at least one non-whitespace character. Accepts CharSequence.

- 문자 사용가능

 

+

@Size 는 최소, 최대 사이즈를 지정할 수 있습니다.

@Size(min = 8, max = 16, message = "비밀번호는 8자 이상 15자 이하 이여야 합니다.")

또한 @email 을 통해 email 형식만 받을 수도 있습니다.

이외에도많은 어노테이션이 속성이 존재하므로 공식 문서를 통해 확인할 수 있습니다. 

https://beanvalidation.org/2.0/spec/

 

Jakarta Bean Validation specification

BeanNode, PropertyNode and ContainerElementNode host getContainerClass() and getTypeArgumentIndex(). If the node represents an element that is contained in a container such as Optional, List or Map, the former returns the declared type of the container and

beanvalidation.org