본문 바로가기

Study/개발일지

[백엔드온라인TIL] JPA 엔티티에 json 타입지정하기 (53일차)

{
  "1": "첫번째 데이터",
  "2": "두번째 데이터",
  "3": "세번째 데이터",
  "4": "네번째 데이터",
  "5": "다섯번째 데이터",
  "6": "짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용짱짱긴내용"
}

 

기존에 비슷한 레거시 프로젝트에서는 위와 같은 json 형식의 데이터를 MySQL의 한 컬럼으로 저장하기 위해 List<Map<String, String>> 형태의 input data를 생성하고, ObjectMapper를 사용해 json 형식의 String을 writeValueAsString으로 생성 후 varchar 타입 컬럼에 insert하는 과정을 거치고 있었다.

 

데이터를 select해 읽어올 때는 마찬가지로 ObjectMapper로 readValue 메서드를 이용해 String을 List<Map<String, String>>의 형태로 변환하는 작업이 포함되었다.

 

이번 프로젝트에서도 json 타입을 컬럼으로 저장하려고 보니, ObjectMapper로 매번 해당 데이터들을 파싱하는 작업은 번거롭게 느껴졌고 믿음을 가지고 찾다보니 역시나 누군가 이미 해당 작업을 공수 없이 편하게 수행할 수 있는 라이브러리를 제공하고 있었다.

 


hypersistence-utils 라이브러리 주입 받기

 

GitHub - vladmihalcea/hypersistence-utils: The Hypersistence Utils library (previously known as Hibernate Types) gives you Sprin

The Hypersistence Utils library (previously known as Hibernate Types) gives you Spring and Hibernate utilities that can help you get the most out of your data access layer. - GitHub - vladmihalcea/...

github.com

 

이번 프로젝트는 JPA 기반으로 구성할 계획이었으므로 데이터베이스에서 해당 json 형식의 컬럼을 읽어오고, 반대로 json 형식의 데이터를 편하게 저장할 수 있는 것이 중요했는데 마침 딱 적당한 라이브러리가 위 라이브러리다.

 

build.gradle

먼저 주입할 라이브러리 버전 설정을 위해 현재 사용하고 있는 hibernate의 버전을 확인한다.

좌측 Project 탭에서 External Libraries 클릭 후 hibernate를 검색하면 쉽게 현재 사용하고 있는 버전을 확인할 수 있다.

 

나는 현재 6.0.6 버전을 사용 중이므로 github README에 명시된 hypersistence-utils-hibernate-60:3.3.1 버전을 implementation 해준다.

 

gradle

implementation 'io.hypersistence:hypersistence-utils-hibernate-60:3.3.1'

 


 

JSON 파싱 용 라이브러리 (jackson) 주입 받기

JSON Optional Maven Dependencies
If you are using JSON Types, then you might be interested in setting the following dependencies based on your Hibernate version:

 

JSON 타입을 제대로 parse하기 위해서는 추가적인 parsing 용 라이브러리를 주입 받아야 한다.

 

hibernate 6.0, 6.1, 6.2 기준 유효한 버전은 다음과 같다

 

gradle

implementation 'com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations'

 


Practice

이제 해당 라이브러리를 사용하기 위한 사전 설정이 끝났으니 시험용 Entity를 만들어 테스트해보자. 기본적인 JPA와 database 설정 등은 이미 준비되어 있다고 가정한다.

 

Entity 생성

@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Entity(name = "TB_AROM")
public class Arom {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "IDX", columnDefinition = "int(11)")
    private Integer idx;
    @Type(JsonType.class)
    @Column(name = "SCORE", columnDefinition = "longtext")
    private Map<String, Object> scores;
}
728x90