[kotlin] Querydsl-JPA GroupBy 사용했을 경우 Paging처리 방법
·
아카이브/spring-data
들어가기 전에 Querydsl-JPA를 사용할 때 Query에 GroupBy 절이 포함된다면 fetchCount(), fetchResults() 메서드를 사용할 수 없습니다. 정확히 count() 를 사용할 수 없습니다. 이럴 경우 PageImpl을 사용하여 Paging 처리해야 하는 경우에 대해서 정리해보겠습니다. 모든 소스는 Github에 올려두었습니다. 에러발생 GroupBy절을 포함하고 fetchCount(), fetchResults() 메서드를 사용하면 아래와 같은 에러가 발생합니다. Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: having near line 5, column 1 GroupBy를..
[Kotlin] Spring-Batch 적용
·
아카이브/spring-batch
이 글은 Kotlin으로 Spring Batch를 구현한 내용을 정리한 내용입니다. 코드의 양이 많아 중요한 부분 위주로만 작성하였습니다. 모든 코드는 Github에 있습니다. 참조해주세요. 글을 작성하기에 앞서 작업한 내용은 지난번 작성한 글을 기준으로 작성하였습니다. 함께보시면 이해하시기 편할 것 입니다. 이 글에서는 Spring-Batch가 무엇인지에 대해서는 다루지 않겠습니다. Spring-Batch를 Java, Querydsl-JPA로 구현이 가능해야 이해하는 데 무리가 없을 것입니다. build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { val kotlinVersion = "1.4.31" id("org..
Querydsl Join Table Sort 적용 ( 번외로 Pageable와 비슷한 것을 구현해보자! )
·
아카이브/spring-data
Front-End에서 데이터 테이블을 이용하여 데이터를 보여주고 있었습니다. 이 때 각 컬럼의 Sort를 설정하여 데이터를 정렬하는 Querydsl을 사용하기 위해 적용한 내용을 정리한 글입니다. 모든 소스는 Github에 있습니다. 사용하게 된 이유 화면에서 넘겨주는 Sort관련 정보는 N개의 테이블에 대한 정보가 넘어올 수 있습니다. 예를 들어 Store, Staff 2개의 테이블이 존재하고 같은 field의 이름이 존재합니다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Store { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long i..
[Querydsl] 성능개선 - 3편 ( group by, 커버링 인덱스, update )
·
아카이브/spring-data
이 글은 우아한 형제들 콘서트에서 이동욱님의 영상을 보고 정리를 위한 글입니다. 이 글에 작성된 예시는 모두 Github에 올려두었습니다. Group By 최적화 Mysql 사용 시 index가 걸려있지 않는 컬럼을 group by 할 경우 file sort가 발생합니다. Index가 걸려있지 않는 경우 select * from house group by name Index가 걸려있는 경우 select * from house group by id file sort가 발생하면 성능이 떨어질 수 밖에 없습니다. 이 경우 order by 절에 null을 넣으면 file sort가 발생하지 않습니다. select * from house group by name order by null 하지만 안타깝게도 Quer..
[Querydsl] 성능개선 - 2편 ( N + 1 )
·
아카이브/spring-data
이 글은 우아한 형제들 콘서트에서 이동욱님의 영상을 보고 정리를 위한 글입니다. 이 글에 작성된 예시는 모두 Github에 올려두었습니다. N + 1 Entity 기반인 Jpa, Querydsl 을 사용하다 보면 N + 1은 한번 씩 겪는 문제라고 생각합니다. N + 1이 무엇이고 왜 발생하는지 알아보겠습니다. 먼저 아래의 코드를 살펴보겠습니다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @DynamicUpdate @DynamicInsert public class House { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String n..
[Querydsl] 성능 개선 1편
·
아카이브/spring-data
이 글은 우아한 형제들 콘서트에서 이동욱님의 영상을 보고 정리를 위한 글입니다. 이 글에 작성된 예시는 모두 Github에 올려두었습니다. 1. 동적 쿼리 사용 시 BooleanExpression을 사용하자! Querydsl에서 동적쿼리 사용방법은 조건문에 null을 넣으면 조건문이 무시되는 방법을 사용하면 됩니다. public Staff dnamicQuery(String name) { return queryFactory .selectFrom(staff) .where(name == null ? null : name) .fetchOne(); } 위처럼 코드를 작성한다고 가정했을 때 동적 조건이 많아진다면 쿼리는 매우 복잡해질 것입니다. 그래서 BooleanExpression을 리턴하는 메소드를 생성하여 사..
[Querydsl-JPA] Querydsl JPA를 사용하며.. "*" 아스타리스크 사용방법
·
아카이브/spring-data
개발할 때 테이블의 모든 컬럼을 조회할 경우가 있습니다. 그때 Querydsl-JPA를 사용할 때 어떻게 사용할 수 있는지 작성해보겠습니다. 모든 소스는 github에 올려두었습니다. 먼저 하고 싶은 쿼리가 어떤 것인지 작성해보겠습니다. select s.* , etc_option from staff s join store st on s.store_id = st.id where s.name = 'staffV' limit 1 이것과 동일한 Querydsl을 작성해보겠습니다. 먼저 Vo를 생성합니다. @Getter @Setter @ToString public class StaffEtcVo { private Staff staff; private String address; } 필드에 Staff Entity를 선..
nested exception is java.lang.IllegalArgumentException: No sources given
·
아카이브/TroubleShooting
오늘도 어김없이 발생하는 Exception!! 증상 Querydsl-JPA를 사용중 에러가 발생했습니다. 에러를 보면 IllegalArgumentException 입니다. 쿼리를 생성할 때 잘못하면 보통 이 에러가 발생합니다. 그리고 No Sources Given.. 번역기를 돌려면 출저가 없다는 에러?? nested exception is java.lang.IllegalArgumentException: No sources given public StaffVo search(Long id) { return jpaQueryFactory .select(Projections.fields(StaffVo.class, staff.id, staff.name )) .where(staff.id.eq(id)) .fetchO..
[Querydsl] Querydsl을 적용하며.. class 파일명 주의
·
아카이브/spring-data
querydsl을 적용한 프로젝트를 진행하면서 나온 이슈를 정리해보겠습니다. JPARepository에서 Querydsl을 사용할 수 있게 Custom(interface), impl 로 세팅이 되어있었습니다. 세팅방법은 여기를 참조해주세요. 데일리 미팅 도중 Custom Interface의 naming을 변경이 확정되었습니다. AS-IS : CustomizedDomainRepository TO-BE : DomainQueryRepository Customized란 단어는 너무 포괄적이어서 변경하기로 결정! 증상 Class명을 변경하고 Application을 실행하자 에러가 발생하였습니다. No property search found for type Staff! Staff는 Entity 객체입니다. 구현 된..
[JPA] java.lang.NoSuchMethodException: org.springframework.data.domain.Pageable.<init>
·
아카이브/TroubleShooting
오늘도 어김없이 Exception 발생했네요! 요즘은 Exception이 발생하면 어떻게 풀어서 블로그를 작성할까하고 Exception을 기다리고 있습니다 :) 증상 오늘 발생한 에러는 Querydsl에 Paging 처리가 필요하여 Pageable을 사용했을 때 발생하는 에러였습니다. 아래와 같은 코드를 작성하여 Parameter로 Pageable 객체를 받는 부분에서 에러가 발생하였습니다. @RestController @RequiredArgsConstructor// DI public class StoreController { private final StoreService storeService; @GetMapping(value = "/stores/{storeId}") pubic DefaultRespo..