본문 바로가기

개발44

Querydsl의 이론적인 부분 About Querydsl 이란? Querydsl은 타입에 안전한 방식으로 HQL 쿼리를 실행하기 위한 목적으로 탄생. 현재는 JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, 콜렉션 그리고 RDFBean을 지원. 원칙 타입 안정성 기존의 HQL(Hibernate HQL)은 String 타입의 연결로 구현할 수 밖에 없는데, 이는 컴파일 시점에 문법 오류, 오타를 잡아줄 수 없음. Querydsl은 도메인 타입의 프로퍼티를 반영해서 생성한 쿼리 타입을 이용해서 쿼리를 작성. 일관성 기반 기술에 상관 없이 (JPA를 사용하든, JDBC를 사용하든 상관없이) 쿼리 경로와 오퍼레이션이 동일. Query interface는 공통의 상위 인터페이스를 갖게 됨. (뇌피셜) .. 2022. 10. 31.
[JPA/Querydsl] 깊은 연관관계에서 query 개수 줄이기 학습 동기 Member가 @OneToMany 관계로 InventoryProducts를 가지고 있는 상황이고, InventoryProduct @ManyToOne으로 Product를 갖고 있는 상황이다. Member의 목록을 페이징하면서 InventoryProducts와 Product까지 불어와야 하는 상황이었는데, 모두 fetch join 하여 가져오기에는 paging 처리에 성능상 문제가 있었다. @OneToMany 관계에서 fetch join을 사용하게 되면 DB 레코드 상에서 카티션 프로덕트가 발생하기 때문에 limit offset 키워드가 쿼리에 포함되지 않는다. 즉, 모든 데이터를 애플리케이션단에 불러온 후 pagination 처리를 하게 된다. 그리하여 Member와 InventoryProduc.. 2022. 10. 26.
nullable한 값을 반환하는 집계함수 학습 주제 Mysql 집계함수 중 null을 반환하는 것들 학습 동기 팀원들이랑 페어 프로그래밍 중, AVG 키워드가 null을 반환하여 primitive 타입에 바인딩이 되지 않는 문제가 발생했다. 학습 내용 MySql 집계함수 COUNT 데이터 행의 개수를 추출하는 키워드 NULL 이 반환되지 않음 public class Keyboard { // ... @Formula("(SELECT COUNT(1) FROM review r WHERE r.product_id = id)") private int reviewCount; } @Test void COUNT_키워드는_NULL을_반환하지_않는다() { // given Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL"); entit.. 2022. 10. 14.
기본형 특화 스트림(IntStream, LongStream, DoubleStream) Stream을 사용하다보면 mapToInt(), mapToLong() 과 같은 메서드를 본 적이 있을 것이다. 필자는 map() 과 비교했을 때 결과적으로 다른 것은 없지만, 각 타입에 대한 연산 처리 과정에서 효율적일 것이라는 뇌피셜을 가지고 사용하고 있었다. 정말 그럴까? 🤔 예제를 통해서 살펴보자. 기본형 특화 스트림이 뭘까? Stream에서 mapToInt(), mapToLong(), mapToDouble() 을 호출하면 각각 IntStream, LongStream , DoubleStream 이 반환된다. 해당 Stream들을 모두 기본형 특화 스트림이라고 부른다. 말 그대로 기본형, primitive type에 특화된 Stream 이라는 의미이다. 앞서서 뇌피셜로 각 타입에 대한 연산 처리 과정.. 2022. 10. 9.