인프런 커뮤니티 질문&답변

정재현님의 프로필 이미지

작성한 질문수

실전! Querydsl

Querydsl 설정과 검증

테스트 코드 EntityManager Autowired 컴파일 에러 질문드립니다.

해결된 질문

23.12.28 16:00 작성

·

645

·

수정됨

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입니다.

https://android-developer.tistory.com/entry/%ED%95%B4%EA%B2%B0-Deprecated-Gradle-features-were-used-in-this-build-making-it-incompatible-with-Gradle-80-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%8A%A4%ED%8A%9C%EB%94%94%EC%98%A4

해당 링크 방법도 해보았지만 동일한 상황입니다.

답변 2

0

OMG님의 프로필 이미지

2023. 12. 28. 19:52

안녕하세요. 정재현님, 공식 서포터즈 OMG입니다.

em.persist(em); ->

em.persist(hello);

로 변경해서 확인해주세요 ^^

image

could not autowired 메시지 출력의 경우 인텔리제이 무료 버전을 사용중이시라면 인텔리제이에서 스프링 코드 편의 기능을 지원하지 않아 제대로 인식하지 않아서 발생할 수 있으며, 유료 버전이더라도 간혹 코드 인식에서 문제가 발생하여 출력될 수 있는 것으로 알고 있습니다.(이 때 실행에 문제가 없다면 무시하셔도 됩니다 😀)

 

Q파일이 정상적으로 생성되서 문제는 없을것으로 보이며, 해결이 안될 경우 댓글 남겨주세요 !

감사합니다.

정재현님의 프로필 이미지
정재현
질문자

2023. 12. 29. 09:16

안녕하세요. OMG님 오타 수정하고 캐시삭제 후 재실행 하여도 같은 문제가 반복됩니다. 인텔리제이는 유료 버전을 사용하고 있습니다.

image

OMG님의 프로필 이미지

2023. 12. 29. 09:19

코드를 수정했는데도 동일한 문제가 발생한다면 프로젝트 코드를 확인해봐야 알 것 같습니다.

 

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명


링크: 공식 서포터즈

링크: 자주하는 질문

정재현님의 프로필 이미지
정재현
질문자

2023. 12. 29. 09:57

구글 드라이브

링크 남겨드립니다.

 

1. 문제 영역을 실행할 수 있는 방법

프로젝트 빌드 후 테스트 코드(QuerydslApplicationTests.java) 실행

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

em 부분에 could not autowired 발생

테스트 실패

OMG님의 프로필 이미지

2023. 12. 29. 11:06

프로젝트 코드 확인해보았습니다.

could not autowire 관련

저의 개발 환경(인텔리제이 유료)에서는 동일한 메시지가 출력되지 않았습니다. 이전 답변에서 말씀드렸듯이 인텔리제이 유료버전일지라도 코드 인식이 불완전할 수 있습니다. 이전에도 비슷한 경우가 있었지만(코드 실행은 정상적으로 되지만, 인텔리제이(유료) 내에서만 코드 인식 불량 )정확한 해결방안을 찾고 싶지만 정확한 원인과 방법이 잘 나오지는 않더라구요.

(인텔리제이 최신 버전 설치 혹은 시도한 방법인 캐시 삭제를 권장드리곤 합니다.)

image

테스트 실패 관련

test > resources(디렉토리를 새로 생성, resource's'가 포함됨에 주의) > application.yml을 생성해주세요.

application.yml의 내용을 공란으로 하여 테스트를 실행해주세요.

image

이렇게 안내를 드리는 이유는 제 환경에서는 문제가 발생하지 않아

 

test환경에서 h2인메모리DB로 테스트 했을 때의 상황을 확인하여

h2실행으로 인한 문제가 발생한 것인지, querydsl DB 파일 내 문제인지 확인하기 위함입니다.

 

시도 후 결과를 공유해주세요 😀

정재현님의 프로필 이미지
정재현
질문자

2023. 12. 29. 14:19

알려주신 내용으로 test/resources/application.yml(빈 파일) 생성 후 재시도 해보았지만 동일 상황입니다.

image

OMG님의 프로필 이미지

2023. 12. 29. 18:03

제 개발 환경에서는 발생하지 않아 원인을 찾기가 쉽지 않네요.

하나씩 의심가는 부분을 확인하면서 원인을 발견해야 할 것 같습니다. (application.yml은 test의 것을 원인 파악할 때까지만 그대로 사용해주세요 😀)

 

  • OneDrive 경로에 프로젝트 폴더를 위치해놓으신 것 같습니다. OneDrive에 놓을 경우 정상적으로 동작하지 않은 경우가 종종 있었습니다. 프로젝트 폴더의 위치를 C드라이브/test/ << 여기로 옮겨서 확인해보시겠어요? (OneDrive경로가 아닌, C드라이브 아무 위치. 대신 폴더명은 한글이 아닌 영어로)

  • Q파일은 정상적으로 생성된 것 같지만, 혹시 모르니 clean후 다시 생성해보면 좋을 것 같습니다.

    • (OneDrive 위치는 원상복구하지 않고 변경한 위치에서 진행해주세요)

    • Settings에서 annotation processing이 체크되어 있는지 확인해주세요.image

    • 인텔리제이 우측의 코끼리 아이콘 클릭 후 Tasks > build > clean과 bootJar를 실행해서 Q파일이 정상적으로 생성됨을 확인 후 다시 테스트 해주세요.image

  • 여기까지 했음에도 동일한 경우 build와 실행을 Gradle > IntelliJ IDEA로 변경해서 확인해주세요 image

시도 후 결과를 공유해주세요!

  • 추가로 해결이 안될 경우 오류 메시지 캡쳐 화면을 하위 레벨의 오류의 것을 첨부해주셨는데, 최상위 레벨의 메시지 내용을 복사하여 남겨주시겠어요?

    image

  • 한가지 더 요청드리면 gradle > wrapper > gradle-wrapper.jar의 내용도 캡쳐해서 올려주시면 감사하겠습니다image

정재현님의 프로필 이미지
정재현
질문자

2024. 01. 02. 10:20

onedrive가 아닌 c드라이브의 영어 경로로 변경하니 해결 되었습니다.
감사드립니다.

0

인프런 AI 인턴님의 프로필 이미지

2023. 12. 28. 16:06

안녕하세요, 인프런 AI 인턴입니다.

강의 수강생님이 질문하신 EntityManager에 관련한 컴파일 에러 부분은 다른 수강생들의 유사한 질문에서도 종종 다루어졌던 내용으로 보입니다. 특히 다음 링크에 제공된 답변에서 도움을 받으실 수 있을 것 같습니다.

위 링크의 답변 내용을 참고하시면 ‘EntityManager’ 관련 문제를 해결하는 데 도움이 될 것입니다. 추가 질문이 있으시다면 링크를 통해 질문해보시는 것도 좋은 방법이 될 것입니다.

감사합니다.