[DEV] 기록

[SpringBoot + MyBatis] TypeHandler 통해 JSON List varchar로 저장

구데타마 2022. 4. 13. 00:08

개요

api 응답으로 json list가 오는데 이를 MariaDB varchar형 칼럼에 저장하려고 하니 원하는 대로 안됐습니다.

열심히 검색한 결과 이를 위해서는 커스텀 TypeHandler를 정의해야했고 TypeHandler를 적절히 구현하면 JSON 형태의 문자열을 그대로 DB에 저장하고 조회할 수 있었습니다.

저는 keichee님 블로그를 보고 위 문제를 해결할 수 있었으며 하기 내용도 keichee님이 작성하신 내용과 거의 동일하므로 해당 블로그를 방문하시는 것을 추천드립니다!

 

1. DTO 구조

DTO 구조를 보면 ExampleWrapper 클래스가 ExampleJson 배열을 필드로 두고 있고 여기서 ExampleJson 클래스가 json 형태로 DB에 저장될 정보입니다.

 

 

 

2. TypeHandler + mapper.xml

DB에는 ExampleJson 배열이 들어갈 column을 varchar형으로 선언하였고 column명을 example_json_list로 지정하였습니다.

우선, ExampleJson의 리스트에 대한 TypeHandler 정의는 아래와 같이 진행해주면 됩니다.


 

ExampleJsonTypeHandler는 BaseTypeHandler를 상속받으면서 List<ExampleJson> 타입에 대한 핸들러임을 명시했습니다.

그리고 setter 메서드에는 Gson 라이브러리의 toJson() 메서드를 이용하여 리스트를 json 타입으로 변환해주었고 getter에는 조회한 json 문자열을 리스트 형태로 재구성해주기 위해 jackson 라이브러리의 ObjectMapper의 readValue() 메서드를 이용하였습니다.

convertToList 메서드를 보시면 keichee님과 다르게 문자열이 null일 경우 예외처리하는 코드를 추가했는데 저장된 리스트가 null일 경우 이렇게 처리해주지 않으면 에러가 발생하기 때문에 꼭 예외처리를 해주셔야 합니다.

 

이제 ExampleJsonTypeHandler를 MyBatis 매핑 파일에 등록해야하는데 아래와 같이 resultMap과 insert문에 등록해주시면 됩니다.


반응형