[기록이유]
최근 네트워크 정책이 적힌 파일을 parsing 해서 DB로 관리할 일이 생겼다.
List<Map<String, String>> 형태의 ArrayList 를 저장해야했다.
for문을 돌리면서 한 줄 한 줄 넣기에는 적게는 수 천번을 해야했기에, 한 번에 insert 하는 방법을 강구했다.
[예제]
1. 데이터
다음과 같은 ArrayList 가 있다.
List<Map<String, String>> policyList
이 리스트에는 다음과 같은 형태로 값이 들어있다.
[
{source=192.168.20.3, application=dev, destination=192.168.20.235, port=7765},
{ source=192.168.20.4, application=dev, destination=192.168.20.236, port=7735 },
{ source=192.168.20.5, application=proc, destination=192.168.20.237, port=7715 },
......
{ source=192.168.20.6, application=dev, destination=192.168.20.247, port=7795 }
]
2. DAO.java
int insertPolicy(List<Map<String, String>> policyList);
3. TEST.xml
<insert id="insertPolicy" parameterType="java.util.List">
INSERT INTO tb_test_policy (
source,
application,
destination,
port,
service,
action,
) VALUES
<foreach collection="list" item="policy" separator=",">
(
#{policy.source, jdbcType=VARCHAR},
#{policy.application, jdbcType=VARCHAR},
#{policy.destination, jdbcType=VARCHAR},
#{policy.port, jdbcType=VARCHAR},
#{policy.service, jdbcType=VARCHAR},
#{policy.action, jdbcType=VARCHAR}
)
</foreach>
</insert>
*** 주의할 점.
policyList 에는 service와 action 에 대한 값이 존재하지 않는다. 그러면 MyBatis 는 자동으로 null 을 반환해서 입력한다.
값이 없다고 insert 구문에 작성하지 않으면 문법오류가 발생한다.
[마무리]
일단 이렇게 여러개의 값을 한 번에 insert 할 수 있었다.
다만, 수 만개의 데이터를 이런 방식으로 insert 한다고 생각해보면 서버에 상당한 부하를 줄 것 같다는 생각이 든다.
추후에 insert 방식을 반드시 바꿔야할 듯.
여러번에 걸쳐서 insert 하는 방식등으로 실행하는 건 어떨까싶다.
반응형