Query Builder - 검색 조건 쿼리
·
📦 Database/QueryDSL
💡검색 조건 쿼리 검색 조건은 .and() & .or() 메서드 체인으로 연결하여 조건을 추가할 수 있다. @SpringBootTest @Transactional class SearchTest @Autowired constructor( @PersistenceContext val em: EntityManager, val queryFactory: JPAQueryFactory ) { /** @desc 기본 검색 쿼리 */ @Test fun search() { val m: QMember = QMember("m") val findMember = queryFactory .selectFrom(m) .where(m.name.eq("member1").and(m.age.eq(10))) .fetchOne() assertTh..
Query Builder - JPQL vs QueryDsl
·
📦 Database/QueryDSL
💡 JPQL vs QueryDsl EntityManafer와 JPAQueryFactoru를 클래스의 생성자로 준다. 테스트 코드 작성 JPQL과 QueryDSL의 차이점 JPQL(문자)은 실행 시점에 오류가 나고 QueryDsl(코드)은 컴파일 타임에 오류가 난다. JPQL은 파라미터 바인딩을 직접하지만, QueryDsl은 동적으로 처리된다. Q-Type에 별칭을 지정할 수 있다. 실행되는 JPQL을 보고 싶으면 application.yml에 다음을 추가한다. spring.jpa.properties.hibernate.use_sql_comments: true @SpringBootTest @Transactional class QueryDslBasicTest @Autowired constructor( @Per..
Query Builder - 초기 설정
·
📦 Database/QueryDSL
💡 QueryDSL - Auto Entity Serialization 코틀린 기반 Spring Boot에서 QueryDSL을 이용해 자동으로 엔티티 직렬화를 하려면 다음과 같은 설정이 필요합니다. Gradle 설정 QueryDSL을 사용하기 위해서는 Gradle에 QueryDSL 관련 의존성을 추가해야 합니다. build.gradle 파일에 다음과 같이 의존성을 추가합니다. plugins { kotlin("kapt") version "1.4.10" // QueryDSL idea // QueryDSL } val querydslVersion ="5.0.0" // QueryDSL dependencies { implementation("com.querydsl:querydsl-jpa:$querydslVersion..
QueryDsl - Boolean Builder
·
📦 Database/QueryDSL
QueryDsl - Boolean Builder BooleanBuilder를 활용하면 동적인 쿼리 조건을 구성할 수 있으며, 필요에 따라 AND나 OR 연산으로 조건을 조합할 수 있습니다. 이를 통해 쿼리의 유연성과 강력한 조건 검색을 달성할 수 있습니다. and() & or() BooleanBuilder는 JPA에서 사용하는 동적 쿼리를 작성할 수 있는 빌더 클래스 중 하나입니다. and()와 or() 메서드는 BooleanBuilder 객체에 조건을 추가할 때 사용됩니다. and() 메서드는 이전에 추가된 조건과 새로운 조건을 AND로 연결합니다. 예를 들어, 다음과 같은 코드를 작성할 수 있습니다. val builder = BooleanBuilder() builder.and(condition1).a..
QueryDsl - 성능 개선
·
📦 Database/QueryDSL
QueryDsl 성능 개선 (+ JPQL 관련 이슈) exist 금지 SQL exists문은 조건을 만족하는 레코드를 1개 찾으면 바로 결과를 반환하고 쿼리를 종료한다. 반면 count(1)의 경우 마지막 레코드까지 검색을 하기 떄문에 성능이 낭비된다. 이런 성능차이는 스캔 대상이 앞에 위치할수록 더 심하게 발생될것이고, QueryDsl의 exists는 SQL의 count()>0 쿼리로 날린다. 이를 개선하기 위해 QueryDsl의 selectOne과 fetchFirst(= limit 1)을 사용해 직접 exists 쿼리를 구현한다. 주의할 점은 조회결과가 없으면 null이 반환되기 떄문에 0이 아닌 null로 체크를 해야 한다. 아래 코드로 exists를 직접 쿼리하자 SQL의 exists와 거의 동일..