ShanePark / markdownBlog

This repository is to keep all my blog posting written in MarkDown online
Creative Commons Attribution 4.0 International
6 stars 4 forks source link

415 #70

Closed utterances-bot closed 1 year ago

utterances-bot commented 1 year ago

[Spring Boot JPA] P6Spy 활용해 쿼리 로그 확인하기

Intro 스프링부트와 JPA로 프로젝트를 진행하다 보면 실제 쿼리가 어떻게 나갈지 눈으로 확인을 하고 싶을 때가 참 많습니다. JPA가 참 편하긴 한데 개발자가 직접 쿼리를 작성하지 않았다 보니 실제로 어떤 쿼리가 나갈지는 눈으로 확인 하기 전까지는

https://shanepark.tistory.com/415

EunjiShin commented 1 year ago

안녕하세요! 혹시 마지막에 SQL 멀티라인 적용 완료하신 사진에서 kr.quidev.quiz.service.QuizService.findById(QuizService.kt:22) 처럼 SQL 호출한 메소드명과 위치 출력해주는 부분 설정 어떻게 하신건지 여쭐 수 있을까요? p6spy 설정파일 문서에는 없는 것 같아서요..!

ShanePark commented 1 year ago

@EunjiShin 안녕하세요. 제가 적은 PrettySqlFormat.kt 부분을 보면 멀티라인 설정을 직접 해 보면서 스택 트레이스도 찍어 보았는데요, 자바로 작성 한 부분에는 기본적인 부분만 작성 해서 stack trace 부분은 따로 구현 해두지를 않았어요. 불편하시더라두 코틀린 코드를 한번 봐 주세요. 자바와 거의 똑같기때문에 코드를 읽는데 큰 무리는 없으실거에요.

   private fun stackTrace(): String {
        return Throwable().stackTrace.filter { t ->
            t.toString().startsWith("kr.quidev") && !t.toString().contains(ClassUtils.getUserClass(this).name)
        }.toString()
    }

바로 이 부분을 보시면, stackTrace를 읽어내며 하나의 String으로 만들어 주는데요, 워낙에 호출스택에 스프링의 온갖 필터나 인터셉터를 비롯한 수많은 콜들이 이어지기 떄문에 전부 넣으면 불필요한 정보가 굉장히 많습니다.

  1. 실제 사용중인 패키지 명으로 먼저 한번 필터링을 해 주고
  2. 또 결국 로그를 찍으며 PrettySqlFormat 클래스를 거치기 때문에 항상 똑같은게 들어가므로 ClassUtils.getUserClass(this).name 로 스스로의 클래스명(p6spy포맷) 도 필터링 해 줍니다.

자바에서는

 new Throwable().getStackTrace()...

로 시작하셔서 트랙트레이스를 받아 오시면 될거에요

EunjiShin commented 1 year ago

@Shane-Park

오 코틀린 코드에 설정이 있었군요! 자세한 설명 감사합니다. 참고해서 구현하겠습니다 :)