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

김기정님의 프로필 이미지
김기정

작성한 질문수

실전! 스프링 데이터 JPA

개발하고 있는 프로젝트에 Querydsl을 적용해보려고 테스트 중입니다.

작성

·

633

0

1. build.gradle에 설정 후 Q파일 생성까지 완료
2. 환경 설정 검증용 엔티티 생성 후 테스트 프로그램 완료
3. 테스트 실행 후 에러 발생
 
E:\workspace\ECS-server\ecs\build\generated\querydsl\com\weni\ecs\domain\QEduAcnt.java:16: error: cannot find symbol public class QEduAcnt extends EntityPathBase<EduAcnt> { ^ symbol: class EduAcnt
 
4. 에러를 찾을 수 없어서 해당 파알을 삭제 후 테스트 프로그램 실행
@Test
void contextLoads() {
JPAQueryFactory query = new JPAQueryFactory(em);
QHello qHello = QHello.hello; //Querydsl Q타입 동작 확인

List<Hello> result = query
.selectFrom(qHello).fetch();

System.out.println("result = " + result);
}
 
5. 테스트 성공 
 
Hibernate: select hello0_.id as id1_7_ from Hello hello0_
2022-06-30 21:58:16.019  INFO 30456 --- [    Test worker] jdbc.sqltiming                           : select hello0_.id as id1_7_ from Hello hello0_
 {executed in 2 msec}
2022-06-30 21:58:16.036  INFO 30456 --- [    Test worker] jdbc.resultsettable                      :
|-------|
|id1_7_ |
|-------|
|1      |
|2      |
|3      |
|-------|

result = [com.weni.ecs.domain.Hello@133fb509, com.weni.ecs.domain.Hello@bb0ca30, com.weni.ecs.domain.Hello@6e6d544]

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 15s
6 actionable tasks: 4 executed, 2 up-to-date
오후 9:58:16: Execution finished ':test --tests "com.weni.ecs.domain.QuerydslApplicationTests.contextLoads"'.
 
6.  다시 테스트를 실행하면 다시 생성된 Q파일떄문에 또 에러 발생합니다.
 
 
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.PostLoad;
import javax.persistence.PrePersist;
import javax.persistence.PostPersist;
import javax.persistence.PreUpdate;
import javax.persistence.PostUpdate;
import javax.persistence.PreRemove;
import javax.persistence.PostRemove;
// import org.springframework.beans.BeanUtils;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.Builder;

@Entity
@Table(name="EDU_ACNT") //--PRIMARY
@Getter
@NoArgsConstructor // (access = AccessLevel.PROTECTED) // AccessLevel.PUBLIC
@EqualsAndHashCode // (of = {"email","name"}, callSuper = true, onParam = @__(@NonNull))
@ToString //(exclude = "password") // exclude 속성을 사용하면, 특정 필드를 toString() 결과에서 제외
public class EduAcnt {
    @Id //  Integer
    @Column(name = "ACNT_NO", nullable = false)
    private Integer acntNo; //--null

    @Column(name = "BALANCE", precision = 18, scale = 0, nullable = false)
    private BigDecimal balance; //--null

    @Builder
    public EduAcnt(Integer acntNo, BigDecimal balance) {
        this.acntNo = acntNo;
        this.balance = balance;
    }

    //----------------------------------------------------
    // Load/Persist/Update/Remove(조회/신규/수정/삭제)
    // Entity Pre/Post(이전/이후) 처리에 대한 정의(PreLoad는 없음)
    // * DB의 Trigger와 비슷한 JPA기능
    //----------------------------------------------------
    @PostLoad
    public void onPostLoad() {
    }

    @PrePersist
    public void onPrePersist() {

    }

    @PostPersist
    public void onPostPersist() {
    }

    @PreUpdate
    public void onPreUpdate() {
    }

    @PostUpdate
    public void onPostUpdate() {
    }

    @PreRemove
    public void onPreRemove() {
    }

    @PostRemove
    public void onPostRemove() {
    }

}

답변 1

0

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

안녕하세요. 김기정님

Querydsl 설정이 버전이나 환경에 따라서 조금씩 달라집니다.

다음을 참고해주세요.

 

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')
}
김기정님의 프로필 이미지
김기정

작성한 질문수

질문하기