๐ป Programming/์นํ๋ก๊ทธ๋๋ฐ
TypeHandler๋ฅผ ์ด์ฉํ ๊ฐ์ฒด ๋ฆฌ์คํธ๋ฅผ text(varchar)๋ก ์ ์ฅํ๊ธฐ
MyBatis TypeHandler๋ฅผ ์ด์ฉํ ๊ฐ์ฒด๋ฆฌ์คํธ ํธ๋ค๋ง
์ด๋ฒ์ ํน์ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ค๊ฐ JSON ํํ์ ์คํธ๋ง์ ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค๊ฐ ๊บผ๋ด์จ์ผํ๋ ์ํฉ์ด ์๊ฒผ๋ค.
๊ทธ๊ฒ๋ RBD์ธ mysql ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง์ด๋ค. mysql์ด json ์ปฌ๋ผ์ ์ง์ํ๊ธฐ๋ ํ์ง๋ง json ํจ์๋ฅผ ์ฟผ๋ฆฌ์ ์ธ ํ์๊น์ง๋ ์๋ ์ํฉ์ด๋ค๋ณด๋ ๊ทธ๋ฅ varcharํ์ ์ผ๋ก ์ปฌ๋ผ์ ์ ์ํ๊ณ ์ฌ๊ธฐ์ jsonํฌ๋งท์ ์คํธ๋ง์ ๊ทธ๋๋ก ์ ์ฅํ๋ค๊ฐ ๊บผ๋ด์ธ ์ ์๋๋ก ํด์ผํ๋ค.
์ผ๋จ ํ์
ํธ๋ค๋ฌ๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๋ก ํ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ ๊ฑด์ง ๊ฒ์์ ์ข ํด๋ดค๋ค. ๊ตฌ๊ธ์์ "Type handler for ArrayList in myBatis" ๋ผ๊ณ ๊ฒ์์ ํ๋ ๋ง์ ํฌ์คํ
์ด ๊ฒ์์ด ๋์๊ณ ๋ด ํ๋ก์ ํธ์ ๋ง๊ฒ ๊ฐ์ ธ๋ค๊ฐ ์ธ ์ ์์๋ค.
์์ ๋ด์ฉ์ ์ ๋ฆฌํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ฐ์ dto์ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด MyJsonDataWrapperClass ๊ฐ myJsonData ๋ฆฌ์คํธ๋ฅผ ๋ค๊ณ ์๋๋ฐ ์ด๋ MyJsonData ํด๋์ค๊ฐ ๋ฐ๋ก json ํํ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ์ ๋ณด์ด๋ค.
@Getter
@Setter
@JsonInclude(Include.NON_NULL)
public class MyJsonDataWrapperClass {
private Integer someIntData;
private List<MyJsonData> myJsonData = new ArrayList<>();
@Override
public String toString() {
return new Gson().toJson(this);
}
}
@Getter
@Setter
@EqualsAndHashCode
public class MyJsonData {
private String name;
private int age;
@Override
public String toString() {
return new Gson().toJson(this);
}
}
๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ myJsonData ๋ผ๋ ์ด๋ฆ์ผ๋ก textํ์ ์ ์ปฌ๋ผ์ ๋ง๋ค์๊ณ mybatis์ insert๋ฌธ์ ์ฌ์ฉํ ํ์ ํธ๋ค๋ฌ๋ฅผ ์๋์ ๊ฐ์ด ๋ช ์ํด์ฃผ์๋ค.
, myJsonData = #{myJsonData, typeHandler=MyJsonDataTypeHandler}
๊ทธ๋ฆฌ๊ณ ํ์ ํธ๋ค๋ฌ๋ ์๋์ ๊ฐ์ด ์ ์ํ์๋ค.
@Slf4j
public class MyJsonDataTypeHandler extends BaseTypeHandler<List<MyJsonData>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<MyJsonData> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, new Gson().toJson(parameter));
}
@Override
public List<MyJsonData> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return convertToList(rs.getString(columnName));
}
@Override
public List<MyJsonData> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return convertToList(rs.getString(columnIndex));
}
@Override
public List<MyJsonData> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return convertToList(cs.getString(columnIndex));
}
private List<MyJsonData> convertToList(String myJsonDataListAsString) {
try {
return new ObjectMapper().readValue(myJsonDataListAsString, new TypeReference<List<MyJsonData>>() {
});
} catch (IOException e) {
log.error("MyJsonDataTypeHandler failed to convert text to list, myJsonDataListAsString:{}", myJsonDataListAsString, e);
}
return Collections.emptyList();
}
}
BaseTypeHandler๋ฅผ ์์ํ๋ฉด์ List<MyJsonData> ํ์ ์ ๋ํ ํธ๋ค๋ฌ์์ ๋ช ์ํด์ฃผ์๊ณ setter์๋ ๋ฆฌ์คํธ ํํ๋ฅผ json ์คํธ๋ง์ผ๋ก ๋ง๋ค์ด์ฃผ๋๋ก Gson.toJson() ๋ฉ์๋๋ฅผ ์ด์ฉํ์๊ณ , getter์๋ ์กฐํํ json ์คํธ๋ง์ ๋ค์ ๋ฆฌ์คํธ ํํ๋ก ๋ณํํด์ฃผ๋๋ก ํ์๋๋ฐ ์ด๋๋ ObjectMapper.readValue()๋ฅผ ์ด์ฉํ์๋ค.
์กฐํ์์๋ mybatis ๋งคํํ์ผ์ ์๋์ ๊ฐ์ด resultMap์ ์ ์ํ์ฌ MyJsonDataTypeHandler๋ฅผ ์ด์ฉํด์ myJsonDataํ๋์ ๊ฐ์ ArrayList๋ก ๋ณํํ๋๋ก ํ์์ผ๋ฉฐ, ์ด๋ ๊ฒ ์ ์ํ resultMap์ select ๋ฌธ์ resultMap์ผ๋ก ์ ์ธํด์ฃผ์๋ค.
<resultMap id="myJsonDataClassMap" type="MyJsonDataWrapperClass">
<result property="myJsonData" column="myJsonData" javaType="java.util.ArrayList"
jdbcType="VARCHAR" typeHandler="MyJsonDataTypeHandler" />
</resultMap>
....์ค๋ต....
<select id="findMyJsonDataType"
resultMap="myJsonDataClassMap">
SELECT * FROM findMyJsonDataWrapperClass
</select>
์ด๋ ๊ฒ ํด์ฃผ๋ฉด ์์ค๋ ๋ฒจ์์๋ ํน์ ๊ฐ์ฒด์ ๋ฆฌ์คํธ ํํ๋ก ํธ๋ค๋ง์ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ json ์คํธ๋ง์ผ๋ก ์ ์ฅํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
์ปฌ๋ผ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ชผ๊ฐ์ ์ ์ฅํ๊ธฐ ์ ๋งคํ ์ํฉ์์ json ์คํธ๋ง์ varchar(text) ํ์ ์ผ๋ก ํต์ผ๋ก ์ ์ฅํ๊ณ ์์ค๋ ๋ฒจ์์๋ ๊ฐ์ฒดํ์ ์ผ๋ก ํธ๋ค๋งํ ์ ์๋๋ก ํด์ฃผ๋ ๊ฑด ์ ๋ง ๋ฉ์ง ๊ธฐ๋ฅ์ธ๊ฒ ๊ฐ๋ค.
'๐ป Programming > ์นํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MySQL] ๋ฐ๋ชฌํ๋ก์ธ์ค๊ฐ ์๊พธ ์๋์ผ๋ก ์คํ๋์ (0) | 2020.07.05 |
---|---|
[MySQL] auto_increment ์ปฌ๋ผ ๊ฐ์ ์ธ์ ์ฆ๊ฐํ ๊น (0) | 2020.07.02 |
[AWS] Beanstalk IP ์ฃผ์ ์กฐํ (0) | 2020.04.03 |
[HTML ๊ธฐ๋ณธ] HTMLํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๋งํฌ/import/includeํ๊ธฐ (0) | 2019.07.10 |
์ดํด๋ฆฝ์ค์ ์คํ๋ง๋ถํธ ์ค์นํ๊ธฐ (Install SpringBoot in Eclipse) (0) | 2019.06.26 |