build.gradle
// 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
package org.example.expert.config;
import com.querydsl.jpa.JPQLTemplates;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QueryDslConfig {
@PersistenceContext
private EntityManager em;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(JPQLTemplates.DEFAULT, em);
}
}
위에 2가지를 설정했으면 자동으로 Q클래스가 생성됩니다.
그리고 파일 루트는 밑의 사진처럼 ".build" 하위에 생성되는 것이 정상입니다.
QueryRepository
QueryRepository를 만든다.
(밑에는 예시 코드이다.)
package org.example.expert.domain.todo.repository;
import org.example.expert.domain.todo.entity.Todo;
import java.util.Optional;
public interface TodoQueryRepository {
Optional<Todo> findByIdWithUser(Long todoId);
}
QueryRepositoryImpl
QueryRepository를 구현할 클래스를 만든다.
(밑에는 예시 코드이다.)
package org.example.expert.domain.todo.repository;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.example.expert.domain.todo.entity.Todo;
import org.springframework.stereotype.Repository;
import java.util.Optional;
import static org.example.expert.domain.todo.entity.QTodo.todo;
import static org.example.expert.domain.user.entity.QUser.user;
@Repository
@RequiredArgsConstructor
public class TodoQueryRepositoryImpl implements TodoQueryRepository {
private final JPAQueryFactory queryFactory;
@Override
public Optional<Todo> findByIdWithUser(Long todoId) {
Todo result = queryFactory
.selectFrom(todo)
.leftJoin(todo.user, user).fetchJoin()
.where(todo.id.eq(todoId))
.fetchOne();
return Optional.ofNullable(result);
}
}
Repository
밑의 사진과 같이 기존 Repository에서 다중 상속을 받는다.
(QueryDSL을 사용하기 위해 기존에 사용하였던 메서드는 주석처리 또는 삭제해준다.
왜냐면 QueryRepositoryImpl 클래스 파일에서 구현했기때문이다.)
'TIL(Today I Learned)' 카테고리의 다른 글
[Spring] 스프링에서 알아두면 좋은 어노테이션(Annotation) 모음 (0) | 2024.10.26 |
---|---|
[Spring Boot] 포스트맨으로 테스트하기 쉽게 환경변수 설정과 'Barere 접두사'를 제거한 순수한 토큰 헤더로 받기 (0) | 2024.10.25 |
[Spring] Spring Security 관련 코드 정리 (3) | 2024.10.04 |
[CS스터디] Blocking I/O & Non-Blocking I/O (+ 동기와 비동기) (1) | 2024.09.29 |
[내배캠] 아웃소싱 프로젝트 후 KPT 회고 작성 (0) | 2024.09.25 |