Spring&IntelliJ

JPA. 필드(field)에 적용되는 몇가지 중요 어노테이션(2)@Temporal @Lob, @Enumerated, @transient

NandaNanda 2024. 1. 4. 17:33

 

출처: https://www.youtube.com/watch?v=WH5UbfCjoN8&list=PLOSNUO27qFbvzGd3yWbHISxHctPRKkctO&index=13

1. @Temporal어노테이션

자바8 이전에는 날짜를 다루고자 할때에는 자바의 Util패키지의 Date라는 클래스타입 혹은 Calendar라는 클래스를 사용했음. 반면 DB의 날짜에 관한 타입은 3가지로 나뉨. DATE, TIME, TIMESTAMP(데이트와 타임을 섞은타입)

 

만약 LocalDate, LocalTime, LocalDateTime중 하나를 사용한다면 @Temporal을 사용하지 않아도 됩니다.

2. @Lob 어노테이션

Lazy loading이란 무엇인가? 예를들어 em.find()로 DB의 데이터를 가지고 와서 User객체를 만들고자 할때 보통은 각각의 필드에 알맞은 값을 set해주는 것이 일반적이다. 하지만 Lazy loading을 사용하면 해당정보를 데이터를 set할때, 즉 객체를 만들때 데이터를 넣어주지 않고 실제로 그 데이터를 사용해야 할 시점에 데이터의 loading이 일어난다. 이것이 Lazy loading이다.

또한 @Lob어노테이션은 @Basic어노테이션의 속성을(fetch=FetchType.LAZY)로 하여 함께 사용된다.

3. 열거형 매핑을 위한 @Enumerated. 자바에는 존재하지만 DB에는 존재하지 않는 열거형을 위해 존재하는 어노테이션

==>> @Enumerated의 속성으로 EnumType.ORDINAL을 사용할 경우 DB에 0이 저장된다는 의미이고 속성으로 EnumType.String을 사용할 경우 DB에 Stirng형인 "SELLER"가 저장된다는 말임.

 

보통 EnumType.ORDINAL은 사용하지 않습니다. 오류를 불러일으킬수 있습니다. 열거형 상수를 수정하였을때 ORDINAL이 가지는 의미가 달라지므로 오류가 생길수 있다는 말임. 예를들어 위의 SELLER이전에 GUEST라는 열거형 상수를 새롭게 만들어 새로 UserType을 정의하였을 때 이미 DB에 ORDINAL타입으로 저장된 데이터는 쓸모없게 되어버림. 따라서 @Enumerated어노테이션을 사용할 때에는 EnumType을 String으로 해서만 사용합니다. 그렇게 해야 나중에 열거형의 정의가 변경되었을때도 무난히 이용할 수 있게되는 것.

4. @Transient어노테이션: 특정 필드를 영속화하고 싶지 않을 때 사용하는 어노테이션