JPA3 Bulk Update 성능 개선: JPA에서 JdbcTemplate으로 전환 이번 포스팅에서는 제가 실제 프로젝트에서 겪었던 대량 데이터 처리 성능 이슈와 이를 해결한 경험을 적어보고자 합니다.JPA의 saveAll()을 사용하던 로직을 JdbcTemplate의 Bulk Update로 전환하면서 얻은 성능 개선 경험을 기록해보고자 합니다. 겪었던 성능 이슈프로젝트를 진행하면서 다음과 같은 성능 문제에 직면했습니다:JPA의 saveAll()을 사용한 대량 데이터 업데이트 시 심각한 성능 저하 발생약 8,000건의 데이터 처리에 약 18분이라는 긴 시간이 소요각 엔티티마다 개별 UPDATE 쿼리가 실행되어 데이터베이스 부하 증가실제 처리해야 할 데이터는 10,000건 미만이었지만, 단순 데이터 적재 외에도 여러 부가적인 처리 작업이 필요했기 때문에 꽤나 긴 시간이 소요되었습니다.이러.. 2025. 4. 7. 엔티티 조회 대신 존재 여부만 확인하기 특정 조건의 데이터가 DB 에 존재하는지 알기 위해선 직접 엔티티를 조회해서 그 값을 확인해볼수있고, 존재하는지만 체크할 수 있습니다.DB에 존재하는지만 알고 싶은데 굳이 엔티티를 조회해와야하나? 싶은 마음에 DB에 존재하는지만 체크해보기로 했습니다.리팩토링 전기존에는 알림의 존재 여부를 확인할 때 엔티티를 조회하고 있었습니다:@Query(value = """ SELECT * FROM notification WHERE type = :type AND user_id = :userId AND is_active = true AND created_at >= :timeLimit ORDER BY id DESC LIMIT 1""", nativeQuery = true.. 2025. 3. 7. JPA Custom Query Method 사용 시 트랜잭션 이슈 및 해결 문제 상황JPA Repository에서 커스텀 쿼리 메소드로 데이터를 삭제하려 했을 때 트랜잭션 관련 예외가 발생하였습니다.구체적으로는 No EntityManager with actual transaction available for current thread 에러가 발생하였습니다.특이한 점은 JPA에서 기본으로 제공하는 delete 메소드들(deleteById, delete 등)은 정상적으로 동작하였으나, 커스텀 메소드에서만 문제가 발생하였습니다.원인JPA의 SimpleJpaRepository에서 제공하는 기본 삭제 메소드들에는 @Transactional 어노테이션이 기본적으로 포함되어 있습니다.실제 SimpleJpaRepository의 구현부를 보면 다음과 같이 모든 삭제 메소드에 @Transacti.. 2025. 2. 24. 이전 1 다음