2017년 9월 11일 월요일

JPA에 @Convert 사용법

밑도 끝도 없이 예제를 작성한다.
하고 싶은 건 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 형태로 된다.