맨땅에 헤딩하는 개바른자

JPA사용 시 Json 타입지정에 따른 영향도 본문

개발 TIP

JPA사용 시 Json 타입지정에 따른 영향도

앵낄낄 2023. 11. 10. 12:32
반응형

설계를 하다보니 Json데이터를 넣어야하는 컬럼이 존재하였다

Mysql에서는 json 컬럼 타입이 지원되서 아래와 같이 컬럼을 정의하여 사용하였다

OPTIONAL       json                                       null,

JPA에서는 아래와 같이 설정하였다

@Column(name = "OPTIONAL", columnDefinition = "json")
@Type(JsonStringType.class)
private String optional;

테스트에서 돌려보니 h2에 생성되는 테이블도 optional json타입으로 생성되는 것을 확인하였다

 

첫번째 오류

이러한 구성에서 테스트에서 오류가 발생하였는데 잉..? “와 \ 구분자가 더 추가가되었다 그러면서 파싱오류가 발생하였던 것이다..

// 오류
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.hanatour.hats.api.domain.vendor.VendorProductPricing$Optional` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"fromAge":1,"toAge":99,"gender":"MALE","minimum":1,"maximum":100,"isAdult":false,"rateType":null}')

// debug 상태의 값 확인
"{\\"fromAge\\":1,\\"toAge\\":99,\\"gender\\":\\"MALE\\",\\"minimum\\":1,\\"maximum\\":100,\\"isAdult\\":false,\\"rateType\\":null}"

뭐지… 우선 정황상 내가 Object정보를 jsonString으로 변환하였는데 insert당시 json으로 또 변환처리가되고있는 상황으로 보였다

왜냐하면 dubug에서 저장 전 정상적으로 확인된 데이터가 insert 후 저장 된 데이터를 확인해보니 이미 잘 못 들어간 상태였다..

 

두번째 오류

그래서 자료를 찾다가 @Type(JsonType.class)이라는 걸 발견하였고 변경하니까 정상동작이 되었다!!

하지만 더 큰 고난이 날 찾아왔다..

다른 테스트가 막 깨지기 시작하였던 것이다..

이유는 Object정보를 jsonString으로 변환하여 insert할 때 json양식이 맞지 않으면 insert가 되지 않은 문제가 새롭게 발견했던 것이다. (사실 이걸 문제라고 볼순없긴하다 json인지를 체크해주는거니까 오히려 좋은기능이잖아라고 생각 할 수 있다.)

하지만 나에겐 이미 많은 테스트가 작성되었고 저걸 다 수정하기엔 부담이 큰 상황이였다

그래서 아래 링크의 글을 찾아보니 Mysql(MariaDB)의 Json타입은 내부적으로 longtext타입을 가진다라고 하였습니다.

https://danawalab.github.io/spring/2022/08/05/Jpa-Json-Type.html

 

JPA로 RDB에 JSON 타입 다루기

JPA를 통해 RDB JSON 타입을 핸들링하는 방법을 알아보겠습니다 with MariaDB

danawalab.github.io

 

해결!!

그래!! 그러면

일단 본래의 설정을 유지하고 columnDefinition을 longtext로 바꾸어보았다

@Column(name = "OPTIONAL", columnDefinition = "longtext null")
@Type(JsonStringType.class)
private String optional;

그리고 테스트를 돌린결과!

모든것이 성공으로 돌아갔다 ~~~~~~~

 

 

참고링크

https://danawalab.github.io/spring/2022/08/05/Jpa-Json-Type.html

반응형