Develop/spring-data

jpa, querydsl 적용 시 로깅 비교. querydsl로 작성한 쿼리 DBMS에서 쉽게 돌리는 방법. 2탄!

에디개발자 2020. 11. 12. 08:46
반응형

이전 글 ( jpa, querydsl 적용 시 로깅 비교. querydsl로 작성한 쿼리 DBMS에서 쉽게 돌리는 방법. 1탄! ) 에서 jpa, querydsl을 사용했을 때 불편한 점과 해결 방법(로깅) 및 로깅의 종류에 간략하게 알아보았습니다. 이번 글에서는 최종적으로 선택된 로깅 방법인 p6spy에 대해서 정리하겠습니다.

 

작성된 글의 소스 코드는 github에 올려두었습니다.

JPA, Querydsl 설정 방법은 아래 링크를 참조해주시면 됩니다!

 

JPA에 대해서 궁금하시면?

Querydsl에 대해서 궁금하시면?

나를 닮았다고 한다....

p6spy

실전에서 사용했을 때 가장 편리할 것 같은 SQL 로그입니다.

결과부터 살펴보겠습니다.

2020-11-11 11:36:49.316  INFO 50255 --- [           main] p6spy                                    : #1605062209315 | took 16ms | statement | connection 2| url jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
select store0_.id as col_0_0_, createPrefix(store0_.name) as col_1_0_, store0_.address as col_2_0_ from store store0_ where store0_.name=? limit ?
select store0_.id as col_0_0_, createPrefix(store0_.name) as col_1_0_, store0_.address as col_2_0_ from store store0_ where store0_.name='스토어6' limit 1;

곧바로 DBMS에 붙혀넣기 했을 때 돌아가는 SQL문이 찍히는 것을 확인할 수 있습니다.

 

사용방법

디펜던시만 추가하면 간편하게 사용할 수 있습니다.

build.gradle

plugins {
	id 'org.springframework.boot' version '2.3.5.RELEASE'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
	id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'

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


	runtimeOnly 'mysql:mysql-connector-java'

	implementation 'com.querydsl:querydsl-jpa'
	implementation 'com.querydsl:querydsl-apt'

	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

def querydslSrcDir = "$buildDir/generated/querydsl"

querydsl {
	jpa = true
	querydslSourcesDir = querydslSrcDir
}

sourceSets {
	main.java.srcDirs querydslSrcDir
}

// 여기부터 gradle 5.0 이후로 추가
configurations {
	querydsl.extendsFrom compileClasspath
}

compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

여기서 주석으로 달아놓은 p6spy 한줄만 추가해주시면 위와같은 로그를 얻을 수 있습니다.

 

application.yaml

application.yaml 설정에서는 기존에 사용했던 로그 관련 프로퍼티들을 모두 제외하였습니다.

spring:
  profiles:
    active: local


--- #local
spring:
  profiles: local
  datasource:
    url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
    username: root
    password: vnfmsqka0727!
    driver-class-name: com.mysql.jdbc.Driver

  jpa:
    database: mysql
    generate-ddl: false
    open-in-view: false
    hibernate:
      ddl-auto: none     # 항상 조심!!
    properties:
      hibernate:
#        show_sql: true
#        format_sql: true
#        use_sql_comments: true
    database-platform: com.example.querydsl.configuration.MysqlCustomDialect

#logging:
#  level:
#    org:
#      hibernate:
#        SQL: DEBUG
#        type:
#          trace

 

결론

총 3가지의 SQL 로그 방식에 대해서 알아보았습니다.

3개 중 p6spy 로깅 방식이 상용에서 사용하기에 가장 적합하였습니다.

  • SQL 로그를 DBMS에 복붙하여 바로 사용할 수 있음

그러나 아직 가독성이 떨어지고 alias가 달라붙고 있어서 DBMS에서 확인하려면 alias를 하나씩 delete해야하는 불편함이 있습니다.

그래서 추 후에 p6spy github를 클론받아 분석하여 정리하겠습니다.

Spring Data JPA, Querydsl 로깅처리. p6spy pretty하게 설정하기 에 로깅을 pretty하게 볼 수 있는 설정값을 정리하였습니다.

 

반응형