반응형
1. 의존성 추가
// Gradle
implementation 'com.vladmihalcea:hibernate-types-52:2.16.2'
// Maven
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.16.2</version>
</dependency>
2. Java에서 구현
import com.vladmihalcea.hibernate.type.json.JsonType;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
@Entity
@TypeDef(name = "json", typeClass = JsonType.class)
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Type(type = "json")
@Column(columnDefinition = "jsonb")
private Map<String, Object> attributes;
// 또는 커스텀 클래스 사용
@Type(type = "json")
@Column(columnDefinition = "jsonb")
private ProductDetails details;
}
3. Kotlin에서 구현
import com.vladmihalcea.hibernate.type.json.JsonType
import org.hibernate.annotations.Type
import org.hibernate.annotations.TypeDef
@Entity
@TypeDef(name = "json", typeClass = JsonType::class)
class Product(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
@Type(type = "json")
@Column(columnDefinition = "jsonb")
val attributes: Map<String, Any>,
@Type(type = "json")
@Column(columnDefinition = "jsonb")
val details: ProductDetails
)
데이터베이스 고려사항
- PostgreSQL: jsonb 타입 사용 권장
- MySQL: json 타입 사용
- H2: varchar 또는 clob 타입 사용
4. 커스텀 타입 컨버터
// Java
@Converter(autoApply = true)
public class JsonConverter implements AttributeConverter<Map<String, Object>, String> {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public String convertToDatabaseColumn(Map<String, Object> attribute) {
try {
return objectMapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public Map<String, Object> convertToEntityAttribute(String dbData) {
try {
return objectMapper.readValue(dbData, Map.class);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
5. 실제 사용 예제
// Kotlin 예제
@Entity
class User(
@Id
val id: Long? = null,
@Type(type = "json")
@Column(columnDefinition = "jsonb")
val preferences: UserPreferences,
@Type(type = "json")
@Column(columnDefinition = "jsonb")
val metadata: Map<String, Any>
)
data class UserPreferences(
val theme: String,
val notifications: Boolean,
val language: String
)
반응형
'데이터베이스' 카테고리의 다른 글
트랜잭션 격리 단계에 대한 완벽한 이해 (1) | 2024.11.20 |
---|---|
클러스터 및 넌클러스터 인덱스 (0) | 2024.04.26 |
데이터 샤딩 (0) | 2024.04.26 |