@GeneratedValue(strategy = GenerationType.IDENTITY) 으로 선언된 PK가 있다면 JPA에서는 Bulk Insert를 지원하지 않습니다. QueryDSL-JPA도 마찬가지인데요. 이럴 경우 MyBatis나 JdbcTemplate을 사용해야 하는데 둘 다 타입 안정성이 떨어지지만 JdbcTemplate이 컴파일 타임 시 타입 안정성을 더 높일 수 있다고 판단하여 JdbcTemplate으로 Bulk Insert를 구현하게 됐습니다. JPA에서 Bulk Insert를 지원하지 않는 이유@GenerationValue(strategy = GenerationType.IDENTITY)로 @Id 컬럼을 선언하고 batch insert는 할 수 없습니다. 공식 문서에는 다음과 같..
MyBatis 코드를 QueryDSL로 이관하는 작업 중에 여러 개의 테이블의 조인되어 있는 결과를 반환하는 매핑 클래스를 만들어야 했습니다. QueryDSL의 경우 projection이라고 해서 SELECT 절의 조회 대상을 지정하는 방법이 있었습니다. projection 용 record 타입의 dto를 하나 만들어 결과를 매핑하여 처리를 하였는데요. 그 코드를 한 번 소개하려고 합니다. ProjectionProjection은 프로그래밍 및 데이터베이스 분야에서 전체 데이터 중 일부만 선택해 가져오는 작업을 말합니다. 주로 QueryDSL, JPA, SQL 등에서 사용되며, 필요한 데이터만 선택적으로 추출하여 효율적인 데이터 전송 및 처리를 가능하게 합니다. Projection 사용 시 주의 사항 ..
QueryDSL의 타입 안정성Querydsl의 핵심 원칙은 타입 안정성(Type safety) 이다. 도메인 타입의 프로퍼티를 반영해서 생성한 쿼리 타입을 이용해서 쿼리를 작성하게 된다. 또한, 완전히 타입에 안전한 방법으로 함수/메서드 호출이 이루어진다. QueryDSL은 개발자가 직접 SQL문을 작성하지 않고, Java 코드 기반의 빌더 API를 사용하여 타입 안전한 쿼리를 작성할 수 있도록 도와주는 프레임워크입니다. QClass는 정적 타입 기반으로 생성된 클래스로, 컴파일 시점에 타입 안정성을 보장하며, 쿼리 작성 과정에서 발생할 수 있는 오류를 최소화합니다. 또한 QClass는 엔티티 클래스에서 생성되며, 엔티티와 데이터베이스의 컬럼 이름을 기반으로 쿼리를 작성하기 때문에, 매핑할 프로퍼티 불일..
Driving 테이블조인시 먼저 액세스되는 쪽을 드라이빙 테이블(DRIVING TABLE, OUTER TABLE)이라고 하며 나중에 액세스 되는 테이블을 드리븐 테이블(DRIVEN TABLE, INNER TABLE)이라고 합니다. 인덱스(INDEX)의 존재 및 우선순위 혹은 FROM 절에서의 TABLE 지정 순서에 영향을 받으며 어느 테이블이 먼저 액세스되느냐에 따라 속도의 차이가 크게 날 수 있으므로 대량의 데이터를 다룰 때 정말 중요합니다. 조건을 만족하는 테이블과 해당하는 로우 데이터 수가 다음과 같다고 가정합니다. A 테이블: 1억건B 테이블: 100건 이 때, 조인시 드라이빙 순서에 따라 속도의 확연한 차이가 발생할 수 있습니다. A 테이블을 드라이빙하게 되면 최대 1억 번을 반복하며 B 테이블..