한번에 데이터를 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

+ Recent posts