일단 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 |