프로젝트 환경설정

LeeKyoungChang·2022년 5월 4일
0
post-thumbnail

Querydsl 수업을 듣고 정리한 내용입니다.

 

가장 많이 사용하는 기술
동적 쿼리 문제도 해결해준다.

✔️ jpql vs querydsl

public void jpql(){
	String username = "kim";
	String query = "select m from Member m" +
		 "where m.username = :username";
	List<Member> result = em.createQuery(query, Member.class)
		 .getResultList();
}
  • 여기서는 Member mwhere m.username : 중간에 띄워쓰기를 하지 않아 오류가 발생한다.
  • 문법오류를 자바 컴파일러가 알 수 없다. 실제 실행해봐야 알 수 있다.
public void querydsl(){
	String username = "kim";
	List<Member> result = queryFactory
		 .select(member)
		 .from(member)
		 .where(member.username.eq(username))
		 .fetch();
}
  • 컴파일 오류 시점에서 수많은 원인들을 찾을 수 있다. (sql문, java 코드 등)
  • java코드이기때문에, 코드 자동화를 사용할 수 있다.
  • 코드를 재사용할 수도 있다.

 

📚 1. 프로젝트 환경설정

스크린샷 2022-05-04 오후 1 30 58

 

📖 A. Querydsl 설정과 검증

build.gradle에 소스를 추가한다.

// buildscript 추가  
buildscript {  
   ext {  
      queryDslVersion = "5.0.0"  
   }  
}  
  
plugins {  
   id 'org.springframework.boot' version '2.6.7'  
   id 'io.spring.dependency-management' version '1.0.11.RELEASE'  
   //querydsl 추가  
   id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"  
   id 'java'  
}  
  
group = 'study'  
version = '0.0.1-SNAPSHOT'  
sourceCompatibility = '11'  
  
configurations {  
   compileOnly {  
      extendsFrom annotationProcessor  
   }  
}  
  
repositories {  
   mavenCentral()  
}  
  
dependencies {  
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'  
   implementation 'org.springframework.boot:spring-boot-starter-web'  
  
   //querydsl 추가  
   implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"  
   annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"  
  
   compileOnly 'org.projectlombok:lombok'  
   runtimeOnly 'com.h2database:h2'  
   annotationProcessor 'org.projectlombok:lombok'  
  
  
   // 테스트에서 lombok 사용  
   testCompileOnly 'org.projectlombok:lombok'  
   testAnnotationProcessor 'org.projectlombok:lombok'  
  
   testImplementation('org.springframework.boot:spring-boot-starter-test') {  
      exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'  
   }  
}  
  
test {  
   useJUnitPlatform()  
}  
  
//querydsl 추가 시작  
def querydslDir = "$buildDir/generated/querydsl"  
querydsl {  
   jpa = true  
   querydslSourcesDir = querydslDir  
}  
  
sourceSets {  
   main.java.srcDir querydslDir  
}  
configurations {  
   querydsl.extendsFrom compileClasspath  
}  
compileQuerydsl {  
   options.annotationProcessorPath = configurations.querydsl  
}  
//querydsl 추가 끝

 

📖 B. Querydsl 환경설정 검증

✔️ 검증용 엔티티 생성

package study.querydsl.entity;  
  
import lombok.Getter;  
import lombok.Setter;  
  
import javax.persistence.Entity;  
import javax.persistence.GeneratedValue;  
import javax.persistence.Id;  
  
@Entity  
@Getter @Setter  
public class Hello {  
  
    @Id @GeneratedValue  
    private Long id;  
}

 

추가한 후, gradle/querydsl/Tasks/other/compileQuerydsl 버튼을 클릭하여, Querydsl이 잘 실행되는지 체크한다.

스크린샷 2022-05-04 오후 3 26 24

 

성공!

스크린샷 2022-05-04 오후 4 00 06

 

def querydslDir = "$buildDir/generated/querydsl"

  • build/generated/querydsl이 추가되었다.
스크린샷 2022-05-04 오후 3 55 42

QHello 클래스가 생성되었다.

스크린샷 2022-05-04 오후 4 01 36

 

✔️ 검증용 Q 타입 생성

(1) Gradle Intellij 사용방법

  • Gradle → Tasks → build → clean 클릭
  • Gradle → Tasks → other → compileQuerydsl 클릭

(2) Gradle 콘솔 사용법
./gradlew clean compileQuerydsl 실행
스크린샷 2022-05-04 오후 4 15 01

./gradlew clean 실행할시, 검증용 Q 타입 제거

(1), (2)중 하나를 실행할 시 QHello클래스가 생성된다.

 

✔️ 테스트케이스로 실행 검증

@Transactional  
@SpringBootTest  
class QuerydslApplicationTests {  
  
   @Autowired  
   EntityManager em;  
  
   @Test  
   void contextLoads() {  
      Hello hello = new Hello();  
      em.persist(hello);  
  
      JPAQueryFactory query = new JPAQueryFactory(em);  
      QHello qHello = QHello.hello; //Querydsl Q타입 동작 확인  
  
      Hello result = query  
            .selectFrom(qHello)  
            .fetchOne();  
  
      assertThat(result).isEqualTo(hello);  
      //lombok 동작 확인 (hello.getId()     
		assertThat(result.getId()).isEqualTo(hello.getId());  
   }  
  
}
스크린샷 2022-05-04 오후 4 48 03

 

💡 참고
스프링 부트에 아무런 설정도 하지 않으면 h2 DB를 메모리 모드로 JVM안에서 실행한다.

 

📚 2. 라이브러리 살펴보기

✔️ gradle 의존관계 보기

./gradlew dependencies --configuration compileClasspath

 

스크린샷 2022-05-04 오후 5 03 32
  • querydsl-apt : Querydsl 관련 코드 생성 기능 제공
  • querydsl-jpa : querydsl 라이브러리

 

스크린샷 2022-05-04 오후 5 05 50
  • querydslSourcesDir = querydslDir, main.java.srcDir querydslDir : id들이 자동으로 자기 소스폴더에 import 된다.(?)

 

📚 3. 스프링 부트 설정 - JPA, DB

application.yml

spring:  
  datasource:  
    url: jdbc:h2:tcp://localhost//Users/leekyoungchang/Desktop/Study/Computer/Spring/JPA(pdf, ppt)/Querydsl/db/querydsldb  
    username: sa  
    password: 1234  
    driver-class-name: org.h2.Driver  
  jpa:  
    hibernate:  
      ddl-auto: create  
    properties:  
      hibernate:  
        #        show_sql: true  
        format_sql: true  
logging.level:  
  org.hibernate.SQL: debug  
#  org.hibernate.type: trace

 

spring.jpa.hibernate.ddl-auto: create : 이 옵션은 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.

 

✔️ 모든 로그 출력은 가급적 로거를 통해 남겨야 한다.

show_sql : System.out에 하이버네이트 실행 SQL을 남긴다.
org.hibernate.SQL : logger를 통해 하이버네이트 실행 SQL을 남긴다.

 

✔️ 쿼리 파라미터 로그 남기기
이전에 이미 공부한 적이 있는 내용이다.

 

쿼리 파라미터 로그 남기기

 

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글