본문 바로가기

개발(합니다)/Java&Spring

[spring boot 설정하기-6] querydsl(+JPA) 설정 및 테스트 소스

반응형

쿼리를 소스로 작성해야 하는 경우가 있는데 세련 된 방식으로 사용할 수 있도록 도와줍니다.

SQL, JPQL을 코드로 작성을 도와주는 빌더 API입니다.

JPA에서 제공하는 @Query에서 다양한 조회를 하기에는 다소 한계가 있는데
이를 해결하기 위한 조회 프레임워크로 querydsl이 있습니다.

JPA를 좀더 효율적으로 사용할 수 있도록 도와줍니다.

관련 정보는 아래 사이트에서 얻을 수 있습니다.

www.querydsl.com/

www.querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/


1. 의존성 추가


    apply plugin: "io.spring.dependency-management"

    compile("com.querydsl:querydsl-core") // querydsl
    compile("com.querydsl:querydsl-jpa") // querydsl
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정
    annotationProcessor("jakarta.persistence:jakarta.persistence-api")
    annotationProcessor("jakarta.annotation:jakarta.annotation-api")




def generated='src/main/generated'
sourceSets {
    main.java.srcDirs += [ generated ]
}

tasks.withType(JavaCompile) {
    options.annotationProcessorGeneratedSourcesDirectory = file(generated)
}

clean.doLast {
    file(generated).deleteDir()
}

2. gradle의 complieJava 실행

Q로 시작하는 entity들이 생성됩니다.

3. QuerydslConfig 생성

package com.otrodevym.spring.base.common.Querydsl;

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;


@Configuration
public class QuerydslConfig {

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}

3. 테스트 방법

3-1 DB 생성

create table querydsl_test (
    id int not null auto_increment,
    name char(50) not null,
    primary key (id)
    );

3-2. QuerydslTest 생성

package com.otrodevym.spring.base.common.Querydsl;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;


@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class QuerydslTest {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @Builder
    public QuerydslTest(String name) {
        this.name = name;
    }
}

3-3. QuerydslRepository 생성

package com.otrodevym.spring.base.common.Querydsl;

import org.springframework.data.jpa.repository.JpaRepository;


public interface QuerydslRepository extends JpaRepository<QuerydslTest, Long> {

}

3-4. QuerydslRepositorySupportMy 생성

package com.otrodevym.spring.base.common.Querydsl;

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
import org.springframework.stereotype.Repository;

import java.util.List;

import static com.otrodevym.spring.base.common.Querydsl.QQuerydslTest.querydslTest;



@Repository
public class QuerydslRepositorySupportMy extends QuerydslRepositorySupport {

    private final JPAQueryFactory jpaQueryFactory;

    public QuerydslRepositorySupportMy(JPAQueryFactory jpaQueryFactory) {
        super(QuerydslTest.class);
        this.jpaQueryFactory = jpaQueryFactory;
    }


    public List<QuerydslTest> findByName(String name) {
        return jpaQueryFactory
                .selectFrom(querydslTest)
                .where(querydslTest.name.eq(name))
                .fetch();
    }

}

3-5. QuerydslController 생성

package com.otrodevym.spring.base.common.Querydsl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
@RequestMapping("/dsl")
public class QuerydslController {

    @Autowired
    private QuerydslRepository querydslRepository;

    @Autowired
    private QuerydslRepositorySupportMy querydslRepositorySupportMy;

    @GetMapping("name")
    public void QuerydslNameTest() {
        String name = "test";
        querydslRepository.save(new QuerydslTest(name));
        List<QuerydslTest> list = querydslRepositorySupportMy.findByName(name);

        list.forEach(querydslTest -> System.out.println(querydslTest.getName()));
    }
}

3-6. Postman 테스트

3-7. 결과

반응형