해결된 질문
작성
·
715
·
수정됨
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
build.gradle 설정은 아래와 같이 하였습니다.
빌드를 하니 build 경로에 Q타입 생성된 것을 확인했습니다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.1'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'study'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//test 롬복 사용
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
//Querydsl 추가
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"
}
tasks.named('test') {
useJUnitPlatform()
}
clean {
delete file('src/main/generated')
}
테스트 코드
package study.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Hello;
import study.querydsl.entity.QHello;
import static org.assertj.core.api.Assertions.*;
@Transactional
@SpringBootTest
class QuerydslApplicationTests {
@Autowired
EntityManager em;
@Test
void contextLoads() {
Hello hello = new Hello();
em.persist(em);
JPAQueryFactory query = new JPAQueryFactory(em);
QHello qHello = new QHello("h");
Hello result = query.selectFrom(qHello)
.fetchOne();
assertThat(result).isEqualTo(hello);
}
}
해당 테스트 코드에서 em 부분에 컴파일 에러(Could not autowire. No beans of 'EntityManager' type found. )가 발생하고 테스트를 실행하면 아래와 같은 메세지가 출력됩니다.
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///C:/Users/user/OneDrive/%EB%B0%94%ED%83%95%20%ED%99%94%EB%A9%B4/querydsl/build/reports/tests/test/index.html
* Try:
> Run with --scan to get full insights.
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
For more on this, please refer to https://docs.gradle.org/8.5/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.
BUILD FAILED in 3s
4 actionable tasks: 3 executed, 1 up-to-date
인텔리제이 종료 후 .idea 파일 삭제후 프로젝트 다시 실행해도 동일한 상황이어서 질문 드립니다. Gradle 버전은 8.5입니다.
해당 링크 방법도 해보았지만 동일한 상황입니다.
답변 2
0
안녕하세요. 정재현님, 공식 서포터즈 OMG입니다.
em.persist(em); ->
em.persist(hello);
로 변경해서 확인해주세요 ^^
could not autowired 메시지 출력의 경우 인텔리제이 무료 버전을 사용중이시라면 인텔리제이에서 스프링 코드 편의 기능을 지원하지 않아 제대로 인식하지 않아서 발생할 수 있으며, 유료 버전이더라도 간혹 코드 인식에서 문제가 발생하여 출력될 수 있는 것으로 알고 있습니다.(이 때 실행에 문제가 없다면 무시하셔도 됩니다 😀)
Q파일이 정상적으로 생성되서 문제는 없을것으로 보이며, 해결이 안될 경우 댓글 남겨주세요 !
감사합니다.
프로젝트 코드 확인해보았습니다.
could not autowire 관련
저의 개발 환경(인텔리제이 유료)에서는 동일한 메시지가 출력되지 않았습니다. 이전 답변에서 말씀드렸듯이 인텔리제이 유료버전일지라도 코드 인식이 불완전할 수 있습니다. 이전에도 비슷한 경우가 있었지만(코드 실행은 정상적으로 되지만, 인텔리제이(유료) 내에서만 코드 인식 불량 )정확한 해결방안을 찾고 싶지만 정확한 원인과 방법이 잘 나오지는 않더라구요.
(인텔리제이 최신 버전 설치 혹은 시도한 방법인 캐시 삭제를 권장드리곤 합니다.)
테스트 실패 관련
test
> resources(디렉토리를 새로 생성, resource's
'가 포함됨에 주의) > application.yml을 생성해주세요.
application.yml의 내용을 공란으로 하여 테스트를 실행해주세요.
이렇게 안내를 드리는 이유는 제 환경에서는 문제가 발생하지 않아
test환경에서 h2인메모리DB로 테스트 했을 때의 상황을 확인하여
h2실행으로 인한 문제가 발생한 것인지, querydsl DB 파일 내 문제인지 확인하기 위함입니다.
시도 후 결과를 공유해주세요 😀
제 개발 환경에서는 발생하지 않아 원인을 찾기가 쉽지 않네요.
하나씩 의심가는 부분을 확인하면서 원인을 발견해야 할 것 같습니다. (application.yml은 test의 것을 원인 파악할 때까지만 그대로 사용해주세요 😀)
OneDrive 경로에 프로젝트 폴더를 위치해놓으신 것 같습니다. OneDrive에 놓을 경우 정상적으로 동작하지 않은 경우가 종종 있었습니다. 프로젝트 폴더의 위치를 C드라이브/test/ << 여기로 옮겨서 확인해보시겠어요? (OneDrive경로가 아닌, C드라이브 아무 위치. 대신 폴더명은 한글이 아닌 영어로)
Q파일은 정상적으로 생성된 것 같지만, 혹시 모르니 clean후 다시 생성해보면 좋을 것 같습니다.
(OneDrive 위치는 원상복구하지 않고 변경한 위치에서 진행해주세요)
Settings에서 annotation processing이 체크되어 있는지 확인해주세요.
인텔리제이 우측의 코끼리 아이콘 클릭 후 Tasks > build > clean과 bootJar를 실행해서 Q파일이 정상적으로 생성됨을 확인 후 다시 테스트 해주세요.
여기까지 했음에도 동일한 경우 build와 실행을 Gradle > IntelliJ IDEA로 변경해서 확인해주세요
시도 후 결과를 공유해주세요!
추가로 해결이 안될 경우 오류 메시지 캡쳐 화면을 하위 레벨의 오류의 것을 첨부해주셨는데, 최상위 레벨의 메시지 내용을 복사하여 남겨주시겠어요?
한가지 더 요청드리면 gradle > wrapper > gradle-wrapper.jar의 내용도 캡쳐해서 올려주시면 감사하겠습니다
0
안녕하세요, 인프런 AI 인턴입니다.
강의 수강생님이 질문하신 EntityManager에 관련한 컴파일 에러 부분은 다른 수강생들의 유사한 질문에서도 종종 다루어졌던 내용으로 보입니다. 특히 다음 링크에 제공된 답변에서 도움을 받으실 수 있을 것 같습니다.
위 링크의 답변 내용을 참고하시면 ‘EntityManager’ 관련 문제를 해결하는 데 도움이 될 것입니다. 추가 질문이 있으시다면 링크를 통해 질문해보시는 것도 좋은 방법이 될 것입니다.
감사합니다.
안녕하세요. OMG님 오타 수정하고 캐시삭제 후 재실행 하여도 같은 문제가 반복됩니다. 인텔리제이는 유료 버전을 사용하고 있습니다.