일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- AccessLevel
- findFirst
- 쓰레드 안전
- LogInterceptor
- 포맷터
- AOP this
- Stream
- Spring Boot
- JsonStringType
- auto configuration
- ResponseBodyAdvice
- AOP target
- 개방/폐쇄 원칙
- JsonType
- jpa
- fotmatter
- java
- ClientHttpRequestInterceptor
- spring
- gradle
- Thread Safety
- Starter
- RestTemplate
- findAny
- vaultTemplate
- AOP
- restTemple
- Save Action
- AOP 매개변수
- @AutoConfiguration
- Today
- Total
맨땅에 헤딩하는 개바른자
JPA사용 시 Json 타입지정에 따른 영향도 본문
설계를 하다보니 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
'개발 TIP' 카테고리의 다른 글
IntelliJ Save Actions, Formatter 적용 가이드 (1) | 2024.01.25 |
---|---|
[런타임X] 리얼타임 Vault 값 사용하기 (0) | 2023.05.16 |
Lombok > 생성자 AccessLevel.PROTECTED 를 알고 사용하자 (0) | 2023.01.19 |
CRUD 공통로직 만들기 (0) | 2022.05.10 |
Request DTO Validate Aspect 적용기 (0) | 2022.05.10 |