@Component
public class UserInsertThread implements Runnable {
	
	private List<User> list;
	private CountDownLatch latch;
	
	public UserInsertThread(CountDownLatch latch, List<User> list) {
		this.latch = latch;
		this.list = list;
	}

	public void run() {
		insert();
	}
	
//	@Transactional(propagation = Propagation.NESTED)
	@Transactional
	public void insert() {
		UserMapper userMapper1 = SpringBeanFactory.getBean(UserMapper.class);
		userMapper1.insertBatch(list);
		this.latch.countDown();
	}
}
	@Transactional
	public Integer insertBatch(List<User> list) {
		
		int cnt = list.size();
		
		int threadCnt = cnt / 500;
		
		if(cnt%500 > 0) {
			threadCnt++;
		}

		final CountDownLatch cdl= new CountDownLatch(threadCnt);
		List<User> threadList = null;
		
		for (int i = 0; i < threadCnt; i++) {
			threadList = i == threadCnt-1 ? list.subList(i * 500, list.size()-1) : list.subList(i*500, (i+1)*500);
			new Thread(new UserInsertThread(cdl, threadList)).start();
		}
		
		try {
			cdl.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		return 0;
	}