인프런 커뮤니티 질문&답변
게시글 테스트 데이터 삽입 에서 SQL 최대 2만건 삽입 되는문제
해결된 질문
작성
·
153
0
게시글 데이터 삽입 부분에서요, 영상 강의에서는 데이터 1200만건 삽입 하는데 대략 13분 정도 걸리는걸 확인 햇는데, 저는 2초만에 끝나더니 삽입된 갯수 확인해보니까 2만건만 추가 되고 더 추가 안된거같은데 어떤 문제가 있을가요??
아래는 코드랑 영상에서 설명한 sql 설정값 첨부 했습니다.
@SpringBootTest
public class DataInitializer {
    @PersistenceContext
    EntityManager entityManager;
    @Autowired
    TransactionTemplate transactionTemplate;
    Snowflake snowflake = new Snowflake();
    CountDownLatch latch = new CountDownLatch(EXECUTE_COUNT);
    static final int BULK_INSERT_SIZE = 2000;
    static final int EXECUTE_COUNT = 6000;
    @Test
    void initialize() throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for(int i = 0; i < EXECUTE_COUNT; i++) {
            executorService.submit(() -> {
                insert();
                latch.countDown();
                System.out.println("latch.getCount() = " + latch.getCount());
            });
        }
        latch.await();
        executorService.shutdown();
    }
    void insert() {
        transactionTemplate.executeWithoutResult(status -> {
            for(int i = 0; i < BULK_INSERT_SIZE; i++) {
                Article article = Article.create(
                        snowflake.nextId(),
                        "title" + i,
                        "content" + i,
                        1L,
                        1L
                );
                entityManager.persist(article);
            }
        });
    }
}
답변 2
0
안녕하세요, 인프런 AI 인턴입니다. MinKyu Song님.
질문 주신 내용은 대량의 데이터를 삽입할 때 일부 데이터만 삽입되고 전체 데이터 삽입이 완료되지 못한 문제에 관한 것입니다. 아래에서는 이와 관련된 몇 가지 주요 원인과 해결 방법을 안내드립니다.
주요 원인 및 해결 방법
- 트랜잭션과 커밋 문제: - 제공해주신 코드에서는 transactionTemplate.executeWithoutResult안에서EntityManager.persist를 호출하여 데이터를 삽입하고 있습니다.
 
- 대량의 데이터를 삽입할 때 트랜잭션이 너무 커지면 문제가 발생할 수 있으므로, 데이터의 양을 조절하거나 적용 가능한 경우, flush()및clear()메소드를 통해 중간에 커밋하는 방법을 고려해 볼 수 있습니다.
 
 
- 제공해주신 코드에서는 
- 메모리 이슈: - 대량의 데이터를 한 번에 삽입하기 때문에 JVM의 메모리 제한에 걸릴 수 있습니다. 이 경우 JVM 옵션을 통해 힙 메모리를 늘리는 방법도 있습니다.
 
- -Xmx및- -Xms옵션을 사용하여 JVM의 메모리 크기를 설정할 수 있으며, 이 값이 충분히 큰지 확인해 보세요.
 
 
- 대량의 데이터를 한 번에 삽입하기 때문에 JVM의 메모리 제한에 걸릴 수 있습니다. 이 경우 JVM 옵션을 통해 힙 메모리를 늘리는 방법도 있습니다.
- 데이터베이스 설정: - MySQL의 설정 중 max_allowed_packet값이 너무 작거나, 다른 쿼리 제한 설정이 있는지 확인합니다. 이 설정을 통해 데이터베이스에서 수용할 수 있는 데이터의 최대 크기를 조절할 수 있습니다.
 
 
- MySQL의 설정 중 
- 쓰레드 수 조정: - 현재 코드에서 스레드 풀을 10개로 설정하여 실행하고 있습니다. 이 수치 또한 메모리 사용에 영향을 미칠 수 있으므로 필요에 따라 조정해야 할 수 있습니다.
 
 
- 현재 코드에서 스레드 풀을 10개로 설정하여 실행하고 있습니다. 이 수치 또한 메모리 사용에 영향을 미칠 수 있으므로 필요에 따라 조정해야 할 수 있습니다.
위의 문제들과 관련된 추가 자료나 유사한 해결 사례
위의 해결 방법을 기반으로 구체적인 설정을 테스트한 후, 더 많은 정보를 얻으시려면 아래 유사한 문제 해결을 다룬 자료들을 참고하세요:
저는 질문자님의 이해를 돕고자 기존의 지식공유자님의 답변을 참고하여 유사한 해결 링크와 추가 설명을 제공합니다. 현재 베타 기능으로 답변이 충분치 않을 수 있는 점 양해 부탁드리며, 추가적으로 궁금한 점이 있으시면 자유롭게 질문해 주세요. 곧 지식공유자께서 추가적인 답변을 제공해 주실 것입니다.








다시 똑같은 코드로 테스트 돌리니까 1200만건이 삽입 됫어요, 처음에 왜그랫는지 모르겟지만, 스프링 버전은 아래내용으로 강의와 맞게 설정 햇어요
plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.7' }