백엔드/Querydsl

[Querydsl] [1] 프로젝트 환경 설정

RE-Heat 2023. 9. 15. 23:36

https://www.inflearn.com/course/querydsl-%EC%8B%A4%EC%A0%84/dashboard

 

실전! Querydsl - 인프런 | 강의

Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, 복잡한 쿼리, 동적 쿼리는 이제 안녕! Querydsl로 자바 백엔드 기술을 단단하게. 🚩 본 강의는 로드맵 과정입니다. 본 강의는 자바 백엔

www.inflearn.com

인프런 김영한 님의 강의를 듣고 작성한 글입니다.

 

[1] 프로젝트 생성

■ 스프링 부트 스타터

 

■ IntelliJ Gradle 대신 자바로 바로 실행하기

 

■ 롬복 적용

 

[2] Querydsl 설정과 검증

스프링 부트 2.6 이상이면 Querydsl 5.0으로 설정해야 한다.

 

build.gradle

buildscript {
	ext {
		queryDslVersion = "5.0.0"
	}
}

plugins {
	id 'org.springframework.boot' version '2.7.15'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'

	//querydsl 추가
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
	id 'java'
}

group = 'study'
version = '0.0.1-SNAPSHOT'

java {
	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}"
	implementation "com.querydsl:querydsl-apt:${queryDslVersion}"

	implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'

	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'

	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('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 추가 끝
  • def querydslDir = "$buildDir/generated/querydsl"은 build 할 때 생성될 q파일의 경로를 명시해 준 것이다.

 

build.generated에 querydsl이 들어간 것을 확인할 수 있다.

※ 주의사항

Q타입은 컴파일 시점에 자동 생성되므로 git으로 관리하면 안 된다. 단, 기본적으로 그래들에서 build 파일은 git.ignore에 등록돼 있으므로 신경 쓰진 않아도 된다.

 

■ 테스트

@SpringBootTest
@Transactional
@Rollback(false)
class QuerydslApplicationTests {

	@Autowired
	EntityManager em;

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

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


		Hello result = query.selectFrom(qHello)
				.fetchOne();

		assertThat(result).isEqualTo(hello);
		assertThat(result.getId()).isEqualTo(hello.getId());
	}

}
  • QHello에 static으로 선언해 놓은 것이 있어 굳이 QHello qhello = new QHello("h");로 할 필요가 없다.

  • 테스트에선 DB가 자동으로 롤백되므로 확인하려면 @Rollback(false)를 지정해줘야 한다.

 

[3] 라이브러리 살펴보기

■ Querydsl 라이브러리

  • querydsl-apt: Querydsl 관련 코드 생성 기능을 제공
  • querydsl-jpa: querydsl 라이브러리

■ 핵심 라이브러리

  • 스프링 MVC
  • JPA, 하이버네이트
  • 스프링데이터 JPA 
  • Querydsl


■ 기타 라이브러리

  • H2 데이터베이스 클라이언트 
  • 커넥션풀: 부트 기본은 HikariCP 
  • 로깅 SLF4J & LogBack 
  • 테스트

 

[4] H2 데이터베이스 설치

[JPA 활용1] [1] 프로젝트 환경설정  [4] H2 데이터베이스 설치 확인

 

[5] 스프링 부트 설정 - JPA, DB

application.yml

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/querydsl
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
       # show_sql: true
        format_sql: true
        use_sql_comments : true

logging.level:
  org.hibernate.SQL: debug
  #org.hibernate.type: trace
  • ddl-auto: create는 애플리케이션 실행 시점에 테이블을 drop 후 생성한다.
  • org.hibernate.SQL : logger를 통해 실행된 SQL을 남긴다.

 

■ 동작확인

QuerydslApplicationTests를 돌리면 데이터가 잘 들어가는 것을 확인할 수 있다.

→ Rollback(false) 까먹지 말자

 

■ 쿼리 파라미터 로그 남기기

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8

스프링부트 사용 시 build.gradle에 이 라이브러리만 추가하면 된다.

 

실행화면