본문 바로가기
💻 뚝딱뚝딱/북북클럽

[JPA/QueryDSL] 적용하기

by 뚜루리 2025. 5. 2.
728x90
320x100
은근히 적용하기 빡센 쿼리 데셀....정리해놓자

 

📌  build.gradle 추가

dependencies {
	implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
	annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'

}


def generated = "build/generated"

sourceSets {
	main {
		java {
			srcDirs += [generated]
		}
	}
}

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

 

 

📌 Q 클래스 생성 확인

  • 터미널에 명령어 삽입 : ./gradlew clean build
  • 인텔리제이 - 상단메뉴 [build] - [build Project]

둘 중에 하나만 하면되고, 하게되면 아래와 같이 엔티티마다 큐 클래스가 생성됨.

 

 큐클래스까지는 생성되는데 인식이 안되는 것 같다면 아래의 포스팅 확인

 

[JPA/QueryDSL] 엔티티가 올바른 경로에 있음에도 자꾸 컴파일 에러가 뜹니다.

🛠️ 문제 상황JPA와 QueryDSL을 사용하는 프로젝트에서 레파지토리나 서비스에서 엔티티를 Import해서 가져다 쓰는데, 소스코드상으로는 빨간줄도 없고, 에러도 없는데 컴파일 시에, 해당 엔티티

ddururiiiiiii.tistory.com

 

큐클래스는 커녕 관련 폴더가 안보여요!

프로젝트 화면에서 점 세개짜리 클릭 후 [Tree Apperance] - [Show Excluded Files]를 체크하면 보일것임.

 

 

 

 

📌 JPAQueryFactory Bean 등록

@Configuration
public class QueryDslConfig {

    private final EntityManager entityManager;

    public QueryDslConfig(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

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

 

 

 

📌 Repository 커스텀 인터페이스 + 구현체 만들기

  • FeedRepositoryCustom.java
public interface FeedRepositoryCustom {
    List<Feed> searchFeeds(String keyword, Pageable pageable);
}
  • FeedRepositoryImpl.java
@Repository
@RequiredArgsConstructor
public class FeedRepositoryImpl implements FeedRepositoryCustom {

    private final JPAQueryFactory queryFactory;

    @Override
    public List<Feed> searchFeeds(String keyword, Pageable pageable) {
        return queryFactory
                .selectFrom(feed)
                .leftJoin(feed.book).fetchJoin()
                .where(feed.isBlinded.isFalse()
                        .and(feed.content.containsIgnoreCase(keyword)
                                .or(feed.book.title.containsIgnoreCase(keyword))))
                .orderBy(feed.createdAt.desc())
                .offset(pageable.getOffset())
                .limit(pageable.getPageSize())
                .fetch();
    }
}

 

📌 Repository에 Custom 연결

public interface FeedRepository extends JpaRepository<Feed, Long>, FeedRepositoryCustom {
}

 

끝...!

728x90
320x100