🌏 WEB/JPA

Hibernate μ—μ„œ μ œκ³΅ν•˜λŠ” @NotNull & @NotEmpty & @NotBlank μ‚¬μš©ν•˜κΈ°

μ• μ •μ“° 2022. 8. 16. 22:28
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

 

 

 

λ°˜μ‘ν˜•