엑셀 데이터, 한 방에 쏙! SQL Mapper <foreach>로 대량 INSERT 똑똑하게 하기! 🚀
📌 엑셀 데이터, DB에 넣으려니 막막하다!
엑셀 파일에 정리된 소중한 데이터들을 우리 DB에 착착 넣어줘야 할 때가 있다. 보통 서버에서 이 데이터들을 List<Map<String, Object>> 형태로 받아서 처리하게 되는데 · · · · · · · ·
📌 우리들의 흔한 실수 : for문 돌리기!
처음엔 그랬다. List<Map<String, Object>> 형태로 받은 데이터들을 보면서 '음, 리스트니까 하나씩 꺼내서 넣어주면 되겠네!' 하고 생각했다. 그래서 아래처럼 for문을 돌려서 각 행(row)마다 INSERT 쿼리를 날리는 방법을 떠올렸다.
List<Map<String, Object>> rows = new ArrayList<>();
/*
rows.add(수많은 row);
*/
for(Map<String, Object> row : rows) {
mapper.insertExcelUploadData(row); // 각 행마다 INSERT!
}
📌 아쉬움의 발견: "이게 최선일까?"
뭔가 아쉬운 느낌적인 느낌이 들었다! 데이터를 한 번에 묶어서 하나의 트랜잭션으로 처리하는 게 더 좋지 않을까 하는 생각이 들었다. for문을 돌리면 데이터 한 건 한 건마다 INSERT 쿼리가 실행되고, 이게 쌓이면 성능에도 안 좋고, 네트워크 부하도 커질 수 있다. 마치 한 명 한 명 따로 불러서 도장 찍는 것과 같달까? 😅
특히, 대량의 데이터를 INSERT할 때는 이런 방식이 치명적일 수 있어. 만약 중간에 오류라도 나면 로그를 뒤져보며 어디까지 입력됐는지도 찾아야하는 수고로움이 있을 수 있고, 예외상황에 대해서 rollback으로 처리하더라도 성능에 좋지 않다.
📌 짜잔! 해결사 등장: SQL Mapper의 <foreach> 태그!
이런 아쉬움을 한 방에 날려줄 마법 같은 친구가 바로 SQL Mapper의 <foreach> 태그이다! 이 친구는 여러 개의 INSERT 문을 하나로 묶어서 한 번에 실행하게 해주는 아주 똑똑한 기능이다.
📌 <foreach> 파헤치기: 어떻게 쓰는 건데?
<foreach> 태그는 List나 Array 같은 컬렉션 타입의 데이터를 반복해서 처리할 때 유용하게 쓰인다. 특히 INSERT 문에서 VALUES 부분에 여러 개의 행을 한 번에 넣어줄 때 빛을 발한다!
아래 예시 코드를 한번 볼까?
xml
<insert id="insertExcelUploadDataBatch">
INSERT INTO TABLENAME
(
컬럼1,
컬럼2,
컬럼3,
컬럼4,
...
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.키1},
#{item.키2},
#{item.키3},
#{item.키4},
...
)
</foreach>
</insert>
여기서 중요한 속성들은 아래와 같다.
collection: 반복할 데이터 컬렉션의 이름을 지정해준다. 우리 예시에서는 List 타입의 데이터가 넘어오니까 "list"라고 썼다.
item: 컬렉션의 각 요소를 참조할 때 사용할 변수 이름이다. 여기서는 "item"이라고 했으니, list 안에 있는 각각의 Map 객체를 item으로 받아 쓸 수 있어.
separator: 반복되는 각 요소 사이에 어떤 구분자를 넣을지 지정해준다. INSERT 문에서 여러 VALUES 묶음을 넣을 때는 쉼표(,)로 구분하는 게 일반적이다.
이렇게 하면, List 안에 있는 모든 Map 데이터들이 하나의 INSERT 문 안에 VALUES (값1), (값2), (값3)... 이런 형태로 예쁘게 만들어져서 한 방에 DB로 전달된다!
📌 왜 <foreach>가 최고일까?: 성능과 안정성 두 마리 토끼 잡기!
성능 UP!: 여러 번의 INSERT 쿼리를 한 번의 쿼리로 줄여주기 때문에 데이터베이스와의 통신 횟수가 확 줄어든다. 이는 곧 처리 속도 향상으로 이어진다 !
트랜잭션 관리 용이: 모든 INSERT 작업이 하나의 쿼리로 묶여서 실행되기 때문에, 전체 작업을 하나의 트랜잭션으로 쉽게 관리할 수 있다. 만약 중간에 오류가 발생하면 전체 작업을 롤백(되돌리기)해서 데이터 정합성을 유지하기가 훨씬 수월하다.
📌 마무리: 이제 엑셀 데이터, 두렵지 않아!
SQL Mapper의 <foreach> 태그를 활용하면 대량의 데이터도 빠르고 안전하게 처리할 수 있다! 앞으로도 이런 똑똑한 방법들 많이 많이 배워서 멋진 개발자가 되자! 😊
'개발리뷰' 카테고리의 다른 글
| RISS 국내 논문 데이터 크롤링 프로젝트 (0) | 2023.10.12 |
|---|---|
| MySql 사용하기 (0) | 2023.10.10 |
| OAuth 2.0 네이버 로그인 개발 리뷰 (0) | 2023.09.22 |