해결된 질문
작성
·
2.7K
0
안녕하세요 영한님, 서포터즈님들
이전 Spring Data JPA에서 hibernate 버전으로 인해서 % like 연산이 제대로 동작하지 않아서 버전을 바꿔줬었습니다.
그런데 이번 강의에서 hibernate 버전을 변경하지 않아도 테스트가 제대로 동작을 했습니다.
제가 알고 있는 바로는 querydsl은 jpql을 사용하기 쉽게, 컴파일 타임 때 에러를 잡을 수 있게 도와주므로 결국 querydsl -> jpql -> jpa -> hibernate 요렇게 진행방식(?)이 된다고 생각했습니다.
그러면 저번에 spring data jpa에서 제대로 테스트 되지 않았던 findItem이 querydsl 을 사용할 때도 안되야하지 않나라는 생각이 들어서 질문드립니다
감사합니다
답변 2
1
안녕하세요. gusdn85554님, 공식 서포터즈 y2gcoder입니다.
말씀해주셨던대로 실제로 강의에서 전 챕터인 데이터 접근 기술 - 스프링 데이터 JPA 의 스프링 데이터 JPA 적용 2편을 보면 하이버네이트 5.6.7 버전에서 동일한 오류가 발생해서 build.gradle에서 hibernate 버전을 5.6.5로 낮춰줬습니다.
ext["hibernate.version"] = "5.6.5.Final"
혹시 이 것을 querydsl 설정할 때는 지워주셨는데 그대로 테스트가 성공하셨다는 말씀이실까요?
아니라면 현 프로젝트 특성상 이전 챕터에서 사용했던 build.gradle에 라이브러리를 추가해 사용하고 계신 것으로 이해하고 있습니다.
그렇다면 이전 Spring Data JPA 때 설정해놨던 것들이 그대로 작동할 것이고, 하이버네이트 5.6.5 Final 버전을 사용한다는 말씀이시니 문제가 없을 것으로 보입니다. 그리고 더불어 해당 이슈는 Spring Data JPA의 메서드 이름을 보고 그대로 쿼리를 생성해주는 쿼리 메서드 기능에서 발생하는 이슈입니다. 그래서 JPQL로 직접 like 문을 작성해서 실행하면 정상적으로 작동하게 됩니다. Querydsl은 결국 JPQL을 만들어주는 라이브러리이기 때문에 또한 이 이슈에서 벗어나게 됩니다.
혹시나 해서 build.gradle에서 하이버네이트 버전을 낮춘 것을 주석처리 후, querydslConfig 설정을 Import 한 뒤에 테스트를 돌려보았습니다.
buid.gradle
plugins {
id 'org.springframework.boot' version '2.6.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
//ext["hibernate.version"] = "5.6.5.Final"
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
//JdbcTemplate 추가
// implementation 'org.springframework.boot:spring-boot-starter-jdbc'
//MyBatis 추가
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
//JPA, 스프링 데이터 JPA 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
//Querydsl 추가
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
//H2 데이터베이스 추가
runtimeOnly 'com.h2database:h2'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//테스트에서 lombok 사용
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
tasks.named('test') {
useJUnitPlatform()
}
//Querydsl 추가, 자동 생성된 Q클래스 gradle clean으로 제거
clean {
delete file('src/main/generated')
}
이렇게 하니 다시 hibernate 5.6.7.Final 버전입니다.
Querydsl 설정으로 바꿔주고
package hello.itemservice;
import hello.itemservice.config.*;
import hello.itemservice.repository.ItemRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
@Slf4j
//@Import(MemoryConfig.class)
//@Import(JdbcTemplateV1Config.class)
//@Import(JdbcTemplateV2Config.class)
//@Import(JdbcTemplateV3Config.class)
//@Import(MyBatisConfig.class)
//@Import(JpaConfig.class)
//@Import(SpringDataJpaConfig.class)
@Import(QuerydslConfig.class)
//@Import(V2Config.class)
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
public class ItemServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}
@Bean
@Profile("local")
public TestDataInit testDataInit(ItemRepository itemRepository) {
return new TestDataInit(itemRepository);
}
/*
@Bean
@Profile("test")
public DataSource dataSource() {
log.info("메모리 데이터베이스 초기화");
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
*/
}
ItemRepositoryTest를 돌려보았습니다.
모두다 성공했습니다.
여기서 Spring Data JPA 설정으로만 바꿔서 테스트를 해보겠습니다.
역시나 에러가 발생하고 있습니다.
한 번 참고해보시고 혹시 이해가 안가는 점이 있으시다면 언제든지 질문해주십쇼!
감사합니다.
0
안녕하세요 y2gcoder님
빠르고 자세한 답변 감사드립니다!
말씀대로 hibernate 5.6.7 를 사용하면서 테스트가 제대로 동작하여 여쭤본 거였습니다.
답변해주신 것을 보니, querydsl -> jpql -> jpa -> hibernate 가 맞지만, spring data jpa의 쿼리 메서드를 통해서 jpql 로 translate 해주는 곳에서 문제라고 생각이 듭니다
감사합니다 ! 해결되었어요
넵 감사합니다!