한번에 데이터를 1개씩 넘기는경우 문제가 없으나 실제 대량의 데이터값이 들어올경우 DB에 반영되는 매 건 마다 커넥션, commit을 진행하는동안 비용이 발생, 성능적인 문제가 발생하게 된다.
//해당 쿼리가 연속적으로 실행된다고 가정을해보자
insert into member (last_name) values ("김");
insert into member (last_name) values ("이");
insert into member (last_name) values ("박");
insert into member (last_name) values ("최");
insert into member (last_name) values ("한");
insert into member (last_name) values ("박");
insert into member (last_name) values ("백");
insert into member (last_name) values ("김");
insert into member (last_name) values ("이");
이럴경우 사용되는것이 BulkInsert로 한번에 여러개의 데이터 레코드를 넣는경우 유리하다.
//예시코드
<insert id="insertUsers" parameterType="memberVO">
INSERT INTO users (username, email, age)
VALUES
<foreach collection="list" item="user" separator=",">
(#{user.username}, #{user.email}, #{user.age})
</foreach>
</insert>
번역
insert into users values
('김','hello1@naver.com','10')
,('이','hello2@naver.com','20')
,('최','hello3@naver.com','30')
그렇다면 실제로 얼마나 속도차이가 나타나는지 확인해보자
noticeMapper
//기존방식
<insert id="testMake1" parameterType="noticeVO">
insert into notice
(notice_title) values
(#{notice_title})
</insert>
//bulk방식
<insert id="testMake2" parameterType="java.util.List">
insert into notice (notice_title) values
<foreach collection="list" item="item" separator=",">
(#{item.notice_title})
</foreach>
</insert>
noticeDAO
//기존방식
public int noticetest1(NoticeVO vo) {
return noticeSST.insert("notice.testMake1", vo);
}
//bulk방식
public int noticetest2(List<NoticeVO> vo) {
return noticeSST.insert("notice.testMake2", vo);
}
noticeController
@RequestMapping("/notice")
public String noticeAll(Model model) {
List<NoticeVO> noticeall = noticeDAO.noticeAll();
model.addAttribute("notice", noticeall);
//요기서부터 보기
long startTime = System.currentTimeMillis(); // 시작 시간 측정
for(int i = 0; i<100; i++) {
NoticeVO testvo1 = new NoticeVO();
testvo1.setNotice_id(i);
noticeDAO.noticetest1(testvo1);
}
long endTime = System.currentTimeMillis(); // 종료 시간 측정
long elapsedTime = endTime - startTime; // 경과 시간 계산
System.out.println("첫번째 : Execution Time: " + elapsedTime + " milliseconds"); // 실행 시간 출력
startTime = System.currentTimeMillis();
List<NoticeVO> testvoList = new ArrayList<>();
//bulk방식
for(int i = 0; i<100; i++) {
NoticeVO testvo2 = new NoticeVO();
testvo2.setNotice_id(i);
testvoList.add(testvo2);
}
noticeDAO.noticetest2(testvoList);
endTime = System.currentTimeMillis(); // 종료 시간 측정
elapsedTime = endTime - startTime; // 경과 시간 계산
System.out.println("두번째 : Execution Time: " + elapsedTime + " milliseconds"); // 실행 시간 출력
return "notice/notice";
}
현재의 예시 코드는 100번의 insert를 발생시키며 이것을 기존 mapper의 insert 방식과 foreach를 활용한 bulkinsert 방식 2가지를 비교하였다.
실제 작업까지 걸린시간을 각각 확인하였는데 약 3배 가까이 DB에 정리되는 시간이 단축되었다.
insert 방식은 약 0.09초
bulk 방식은 약 0.03초로 3배 가까이 빠른것을 확인할수 있다.
'Spring' 카테고리의 다른 글
웹에서 핸드폰으로 메세지 보내기 - 1 (0) | 2024.02.05 |
---|---|
카카오 api 로그인 (0) | 2024.02.04 |
putty를 활용해 EC2에 접근하기 (0) | 2024.02.01 |
Spring MVC의 핵심 애노테이션 (0) | 2024.01.26 |
SSR, CSR, SSG (0) | 2024.01.23 |