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

곰인님의 프로필 이미지
곰인

작성한 질문수

실전! Querydsl

Querydsl 설정과 검증

Qhello와 EntityManager 오류 질문

해결된 질문

작성

·

989

0

버전은 3.0.9를 사용하였습니다.

https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.iayahq64el0u 이거의

Querydsl 부트 3.x 설정을 따라하여

build.gradle은 이렇게 설정하였습니다.

plugins {
   id 'java'
   id 'org.springframework.boot' version '3.0.9'
   id 'io.spring.dependency-management' version '1.1.2'
}

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'

   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')
}

build->clean을 하고 build->compileJava를 하니

이런식으로 build에 Hello와 QHello가 같이 생겼습니다. (QuerydslApplication 까지) 그후 테스트를 다음과 같이 작성하였는데

package study.querydsl;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Hello;

import static org.assertj.core.api.Assertions.*;

@SpringBootTest
@Transactional
class QuerydslApplicationTests {

   @PersistenceContext
   EntityManager em;

   @Test
   void contextLoads() {
      Hello hello = new Hello();
      em.persist(hello);

      JPAQueryFactory query = new JPAQueryFactory(em);
      QHello qHello = new QHello("h");

      Hello result = query
            .selectFrom(qHello)
            .fetchOne();
      
      assertThat(result).isEqualTo(hello);
      //lombok 동작 확인 (hello.getId())
      assertThat(result.getId()).isEqualTo(hello.getId());
   }

}

여기서 첫번째 질문은 @Autowired를 사용하였을 때
EntityManager em; 에서 em에 빨간줄이 뜨며 자동 주입을 할 수 없습니다. 'EntityManager' 타입의 bean을 찾을 수 없습니다 라는 오류가 발생 합니다. @Autowired대신 @PersistenceContext를 사용하면 해당 오류가 뜨지 않습니다. 왜 이런건가요?

두번째 질문은 심볼 'QHello'을(를) 해결할 수 없습니다 오류가 발생합니다. 빌드에서 QHello와 Hello가 같이 생겨서 그럴까요?

다른분들 질문들에 달린 답변들을 보고 따라해보았지만 해결이 되지 않습니다ㅜ

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 곰인님

다음 링크에 있는 답변을 참고해서 한번 진행해보시겠어요?

https://www.inflearn.com/questions/958249

만약 그래도 안된다면

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

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

https://bit.ly/3fX6ygx

 

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


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

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

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

감사합니다.

곰인님의 프로필 이미지
곰인
질문자

답변 감사합니다.

곰인님의 프로필 이미지
곰인

작성한 질문수

질문하기