본문 바로가기
Jpa/querydsl

[Querydsl 1편] querydsl 상속, 구현 없이 환경 세팅

by 무대포 개발자 2022. 1. 3.
728x90
반응형

source 는 Github 에 있습니다.

목차는 Querydsl 목차 에 있습니다.

[Querydsl 1편] querydsl 상속, 구현 없이 환경 세팅

spring boot, querydsl 상속, 구현 없이 환경 세팅

  • 기존에 querydsl 을 구현해줄려면 interface 를 만들어야하고 구현체를 만들어야 했습니다.
  • querydsl 을 사용할 때 상속, 구현없이 환경 세팅하는 법에 대해서 정리했습니다.

public interface MemberRepositoryCustom {
    void test();
}

public class MemberRepositoryImpl implements MemberRepositoryCustom {
    xxx
    xxx
    xxx         
}

source

  • 아래와 같이 소스를 작성한다면 generated 폴더에 Qxxxxx 파일이 만들어집니다.
// build.gradle
buildscript {
ext {
springBootVersion = '2.4.5'
querydslPluginVersion = '1.0.10' // 플러그인 버전
}
repositories {
maven { url "https://plugins.gradle.org/m2/" } // 플러그인 저장소
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:${querydslPluginVersion}")
}
}
plugins {
id 'java'
id 'org.springframework.boot' version '2.4.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa'
// Querydsl start
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
// Querydsl end
}
def generated = "src/main/generated"
sourceSets {
main.java.srcDirs += [ generated ]
}
tasks.withType(JavaCompile) {
options.annotationProcessorGeneratedSourcesDirectory = file(generated)
}
clean.doLast {
file(generated).deleteDir()
}
//--------------------------------------------------------------------------------
// Configuration
@Configuration
public class QuerydslConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
//--------------------------------------------------------------------------------
// Domain, Repository
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Member {
@Id
@Column(name = "member_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String name;
@Builder
public Member(String name) {
this.name = name;
}
}
@Repository
@RequiredArgsConstructor
public class MemberQueryRepository {
private final JPAQueryFactory jpaQueryFactory;
public List<Member> findByName(String name) {
return jpaQueryFactory
.selectFrom(member)
.where(member.name.eq(name))
.fetch();
}
}
//--------------------------------------------------------------------------------
// Test
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberQueryRepositoryTest {
@Autowired
private MemberRepository memberRepository;
@Autowired
private MemberQueryRepository memberQueryRepository;
@Before
public void setUp() {
Member member = Member.builder()
.name("test")
.build();
memberRepository.save(member);
}
@Test
public void member_querydsl_테스트 () throws Exception {
List<Member> list = memberQueryRepository.findByName("test");
Assert.assertEquals(1, list.size());
}
}

결론

  • qerydsl 사용할 때, interface, 구현체를 만들지 않고 사용하기에 클래스 수를 줄일 수 있습니다.

reference

댓글