728x90
MySql 테이블에 컬럼 타입이 JSON인 컬럼을 MyBatis로 읽어오려고 했는데 처음에 오류가 나서 12시간 가량 삽질 끝에 빛이 보였다. 이 과정을 공유하려고 한다.
Select
문제
MySql 테이블은 다음과 같다.
CREATE TABLE `t_book`
(
...
`title` VARCHAR(100) NOT NULL,
`about` VARCHAR(100) NOT NULL,
`price` VARCHAR(100) NOT NULL,
`img` JSON NULL,
...
}
<select id="findHomeDisplayedBooks" resultMap="HomeDisplayedBookVO">
SELECT
title,
about,
price,
img
FROM t_book
ORDER BY createdAt
DESC LIMIT 5
</select>
이것의 결과로 이렇게 나왔었다.
[HomeDisplayedBookVO{title='나는찐개발자', about='나.', price='777', images=null}]
해결
<resultMap id="HomeDisplayedBookVO" type="com.myproject.doseoro.packages.book.vo.HomeDisplayedBookVO">
<result property="title" column="title"></result>
<result property="about" column="about"></result>
<result property="price" column="price"></result>
<result property="images" column="img" typeHandler="com.myproject.doseoro.global.util.JsonTypeHandler"></result>
</resultMap>
<select id="findHomeDisplayedBooks" resultMap="HomeDisplayedBookVO">
SELECT
title,
about,
price,
img
FROM t_book
ORDER BY createdAt
DESC LIMIT 5
</select>
insert 처럼 typeHandler를 추가해주었더니 DB에서 JSON으로 데이터를 가져올 수 있었다.
typeHandler 코드는 다음과 같다.
Insert
문제
MySql에 테이블은 select 할때와 같고, img 컬럼을 insert 하고싶었다. 오류가 계속 났다... 시도 끝에 해결책을 알아냈다.
CREATE TABLE `t_book`
(
...
`title` VARCHAR(100) NOT NULL,
`about` VARCHAR(100) NOT NULL,
`price` VARCHAR(100) NOT NULL,
`img` JSON NULL,
...
}
해결
<resultMap id="BookVO" type="com.myproject.doseoro.packages.book.vo.BookVO">
<result property="images" column="img" typeHandler="com.myproject.doseoro.global.util.JsonTypeHandler"></result>
</resultMap>
<select id="findBookByBookId" resultMap="BookVO" parameterType="String">
SELECT
img,
FROM t_book
WHERE id = #{bookId}
</select>
이것 또한 typeHandler 를 넣었어야 했습니다. typeHandler의 코드는 위와(insert 때와) 같습니다.
마치며
해결하고 나니 너무 뿌듯했습니다. 고민하고 찾는 시간은 고됐지만 해결 후 뿌듯함은 더할나위 없이 기쁘네요.