DB에 json을 string으로 저장하고 사용하기, camel -> snake 변환
- Study/스프링부트-코틀린
- 2022. 4. 27. 16:38
어찌어찌하여 DB 컬럼 하나를 string으로 선언하고 거기에 json 형태의 string을 넣은 다음 꺼내서 파싱 해서 쓰는 상황이 왔다. springboot + kotlin도 아직 익숙하지 않은데 희한한 요건이당 ㅋㅋㅋ
아무튼, 일단 mysql에 String형태로 json데이터를 넣어놨다.
자 이제 이게 string형태로 저장되어 있으니까 데이터를 꺼내고 json object로 읽어와서 사용하면 되겠지~ 했는데
구냥 json object로 읽지 않고 spring에서 data class로 만든 다음 바로 object로 읽어올 수 있다. jackson 라이브러리를 사용할 건데 방법은 심플하다.
val mapper = jacksonObjectMapper()
var accounts: List<Account> = mapper.readValue(bizAccount.accounts)
구냥 jacksonObjectMapper 선언하고 json형태로 된 string을 readValue안에 넣으면 오브젝트로 튀어나온다. 신기방기.
좋아 실행해보자!! 했는데 역시나 에러가 났다 ^^^^^
에러를 보니 fiatAmount를 못 찾는다고 하는데,, 음 fiat_amount가 있는데..? 이게 camel방식을 snake로 못 읽나?! 해서 열심히 구글링 해본 결과 camel로 돼있는 data class에 어노테이션을 추가하면 json으로 변환 시 snake로 읽게 해준다고 한다.
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class) // 요거 추가
data class Account(
val currency: String,
val amount: Double,
val fiatAmount: Double,
val avgBuyPrice: Double,
val unitCurrency: String,
)
요런 너낌으로 JsonNaming 어노테이션을 추가하면 알아서 Json으로 읽을 때 fiatAmount -> fiat_amount로 읽는다는 말씀. 이게 출력할 때뿐만 아니라 입력할 때도 바꿔준다니 참으로 혜자가 아닌가 싶다.
아무튼 넣고 돌려보면,,,
성공적으로 응답이 오는 것을 알 수 있다.
이전에는 mapper에다가 property를 붙였는데, 요즘엔 어노테이션 추가하는 걸로 바뀌었나 보다.
먼가 springboot에서는 camel이 대세인 것 같은데, DB에 있는 값이 snake인 이유는 기존 레거시 코드가 snake라서... 애초에 camel형태로 만들면 좋았겠지만 어쩔 수 없는 경우는 이렇게 어노테이션을 붙여서 해결하자
* 추가로 mysql에는 json형태의 field type을 제공하기 때문에 애초에 json필드로 만들어도 된다. 이경우 DB에서 json object를 파싱하기 때문에 db에 부하가 있을 수 있다. 그래서 그냥 코드 단에서 파싱하기로 해서 string으로 집어넣고 꺼내서 파싱하기로 ^^. 사용 목적을 고려해서 json field를 쓸 지, string field를 쓸 지 선택하면 되겠다.
'Study > 스프링부트-코틀린' 카테고리의 다른 글
[코프링] spring-boot/kotlin swagger 적용하기 (2) | 2022.08.22 |
---|---|
[코프링] flyway 이용해서 spring-boot mysql 세팅하기 (0) | 2022.08.14 |