스프링데이터 + JPA/QueryDSL

3. QueryDSL 설정

sdafdq 2023. 11. 27. 11:33

일단 Gradle에 설정하고(이게 스프링부트 버전이나, 인텔리제이 버전이나, QueryDSL 버전마다 조금씩 다르다고 함.)

https://qwefdg3.tistory.com/647

 

일단은 현재 스프링 부트 3.0 이상 버전은 저걸로 하면 됨.

 

쿼리DSL은 엔티티에 대하여 자바코드로 쿼리를 짤 수 있게 해주는 것 이므로, (구조 자체가 엔티티 스캔해서 그 엔티티에 대한 클래스를 엔티티마다 구현체를 만들어 놓음. 그게 QueryDSL 파일 들이고, 그걸로 QueryDSL 하는거임.)

 

그래서 먼저, 테스트 엔티티를 만듦.

@Entity
@Getter
public class TestEntity {
    @Id @GeneratedValue
    private Long id;
    private String username;
}

이렇게 엔티티를 만들고,

 

우리가 QueryDSL 라이브러리를 밖에서 가져올 떄, src / main에 generated 라는 폴더가 자동으로 생김.

여기에 그 구현체들이 담아지는 거임. (이 경로는 설정할 수 있음. 자세한 건 위 링크 참조.)

 

 

QueryDSL 구현체들 지울 때 용임.

gradle 창에서 Tasks -> build -> clean에 있음

 

그럼 역으로 구현체들을 빌드 하는 건?

Tasks -> other -> compileQuerydsl임.

 

 

 

그래서, 구현체 한번 보면

 

 

@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QTestEntity extends EntityPathBase<TestEntity> {

    private static final long serialVersionUID = -416079956L;

    public static final QTestEntity testEntity = new QTestEntity("testEntity");

    public final NumberPath<Long> id = createNumber("id", Long.class);

    public final StringPath username = createString("username");

    public QTestEntity(String variable) {
        super(TestEntity.class, forVariable(variable));
    }

    public QTestEntity(Path<? extends TestEntity> path) {
        super(path.getType(), path.getMetadata());
    }

    public QTestEntity(PathMetadata metadata) {
        super(TestEntity.class, metadata);
    }

}

QueryDSL이 이 QTestEntity라는 엔티티를 만들어 준 거라고 한다.

 

시리얼은 구분하기 위한 UUID 같고,

저거는 static으로 미리 만들어 놓은. 그러니까 이 Q파일 자체가 QueryDSL의 기능을 쓰기 위해 엔티티에 대한 정보들을 담아놓은 파일 같음.

그래서 그냥 저렇게 static 하나로만 쓰는 게 훨씬 효율적.

 

id나 username, 저건 필드에 관한거 같은데 일단 패스.

 

나머진 생성자로 보임. 저것도 잘 모르겠으니 일단 패스.

 

@SpringBootTest
@Transactional
class QuerydslApplicationTests {
    @Autowired
    EntityManager em;

    @Test
    void contextLoads() {
       TestEntity testEntity = new TestEntity();
       em.persist(testEntity);

       JPAQueryFactory query = new JPAQueryFactory(em);

       QTestEntity qTestEntity = new QTestEntity("t");

       TestEntity result = query
             .selectFrom(qTestEntity)
             .fetchOne();

       assertThat(result).isSameAs(testEntity);
       System.out.println("result = " + result.getId());
    }
}

테스트 코드.

QueryDSL을 쓰려면 JPAQueryFactory라는 Jpql 쿼리를 만들어주는 쿼리 공장이 필요하며, 거기서 내부적으로 jpa의 기능을 이용하기 위해(예를 들어 fetchOne()하면 쿼리를 보내서 가져온다? 같다) 넣어줘야 한다.

 

내가 보기엔 저 JPAQueryFactory는 생성자로 처리해도 될 것 같다. 그냥 final로 하나만 만들어도 될 것 같다.

 

여튼 그냥 엔티티 저장 시켜보고,

쿼리팩토리 만들어서,

Q 파일, 저걸 새로 생성하는데, 이미 내부에 static이 있다. 앞으로는 의식적으로 그걸 사용하자.

저 쿼리 팩토리를, Q 파일, 엔티티에 대한 정보를 담고 있는 클래스를 값으로? 사용한다.

저렇게

TestEntity result = query
     .selectFrom(qTestEntity)
     .fetchOne();

select * from 

그냥 *면 selectFrom 인 듯 싶다. 

entity

하고 쿼리가 다 끝났으면 fetchXXX 해서 하나나 여러개를 가져온다.

 

 

'스프링데이터 + JPA > QueryDSL' 카테고리의 다른 글

5. H2 DB 설치 및 설정  (0) 2023.11.27
4. 연관 라이브러리  (0) 2023.11.27
2. 프로젝트 생성  (0) 2023.11.27
1. 소개  (0) 2023.11.27
0. 프리뷰  (0) 2023.11.17