하고 싶은 건 DB의 field에 Json으로 저장하고 조회 시 이를 class로 받고 싶은 경우다.
코드는 kotlin으로 되어 있다.
Reservation 테이블에 Remark를 Json으로 저장하고 조회 시 Remark Class로 다시 변환해서 가져온다.
Entity Class
import javax.persistence.Convert
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id
@Entity
@Table(name = "reservation")
class Reservation (
var arrival: LocalDate,
var departure: LocalDate
){
@Id
@GeneratedValue
var id: Long? = null
private set
@Convert(converter = JpaJsonRemarkConverter::class)
var remarks: MutableList? = null
}
Remark Class
data class Remark(
var id: String,
var name: String,
var rate: Double
)
JpaJsonRemarkConverter Class
class JpaJsonRemarkConverter : AttributeConverter<MutableList<Remark>, String> {
private val gson = Gson()
override fun convertToEntityAttribute(dbData: String?): MutableList<Remark>? {
if (dbData == null)
return null
val collectionType = object : TypeToken<MutableList<Remark>>() {}.type
return gson.fromJson(dbData, collectionType)
}
override fun convertToDatabaseColumn(attribute: MutableList<Remark>?): String? {
if (attribute == null)
return null
return gson.toJson(attribute)
}
}
json으로 변환은 gson으로 했는데 jackson이 spring 기본 json parser니 그걸 써도 된다.
저러면 Remark Class에 데이터를 넣고 save하면 DB에는 json 형태로 들어가고 조회시 Remarks:List