JPA

JPA/QueryDSL

[QueryDSL] 7. QueryDSL의 Paging 처리 (Count Query 활용)

QueryDSL의 PagingSpring Data JPA와 QueryDSL을 활용한 페이징에 대해 작성해보려고 한다.Spring Data JPA를 사용하여 JPARepository를 상속받으면서, 동시에 사용자 정의 repository를 동시에 상속을 받아야 한다.Java에서 Class는 다중 상속을 지원하지 않기 때문에, 다중 상속이 가능한 인터페이스를 활용한다.JPARepository와 사용자 정의 Repository를 작성하는 방법은 아래 글에 자세히 적어놓았으니 참고하면 좋을 것 같다.2023.11.24 - [JPA/Spring Data JPA] - [Spring Data Jpa] 6. 사용자 정의 리포지토리 구현 (*중요) 추후 queryDSL 활용 [Spring Data Jpa] 6. 사용자 ..

JPA/QueryDSL

[QueryDSL] 6. 동적 쿼리(중요⭐️) - BooleanBuilder, Where 다중 파라미터 사용

동적 쿼리동적 쿼리는 애플리케이션에서 매우 흔하게 마주치는 요구 사항 중 하나다.과거 자바 애플리케이션에서 쿼리를 동적으로 수정하는 것은 거의 불가능에 가까웠었다.QueryDSL은 이러한 동적 쿼리를 처리하는 강력한 방법을 제공한다. 이번 글에서는 BooleanBuilder를 활용하여 동적 쿼리를 구성하는 방법을 알아보겠다.방법1. BooleanBuilder를 통한 조건 구성BooleanBuilder란?BooleanBuilder는 QueryDSL에서 제공하는 조건을 동적으로 구성할 수 있는 편리한 클래스이다.쿼리의 조건문(where 절)을 조건에 따라 유연하게 변경할 수 있게 해준다. 이를 통해 코드의 가독성을 유지하면서도 복잡한 조건 로직을 쉽게 구현할 수 있다. 동적 쿼리 구현 예제 다음은 Bool..

JPA/QueryDSL

[QueryDSL] 5. QueryDSL의 프로젝션과 결과 반환, @QueryProjection

프로젝션과 결과 반환 - 기본값의 반환 타입이 여러개이므로 Tuple형태이다.Tuple은 QueryDSL 전용 타입이다.아래의 데이터 반환 타입이 Repository단계에서 해결되는 것이 좋지, 실제 비즈니스 로직인 Service에 해당 데이터 타입이 넘어가는 것은 좋지 않다.List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); 프로젝션과 결과 반환 - DTO 사용 - JPQLList resultList = em.createQuery("select new querydsl.querydsl.dto.MemberDto(m.username, m.age) " ..

JPA/QueryDSL

[QueryDSL] 4. QueryDSL의 Join과 FetchJoin

조인 - 기본 조인가장 간단한 예제, Member와 Team의 조인List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamB")) .fetch();조인 - 왼쪽 외부 조인List result = queryFactory .selectFrom(member) .leftJoin(member.team, team) .where(team.name.eq("teamB")) .fetch();세타 조인(옵시디언)/** * 억지성 예제, 회원의 이름이 팀..

JPA/QueryDSL

[QueryDSL] 3. 정렬과 페이징, SubQuery

설명의 편의를 위해 예시를 둔다.회원의 나이대로 내림차순하는데, 회원 이름으로 올림차순하며, 회원 이름이 없다면 마지막에 출력한다면 쿼리를 어떻게 해야할까?// sample dataem.persist(generateMember(null, 100, null));em.persist(generateMember("member5", 100, null));em.persist(generateMember("member6", 100, null));QueryDSL 쿼리List result = queryFactory .selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), member.us..

JPA/QueryDSL

[QueryDSL] 2. QueryDSL 문법 VS JPQL 문법 비교

JPQL과 QueryDSL 문법 비교기본 JPQL// member1 찾기String qlString = "select m from Member m where m.username = :username";Member findMember = em.createQuery(qlString, Member.class) .setParameter("username", "member1") .getSingleResult();QueryDSLQMember m = new QMember("m");Member findMember = queryFactory .select(m) .from(m) .where(m.username.eq("member1")) .fetch..

JPA/QueryDSL

[QueryDSL] 1. QueryDSL 의존성과 기본 사용법

QueryDSL 의존성Spring Version에 따라 의존성이 크게 차이가 난다. 나는 스프링 3.x 이상에서 학습을 했기에, 아래와 같이 설정을 했다.//Querydslimplementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakarta.persistence:jakarta.persistence-api"..

JPA/Spring Data JPA

[Spring Data JPA] 7. BaseEntity

엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면 어떻게 해야 할까?등록일, 수정일, 등록자, 수정자.. 등이 있다고 생각하자. 순수 JPA를 사용한 BaseEntity 구현 JpaBaseEntity 클래스 JPA의 @MappedSuperclass를 사용하여 생성일과 수정일을 추적할 수 있다.@MappedSuperclass는 속성만을 상속하는 방법으로, 실제 상속과 구분된다.@MappedSuperclass@Getterpublic class JpaBaseEntity {    @Column(updatable = false)    private LocalDateTime createdDate;    private LocalDateTime updateDate;    @PrePersist    pub..

JPA/Spring Data JPA

[Spring Data JPA] 6. 사용자 정의 Repository. DI 활용

이번 내용은 실무에서 정말 많이 사용한다. querydsl repository를 만들고 활용하기 좋다.실무에서는 다양한 상황에 맞추어 인터페이스와 메서드를 직접 구현할 필요가 있다.예를 들어, JPA를 사용하다가 Spring JDBC Template이나 MyBatis 등을 사용해야 할 때가 있다.Spring Data JPA의 기본 인터페이스만으로는 충분하지 않은 경우, 사용자 정의 리포지토리를 구현하여 해결할 수 있다. Spring Data JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많은데, 어떻게 해야 할까?  구현 절차1. 사용자 정의 인터페이스 생성 먼저, 구현할 메서드를 추상화한 사용자 정의 인터페이스를 생성한다.public interface MemberReposito..

JPA/Spring Data JPA

[Spring Data JPA] 5. JPA Hint & Lock

JPA Hint개념JPA Hint는 JPA의 구현체, 예를 들어 Hibernate에게 제공하는 힌트다.이는 SQL 자체에 대한 힌트가 아니라, JPA 구현체에 특정 동작을 요구하는 힌트이다. JPA는 기본적으로 Entity를 조회해와서 값을 변경하면 Dirty Checking이 일어나고 트랜잭션 커밋 시점에 이를 DB에 반영한다.만약 값을 바꿔서 화면에 뿌려주는데 DB에는 반영하기 싫을 땐 어떡할까? JPA는 이러한 기능을 제공하지 않지만 Hibernate는 이를 제공한다. 그렇기 때문에 JPA Hint를 사용한다. // JpaRepository@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))Mem..

토이 개발 스토리
'JPA' 카테고리의 글 목록