JPA 28

QueryDSL 실무 활용

이전 포스팅에서는 동적 쿼리와 Bulk 연산에 대해 알아보았습니다. 이번 포스팅은 QueryDSL 시리즈의 마지막 포스팅인 실무 활용 편입니다. 사실 모든 기능들을 포스팅할 수는 없어서 시리즈 순서대로 간단하게 정리해보려 합니다😄 개요 이전 포스팅에서 사용했던 엔티티들을 재사용할 예정입니다. 혹여 엔티티 클래스의 코드가 궁금하신 분들은 엔티티 설계 포스팅을 참고해주세요😄 📌 저는 BeforeEach 어노테이션을 활용해 가 데이터가 들어간 상황에서 테스트를 진행한 것입니다. @BeforeEach public void before() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("t..

JPA 2022.11.18

QueryDSL 동적 쿼리 및 Bulk 연산

지난 포스팅에서는 QueryDSL의 Projection에 대해 알아보았습니다. 이번 포스팅은 동적 쿼리를 BooleanBuilder 사용과 Where 다중 파라미터 사용방법에 대해 알아보고 이어서 다중 업데이트 및 삭제를 위한 벌크 연산에 대해 알아보려고 합니다😊 개요 이전 포스팅에서 사용했던 엔티티들을 재사용할 예정입니다. 혹여 엔티티 클래스의 코드가 궁금하신 분들은 엔티티 설계 포스팅을 참고해주세요😄 📌 저는 BeforeEach 어노테이션을 활용해 가 데이터가 들어간 상황에서 테스트를 진행한 것입니다. @BeforeEach public void before() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team ..

JPA 2022.11.15

QueryDSL Projection 결과 반환하는 방법

이전 포스팅에서는 Query DSL을 사용해서 조인하는 방법에 대해 알아보았습니다. 이번 포스팅은 Projection 결과를 반환하는 방법에 대해 알아보려고 합니다. 프로젝션(Projection)은 select 절에서 어떤 칼럼들을 조회할지 대상을 지정하는 것을 말합니다😄 개요 이전 포스팅에서 사용했던 엔티티들을 재사용할 예정입니다. 혹여 엔티티 클래스의 코드가 궁금하신 분들은 엔티티 설계 포스팅을 참고해주세요😄 📌 저는 BeforeEach 어노테이션을 활용해 가데이터가 들어간 상황에서 테스트를 진행한 것입니다. @BeforeEach public void before() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); T..

JPA 2022.11.14

QueryDSL 조인 사용 방법

