QueryDSL

이유진·2024년 10월 7일

스프링 이론 다지기

목록 보기
11/12
post-thumbnail

QueryDSL

QueryDSL을 알아보기 전에 Spring Data JPA대해서 먼저 알아보자!!

🌱Spring Data JPA

  • JPA는 Java 오프젝트를 관계형 데이터베이스에 매핑하는 Java 표준이다.

  • JPA는 개발자가 데이터베이스에 데이터를 CRUD(Create, Read, Update, Delete)를 위해 SQL을 작성할 필요없이 객체를 조작하는 것만으로 데이터베이스에 CRUD 수행할 수 있게 해준다.

  • 대표적인 JPA 기반 구현체로 Hibernate가 있다.

  • Spring Data JPA는 JPA를 더 쉽게 사용할 수 있도록 도와주는 모듈이다.

  • Spring Data JPA는 JPA 기반의 Repository들을 쉽게 구현할 수 있도록 인터페이스들을 제공한다.

  • Spring Data JPA에서 제공하는 JPARepository와 같은 인터페이스를 상속받아 새로운 Repository 인터페이스를 생성하고, 정해진 규칙대로 메소드명을 명명하면 Spring Data JPA가 자동으로 코드를 생성한다.

    public interface TodoRepository extends JpaRepository<Todo, Long>,TodoQueryRepository{
        
    }
    • 위와 같이 정해진 규칙대로 메소드명을 명명하면 Spring Data JPA가 자동으로 코드를 생성하여, 조작하고자 하는 Entity(ex.Todo)를 파라미터로 Repository의 메소드를 호출하여 데이터베이스에 CRUD를 할 수 있다.

🌱QueryDSL

  • type-safe(컴파일시 에러 체크 가능) 한 동적 쿼리를 직관적으로 작성할 수 있게 도와주는 Java 기반 쿼리 라이브러리

  • QueryDSL은 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 오픈소스 프레임워크이다.

  • build.gradle

    • QueryDSL을 사용하기 위한 dependency들을 설치
    dependencies {
        // querydsl
        implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
        annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
        annotationProcessor "jakarta.annotation:jakarta.annotation-api"
        annotationProcessor "jakarta.persistence:jakarta.persistence-api"
    }
  • QueryDslConfig

    • 지속성 컨텍스트와 상호작용하는데 사용되는 EntityManagerJPAQueryFactory 에 주입을 하여 jpaQueryFactory Bean을 생성한다.
    @Configuration
    class QueryDslConfig {
    
        @PersistenceContext
        private EntityManager em;
    
        @Bean
        public JPAQueryFactory jpaQueryFactory() {
            return new JPAQueryFactory(JPQLTemplates.DEFAULT, em);
        }
    }
  • QClass

    • QueryDSL 설정 후 gradle build시, QClass가 생성된다.

  • QClass란?

    • Entity 클래스의 메타 정보를 담고 있는 클래스
    • 타입 안정성(Type safe)을 보장하면서 쿼리를 작성할 수 있음
    • 컴파일 시점에 쿼리 오류를 확인할 수 없는 JPQL의 단점 보완
  • BooleanExpression(TodoQueryRepositoryImpl)

    • QueryDSL에서 where뒤의 조건을 생성해주기 위한 클래스
    @Repository
    @RequiredArgsConstructor
    public class TodoQueryRepositoryImpl implements TodoQueryRepository {
    
        private final JPAQueryFactory jpaQueryFactory;
    
        @Override
        public Todo findByIdByDsl(long todoId) {
            return jpaQueryFactory
                    .select(todo)
                    .from(todo)
                    .leftJoin(todo.user).fetchJoin()
                    .where(
                            todoIdEq(todoId)
                    ).fetchOne();
        }
    
        private BooleanExpression todoIdEq(Long todoId) {
            return todoId != null ? todo.id.eq(todoId) : null;
        }
    }

참고

https://medium.com/mo-zza/spring-data-jpa-querydsl-%EC%A0%81%EC%9A%A9-22a0364cd579

https://dev.gmarket.com/33

profile
🙌중요한건 꺾였는데도 그냥 하는 마음

0개의 댓글