1. build.gradle 설정
dependencies {
implementation '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"
}
// Querydsl 설정부
def generated = 'src/main/generated'
tasks.withType(JavaCompile).configureEach {
options.getGeneratedSourceOutputDirectory().set(file(generated))
}
clean {
delete file (generated)
}
2. gradle실행(clean -> build)
3. QClass 생성 확인
4. JpaRepository와 함께 사용하기 위해 JPAQueryFactory Bean등록
@Configuration
public class QueryDslConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
※ 아래 JPQL코드를 QueryDsl을 사용하여 실행해보려고한다.
public interface TodoRepository extends JpaRepository<Todo, Long>, CustomTodoRepository {
@Query("SELECT t FROM Todo t " +
"LEFT JOIN t.user " +
"WHERE t.id = :todoId")
Optional<Todo> findByIdWithUser(@Param("todoId") Long todoId);
}
1. CustomTodoRepository interface 구현
public interface CustomTodoRepository {
Optional<Todo> findByIdWithUser(Long todoId);
}
2. TodoRepositoryImpl 구현
import static org.example.expert.domain.todo.entity.QTodo.todo;
import static org.example.expert.domain.user.entity.QUser.user;
@RequiredArgsConstructor
public class TodoRepositoryImpl implements CustomTodoRepository{
@Autowired
private final JPAQueryFactory jpaQueryFactory;
@Override
public Optional<Todo> findByIdWithUser(Long todoId) {
return Optional.ofNullable(
jpaQueryFactory
.selectFrom(todo)
.leftJoin(todo.user, user).fetchJoin()
.where(todo.id.eq(todoId))
.fetchOne()
);
}
}
- JPAQueryFactory를 @Autowired해준다.
- QClass들을 import해준다.
- Optional.ofNullable()로 감싸서 null에 대한 처리를 한다.
- jpqQueryFactory를 사용해서 쿼리문을 작성한다.
- fetchJoin()을 사용해서 N+1문제를 예방한다.
'Java & Spring > Spring' 카테고리의 다른 글
Spring - Spring Security (0) | 2024.10.07 |
---|---|
JPA - JPQL사용해보기 (2) | 2024.10.02 |
JPA - 쿼리 파일 만들기 (1) | 2024.09.27 |
JPA - 데이터베이스와 SQL (3) | 2024.09.26 |
테스트코드 작성에 사용되는 메서드 및 애노테이션(1) (0) | 2024.09.23 |