이전 포스팅에서는 Query DSL을 사용하여 정렬하는 방법과 페이징 처리 등을 포스팅하였습니다. 오늘은 기본 조인 방법부터 fetch 조인까지 알아보려 합니다😄 개요 이전 포스팅에서 사용했던 엔티티들을 재사용할 예정입니다. 혹여 엔티티 클래스의 코드가 궁금하신 분들은 엔티티 설계 포스팅을 참고해주세요😄 📌 저는 BeforeEach 어노테이션을 활용해 가데이터가 들어간 상황에서 테스트를 진행한 것입니다. @BeforeEach public void before() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(t..

JPA 2022.11.01

QueryDSL 정렬과 페이징 처리 및 집합 예시

이전 포스팅에서는 Query DSL을 사용하여 데이터를 조회하는 간단한 예시를 만들었었습니다. 이번 포스팅에서는 조회한 결과물을 정렬하고 페이징 처리하는 방법에 대해 알아볼게요😄 개요 이전 포스팅에서 사용했던 엔티티들을 재사용 할 예정입니다. 혹여 엔티티 클래스의 코드가 궁금하신 분들은 엔티티 설계 포스팅을 참고해주세요😄 📌 저는 BeforeEach 어노테이션을 활용해 가데이터가 들어간 상황에서 테스트를 진행한 것입니다. @BeforeEach public void before() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em..

JPA 2022.10.31

QueryDSL 사용하는 조회 예제

이전 포스팅에서는 QueryDSL을 적용하고 도메인 모델을 살펴본 후 각 엔티티들을 설계하였다. 오늘은 기존 JPQL과의 차이를 살펴보면서 조회하는 예제를 만들어보려 한다. 개요 이전 포스팅에서 도메인 모델과 엔티티 클래스를 설계하였습니다. 해당 엔티티 코드는 이전 포스팅에 있으며, 따라 하지 않는 분들은 흐름만 파악하셔도 충분합니다. Member와 Team은 다대일 양방향 관계로 매핑되어 있습니다😄 예제 코드📔 @SpringBootTest @Transactional public class QuerydslBasicTest { @Autowired EntityManager em; JPAQueryFactory queryFactory; @BeforeEach public void before() { queryFa..

JPA 2022.10.28

QueryDSL 적용 및 예제 시리즈

이번 시리즈는 Query DSL 사용법에 대해 알아보려 합니다. 이전 JPA 시리즈에서는 Spring Data JPA까지만 알아보았는데, Query DSL을 사용하면 조금 더 효율적으로 JPA를 사용할 수 있다😀 개요 Query DSL이란 Query Domain Specific Language 약자로 도메인+특화+언어라는 개념으로, 오픈소스 프로젝트이며 JPQL을 Java 코드로 작성할 수 있도록 하는 라이브러리다. 쉽게 말하면, 기존에 mybatis를 쓰던 JPQL을 쓰든 간에 쿼리를 SQL 문법 규칙대로 쿼리를 작성하지 않고 Java 코드로만 작성할 수 있게 도와주는 라이브러리라고 생각하면 쉬울 것 같다. Criteria 기법을 사용하는 방법도 있지만, 사실상 실무에서 사용하기에는 복잡하고 공부 비용..

JPA 2022.10.27

Spring Data JPA Bulk Update & Entity Graph

지난 포스팅에서는 Spring Data JPA를 사용해서 페이징 처리를 손쉽게 구현했어요. 오늘은 벌크 업데이트와 엔티티 그래프에 대해 알아보려 합니다. 개요 Bulk Update는 클라이언트의 요구 조건에 맞는 데이터들을 한번에 변경하는 것을 의미합니다. JPA에서는 변경 감지(더티 체킹)를 해서 데이터를 업데이트하기 때문에, 한 번에 수정하기 위한 쿼리가 필요하고 그 쿼리를 벌크 수정이라고 불러요. Entity Graph는 연관된 엔티티들을 SQL 한번에 조회하는 방법입니다. 사실상 fetch join의 간편 버전이라고 할 수 있어요. 그럼 한번 살펴볼까요? Bulk Update📗 Bulk update의 방법으로는 순수 JPA를 사용하는 방법과 Spring Data JPA의 @Query를 사용하는 방..

JPA 2022.10.14

Spring Data JPA 페이징 처리

지난 포스팅에서는 Spring Data JPA를 이용해 쿼리 메서드를 처리하는 방법에 대해 알아보았습니다. 오늘은 페이징 처리에 관해 이야기해보려 해요. 대게 실무에서는 페이징 처리를 거의 필수적으로 사용하는데, 복잡한 코드들이 Spring Data JPA에서는 얼마나 간편하게 해결할 수 있는지 살펴볼게요😄 개요 페이징 처리를 한번이라도 직접 구현해보셨다면 생각보다 복잡한 것을 아실 텐데요. 예를 들어, 단순히 1페이지에 10개씩 데이터만 가져오는 것이 아닌 조건에 맞는 데이터의 총 개수와 마지막 페이지가 몇 인지, 다음 페이지가 있는지에 대한 유무 등 클라이언트의 요구 조건에 맞게 구현해야 합니다. 저도 처음 회사 입사했을 때 JPA를 사용하지 않았기 때문에 손수 이전에 계셨던 선배님들이 짜놓았던 페이..

JPA 2022.10.14

Spring Data JPA 쿼리 메서드

지난 포스팅에서는 Spring Data JPA를 이용해서 JPA를 편리하게 사용하는 방법에 대해 알아봤었어요. 하지만 JpaRepository의 기능만으로는 실무의 모든 기능들을 구현할 수 없기 때문에, 로직에 맞는 함수를 정의해야 할 때가 있어요. 오늘은 그 방법인 쿼리 메서드에 대해 알아보려 합니다 개요 예제 도메인 모델과 모델에 맞는 Entity, Repository는 지난 포스팅에서 작성했어요. 이어서 진행하기 때문에, 이번 포스팅만 보시면 이해하기 어려우실 수 있습니다😅 포스팅에서는 간단한 예제만 다룹니다. 조금 더 정확한 메서드들과 사용 방법은 해당 래퍼런스에서 확인해주세요! Spring Data JPA - Reference Documentation Example 109. Using @Tran..

JPA 2022.10.13