JPA N+1문제란 ? JPA(Java Persistence API)에서 N+1 문제는 데이터베이스 쿼리를 실행할 때 발생하는 성능 문제 중 하나입니다. 이 문제는 일반적으로 관련된 엔티티를 가져올 때 발생하는데, 예를 들어 N 개의 엔티티를 가져온 후에 그 엔티티와 관련된 다른 엔티티들을 가져오는 과정에서 발생합니다. 이때, 쿼리가 N+1번 실행되는 것이 문제입니다. 즉 연관된 엔티티를 가져오기 위해 추가로 쿼리가 발생하는 현상입니다. 원인 원인은 JPA 에서 연관관계가 있는 객체는 proxy 객체로 가져오기 때문이다. ( 데이터 로딩방식은 지연로딩이라고 가정 하자 ) Entity 연관관계 게시물과 댓글을 예시로 들어 설명해 보겠다. 게시물과 댓글은 서로 일대다 관계에 있다. Poster Entity ..
데이터 조회 방식 데이터베이스 조회 방식은 소프트웨어 개발에서 매우 중요한 부분 중 하나입니다. 이 중에서도 즉시로딩(Immediate Loading)과 지연로딩(Lazy Loading)은 주로 객체 관계 매핑(ORM) 프레임워크에서 사용되는 두 가지 주요한 데이터 로딩 방식입니다. 이번 글에서는 즉시로딩과 지연로딩의 개념과 각각의 특징, 장단점에 대해 알아보겠습니다. 즉시로딩 즉시로딩은 데이터를 조회할 때 연관된 모든 객체를 한 번에 로딩하는 방식입니다. 데이터베이스에서 주어진 쿼리에 대한 결과를 가져올 때, 연관된 모든 객체를 즉시 메모리에 올려서 사용할 수 있습니다. 장점 사용자가 객체를 사용할 때마다 쿼리를 실행할 필요가 없어서 성능이 향상됩니다. 데이터를 한 번에 로딩하기 때문에 네트워크 오버헤..
더티 체킹 정의 더티 체킹(dirty checking)은 소프트웨어 개발에서 데이터 변경을 감지하고 이를 처리하는 기술입니다. 주로 데이터베이스나 UI 업데이트와 관련이 있습니다. 더티 체킹은 보통 데이터베이스나 객체의 속성을 감시하고, 이 속성이 변경되었는지 여부를 확인합니다. 변경 사항이 발생하면 이를 감지하고 이에 따라 필요한 작업을 수행합니다. 이것은 데이터베이스 시스템에서 레코드를 업데이트하거나, UI 프레임워크에서 화면을 업데이트하는 등의 작업에 활용됩니다. 더티 체킹은 주로 객체지향 프로그래밍에서 사용되며, 객체의 상태 변경을 추적하여 이를 적용하는 데 유용합니다. 주로 ORM(Object-Relational Mapping)과 같은 기술에서 데이터베이스 엔티티의 변경을 추적하는 데에 활용됩니..
문제 주식 종목 토론방 프로젝트를 하다보니 3600개 종목의 5년치 종목 일봉데이터(캔들데이터)를 저장할 일이 생겼다. 데이터의 수는 3600(종목수) x 5(년) x 200(1년치데이터) 으로 약 360만개 정도였다. 처음으로 저장하기 위해 시도한 방법은 단순히 DataJPA의 saveAll()메소드를 사용한 것이다. 하지만 저장하는 시간이 몇십분 이상이 걸리는 문제가 있었다. 간단한 테스트 코드로 성능을 측정해 보겠다. * 테스트는 h2 memory DB로 하였기 때문에 성능은 실제 mysql db와 다를 수 있다. @Before 10만개의 캔들데이터 생성 @BeforeAll static void before() { stockCandleList = new ArrayList(); for (int i =..