MyBatis

[MyBatis] 한 번에 다수의 값 insert 하기

블체. 2025. 6. 12. 20:22

[기록이유]

최근 네트워크 정책이 적힌 파일을 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 하는 방식등으로 실행하는 건 어떨까싶다.

반응형