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

정재현님의 프로필 이미지
정재현

작성한 질문수

실전! Querydsl

Querydsl 설정과 검증

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

해결된 질문

작성

·

699

·

수정됨

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

em.persist(em); ->

em.persist(hello);

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

image

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

 

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

감사합니다.

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

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

image

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

 

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

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

https://bit.ly/3fX6ygx


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


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

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

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


링크: 공식 서포터즈

링크: 자주하는 질문

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

구글 드라이브

링크 남겨드립니다.

 

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

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

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

em 부분에 could not autowired 발생

테스트 실패

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

could not autowire 관련

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

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

image

테스트 실패 관련

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

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

image

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

 

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

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

 

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

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

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

image

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

하나씩 의심가는 부분을 확인하면서 원인을 발견해야 할 것 같습니다. (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

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

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

0

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

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

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

감사합니다.

정재현님의 프로필 이미지
정재현

작성한 질문수

질문하기