Java/JPA

    [QueryDsl] transform GroupBy

    요즘 querydsl에서 굉장히 유용하게 사용하고 있는 기능이 있는데, 바로 transform이다. document import static com.querydsl.core.group.GroupBy.*; Map results = query.from(post, comment) .where(comment.post.id.eq(post.id)) .transform(groupBy(post.id).as(list(comment))); 다음과 같이 querydsl에선 결과 값을 불러온 후 메모리에서 원하는 자료형으로 변환할 수 있는 기능을 제공한다. 함수 이름이 groupBy 라고 해서 sql의 group by와 혼동될 수 있는데, query에서 group by를 사용하지 않는다. 대신 aggregation에 필요한 ..

    [JPA] JPQL, QueryDsl, Spring Data의 exists

    queryDsl의 exists 이슈에 대해서 알게된 계기가 있었는데, 바로 [우아콘2020] 수십억건에서 QUERYDSL 사용하기 이다. @Override public boolean exists(Predicate predicate) { return createQuery(predicate).fetchCount() > 0; } 기존 queryDsl에서 exists 함수를 사용하게 되면 내부적으로 count 함수, 정확히는 fetchCount 함수를 실행하여 반환하게 된다는 이야기이다. fetchCount는 exists query를 발생시키지 않고 count query를 발생시킨다. exists는 첫번째 결과 값을 만나면 반환하는 반면 count 함수는 전체 결과 값을 조회해야 하기 때문에 성능 이슈가 발생하..

    [JPA] Spring Jpa Repository의 영속성 컨텍스트 동작방식

    개발을 하다보면 Root 도메인에 종속적인 Sub 도메인을 어떻게 처리할지 고민이 될 때가 있다. 예를 들면, 재생 목록의 음악들은 재생 목록이라는 Root 도메인에 종속적인 Sub 도메인 들이다. Delete And Insert 방식을 실행할 수도 있고, Update 방식을 사용할 수도 있다. 그러다보니 JPA를 사용했을때, 각 개발 방식이 어떻게 동작하는지 알고 싶어서 직접 엔티티를 생성하며 테스트 코드를 작성해 보았다. 코드는 모두 깃허브에 작성해두었다. private SimpleEntity create(String name) { SimpleEntity entity = SimpleEntity.builder() .name(name) .build(); return repository.save(entit..

    [JPA] Spring Data에서 save()와 saveAll()의 성능 차이

    https://www.baeldung.com/spring-data-save-saveall 해당 글은 위 링크를 번역한 글입니다. Overview Spring Data의 save와 saveAll의 성능 차이를 알아보자. Application Book.java @Entity public class Book { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String title; private String author; // constructors, standard getters and setters } BookRepository.java public interface BookRepository extends JpaR..