DB에 json을 string으로 저장하고 사용하기, camel -> snake 변환

     

 

어찌어찌하여 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안에 넣으면 오브젝트로 튀어나온다. 신기방기. 

 

좋아 실행해보자!! 했는데 역시나 에러가 났다 ^^^^^

 

error 안나면 이상하쥬?

 

 

에러를 보니 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를 붙였는데, 요즘엔 어노테이션 추가하는 걸로 바뀌었나 보다.

 

요렇게 deprecated 되었다

 

먼가 springboot에서는 camel이 대세인 것 같은데, DB에 있는 값이 snake인 이유는 기존 레거시 코드가 snake라서... 애초에 camel형태로 만들면 좋았겠지만 어쩔 수 없는 경우는 이렇게 어노테이션을 붙여서 해결하자 

 

 

 

* 추가로 mysql에는 json형태의 field type을 제공하기 때문에 애초에 json필드로 만들어도 된다. 이경우 DB에서 json object를 파싱하기 때문에 db에 부하가 있을 수 있다. 그래서 그냥 코드 단에서 파싱하기로 해서 string으로 집어넣고 꺼내서 파싱하기로 ^^. 사용 목적을 고려해서 json field를 쓸 지, string field를 쓸 지 선택하면 되겠다.

반응형

댓글

Designed by JB FACTORY