p6spy를 이용한 쿼리 매개변수 로그

조창훈·2023년 9월 14일
0

https://shanepark.tistory.com/415
위 글을 참조해서 설정했다.

기본적으로 DB쿼리를 볼 수 있게 설정할 때, 아래와 같은 설정을 이용한다.

# JPA 로그 설정
# 디버그 레벨로 쿼리로그를 볼 수 있게 설정
logging.level.org.hibernate.SQL=DEBUG
# 쿼리를 줄바꿈 해서 보여주는 설정
spring.jpa.properties.hibernate.format_sql=true
# 매개변수 값 보여주는 설정
logging.level.org.hibernate.orm.jdbc.bind=TRACE

하지만 위 글대로 설정하면 불편한 점이 있다.
매개변수 따로, 쿼리 따로 나온다는 것.
그래서 p6spy를 이용하는게 더 데이터를 관찰하기 편하다.

3.0.0이상버전을 이용하는 경우, p6spy 1.9.0버전을 이용하면, 마이그래이션이 적용되어있기 때문에
설치만 해도 기본적으로 쿼리는 볼 수 있다.

build.gradle에 아래왜 같이 추가한다.

// https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'

그리고 그래들 최신화를 통해서, 라이브러리를 추가한다.

그 다음, 아래와 같은 설정을 추가하면 로그는 보이기 시작한다.

위 JPA로그 설정을 지우고, 아래와 같은 설정을 추가한다.

#p6spy 로그설정
decorator.datasource.p6spy.enable-logging=true

하지만 기존 JPA로그처럼, 줄바꿈이 설정되어있지 않아서 보기 불편하다.
공식문서에 보면, 멀티라인 설정은 있지만, 구현체가 없어서 실제로 멀티라인이 적용되지 않는 모습이다.

줄바꿈 적용방법

패키지에 설정을 모아놓을 디렉터리를 작성 후, 원하는 이름으로 설정파일을 만든다.
그 뒤, 아래와 같이 작성한다.


import com.p6spy.engine.logging.Category;
import com.p6spy.engine.spy.P6SpyOptions;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import jakarta.annotation.PostConstruct;
import org.hibernate.engine.jdbc.internal.FormatStyle;
import org.springframework.context.annotation.Configuration;

import java.util.Locale;

@Configuration
public class P6SpyConfig implements MessageFormattingStrategy {

        @PostConstruct
        public void setLogMessageFormat() {
            P6SpyOptions.getActiveInstance().setLogMessageFormat(this.getClass().getName());
        }

        @Override
        public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {
            sql = formatSql(category, sql);
            return String.format("[%s] | %d ms | %s", category, elapsed, formatSql(category, sql));
        }

        private String formatSql(String category, String sql) {
            if (sql != null && !sql.trim().isEmpty() && Category.STATEMENT.getName().equals(category)) {
                String trimmedSQL = sql.trim().toLowerCase(Locale.ROOT);
                if (trimmedSQL.startsWith("create") || trimmedSQL.startsWith("alter") || trimmedSQL.startsWith("comment")) {
                    sql = FormatStyle.DDL.getFormatter().format(sql);
                } else {
                    sql = FormatStyle.BASIC.getFormatter().format(sql);
                }
                return sql;
            }
            return sql;
        }

    }

작성한 뒤, 서버를 재시작하면 아래와 같이 줄바꿈이 적용되어있는 것을 알 수 있다.

profile
초전도-개발자의 길

1개의 댓글

comment-user-thumbnail
2024년 3월 3일

개발 4년 인생
처음으로 감사의 댓글을 남겨보네요 (회원가입까지 해버림..)
감사합니다

답글 달기