| 항목 | 내용 |
|---|---|
| 문서 버전 | 1.0 |
| 작성일 | 2026-04-15 |
| P6Spy 버전 | 3.9.1 |
| 베이스 이미지 | Rocky Linux 9.x |
| 대상 환경 | Kubernetes 1.28+ |
P6Spy는 JDBC 수준에서 데이터베이스 활동을 투명하게 가로채어 로깅하는 오픈소스 프레임워크이다. 애플리케이션 코드를 변경하지 않고도 모든 SQL 쿼리, 실행 시간, 바인드 변수 값을 기록할 수 있다.
P6Spy는 JDBC 4.0 API를 구현한 드라이버 래퍼(Wrapper)로 동작한다. 실제 JDBC 드라이버를 프록시하여 모든 SQL 활동을 가로챈다.
[Application] → [P6Spy Driver] → [Real JDBC Driver] → [Database]
↓
[Log Output]
(File / Stdout / SLF4J)
JDBC URL 변환 예시:
| 변환 전 | 변환 후 |
|---|---|
jdbc:mysql://host/db |
jdbc:p6spy:mysql://host/db |
jdbc:postgresql://host/db |
jdbc:p6spy:postgresql://host/db |
jdbc:oracle:thin:@host:1521:sid |
jdbc:p6spy:oracle:thin:@host:1521:sid |
중요: P6Spy는 독립 서버가 아닌 JDBC 드라이버 래퍼이다. 따라서 Java 애플리케이션 내부에 라이브러리로 포함되어야 한다. Kubernetes에서는 P6Spy가 포함된 Java 애플리케이션을 컨테이너로 배포하는 형태가 된다.
┌─────────────────────────────────────────────────────────┐
│ Kubernetes Cluster │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ Pod: p6spy-app │ │
│ │ ┌───────────────────────────────────┐ │ │
│ │ │ Container: app │ │ │
│ │ │ ┌─────────────┐ │ │ │
│ │ │ │ Java App │ │ │ │
│ │ │ │ + P6Spy JAR │ │ │ │
│ │ │ │ + JDBC Drv │ │ │ │
│ │ │ └──────┬──────┘ │ │ │
│ │ │ │ spy.log │ │ │
│ │ │ ▼ │ │ │
│ │ │ /var/log/p6spy/spy.log │ │ │
│ │ │ (PVC or stdout) │ │ │
│ │ └───────────────────────────────────┘ │ │
│ │ │ │
│ │ ConfigMap: spy.properties │ │
│ │ Secret: ${REDACTED} │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ Database Server │ │
│ │ (Service/외부) │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
┌──────────────────┐ JDBC (p6spy wrapper)
│ DBeaver Client │ ─────────────────────────→ [Database]
│ + p6spy.jar │ ↓
│ + spy.properties│ Local spy.log
│ + DB Driver.jar │
└──────────────────┘
p6spy-app/
├── Dockerfile
├── app/
│ └── your-application.jar
├── config/
│ └── spy.properties
├── lib/
│ ├── p6spy-3.9.1.jar
│ └── mysql-connector-j-8.x.jar
└── scripts/
└── entrypoint.sh
###############################################################################
# P6Spy Application Image - Rocky Linux 9.x 기반
###############################################################################
FROM rockylinux:9-minimal
LABEL maintainer="your-team"
LABEL description="P6Spy enabled Java Application on Rocky Linux 9"
# ── 1) 시스템 패키지 설치 ──
RUN microdnf install -y \
java-17-openjdk-headless \
findutils \
shadow-utils \
tzdata \
&& microdnf clean all
# ── 2) 타임존 설정 ──
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# ── 3) 애플리케이션 사용자 생성 ──
RUN groupadd -r appuser && useradd -r -g appuser -d /opt/app -s /sbin/nologin appuser
# ── 4) 디렉터리 구조 생성 ──
RUN mkdir -p /opt/app/lib \
/opt/app/config \
/var/log/p6spy \
&& chown -R appuser:appuser /opt/app /var/log/p6spy
# ── 5) P6Spy JAR 복사 ──
COPY lib/p6spy-3.9.1.jar /opt/app/lib/
COPY lib/mysql-connector-j-*.jar /opt/app/lib/
# ── 6) 기본 spy.properties 복사 ──
COPY config/spy.properties /opt/app/config/spy.properties
# ── 7) 애플리케이션 JAR 복사 ──
COPY app/your-application.jar /opt/app/app.jar
# ── 8) 시작 스크립트 복사 ──
COPY scripts/entrypoint.sh /opt/app/entrypoint.sh
RUN chmod +x /opt/app/entrypoint.sh
# ── 9) 실행 사용자 전환 ──
USER appuser
WORKDIR /opt/app
# ── 10) 환경 변수 기본값 ──
ENV JAVA_OPTS="-Xms256m -Xmx512m" \
SPY_PROPERTIES="/opt/app/config/spy.properties" \
LOG_DIR="/var/log/p6spy"
# ── 11) 헬스체크 ──
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD curl -sf http://localhost:8080/actuator/health || exit 1
EXPOSE 8080
ENTRYPOINT ["/opt/app/entrypoint.sh"]
#!/bin/bash
set -euo pipefail
echo "========================================"
echo " P6Spy Application Container Starting"
echo " Timezone : $(date +%Z)"
echo " spy.properties : ${SPY_PROPERTIES}"
echo " Log Directory : ${LOG_DIR}"
echo "========================================"
exec java \
${JAVA_OPTS} \
-Dspy.properties="${SPY_PROPERTIES}" \
-cp "/opt/app/lib/*:/opt/app/app.jar" \
-jar /opt/app/app.jar \
"$@"
# 이미지 빌드
docker build -t your-registry.example.com/p6spy-app:1.0.0 .
# (선택) 로컬 테스트
docker run --rm -p 8080:8080 \
-e JAVA_OPTS="-Xms128m -Xmx256m" \
your-registry.example.com/p6spy-app:1.0.0
# 레지스트리 푸시
docker push your-registry.example.com/p6spy-app:1.0.0
별도 JAR 복사 대신 빌드 도구로 의존성을 관리할 수도 있다.
Maven (pom.xml):
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
Gradle (build.gradle):
implementation 'p6spy:p6spy:3.9.1'
Spring Boot 자동 설정 (권장):
<dependency>
<groupId>com.github.gavlyukovskiy</groupId>
<artifactId>p6spy-spring-boot-starter</artifactId>
<version>1.9.1</version>
</dependency>
# 00-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: p6spy-app
labels:
app.kubernetes.io/part-of: p6spy-monitoring
# 01-configmap-spy-properties.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: p6spy-config
namespace: p6spy-app
labels:
app: p6spy-app
data:
spy.properties: |
##################################################################
# P6Spy 설정 파일 - Kubernetes 환경
##################################################################
# ── 모듈 설정 ──
modulelist=com.p6spy.engine.spy.P6SpyFactory,com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# ── 드라이버 목록 ──
driverlist=com.mysql.cj.jdbc.Driver
# ── 로그 출력 방식 ──
appender=com.p6spy.engine.spy.appender.StdoutLogger
# ── 로그 메시지 포맷 ──
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(currentTime)|%(executionTime)ms|%(category)|conn%(connectionId)|%(sqlSingleLine)
# ── 날짜 포맷 ──
dateformat=yyyy-MM-dd HH:mm:ss.SSS
# ── 로깅 필터 ──
excludecategories=info,debug,result,resultset
excludebinary=true
# ── 슬로우 쿼리 감지 ──
outagedetection=true
outagedetectioninterval=5
# ── 실행 임계값 ──
executionThreshold=0
# ── 스택 트레이스 ──
stacktrace=false
# ── 프로퍼티 리로드 ──
reloadproperties=true
reloadpropertiesinterval=60
# ── JMX ──
jmx=true
jmxPrefix=com.p6spy
# 02-configmap-app.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: p6spy-app
data:
application.yaml: |
spring:
datasource:
url: jdbc:p6spy:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}?useSSL=true&serverTimezone=Asia/Seoul
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
server:
port: 8080
logging:
level:
com.p6spy: INFO
# 03-secret-db.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
namespace: p6spy-app
type: Opaque
stringData:
DB_HOST: "your-db-host.example.com"
DB_PORT: "3306"
DB_NAME: "your_database"
DB_USERNAME: "app_user"
DB_PASSWORD: "CHANGE_ME_TO_REAL_PASSWORD"
보안 주의: 실제 환경에서는
stringData대신data(Base64 인코딩) 를 사용하거나, External Secrets Operator, Vault 등을 통해 시크릿을 관리해야 한다.
# 04-pvc-logs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: p6spy-logs-pvc
namespace: p6spy-app
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard
resources:
requests:
storage: 5Gi
# 05-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: p6spy-app
namespace: p6spy-app
labels:
app: p6spy-app
spec:
replicas: 2
selector:
matchLabels:
app: p6spy-app
template:
metadata:
labels:
app: p6spy-app
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
containers:
- name: app
image: your-registry.example.com/p6spy-app:1.0.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: http
protocol: TCP
env:
- name: JAVA_OPTS
value: "-Xms256m -Xmx512m -Dspy.properties=/opt/app/config/spy.properties"
- name: SPY_PROPERTIES
value: "/opt/app/config/spy.properties"
- name: DB_HOST
valueFrom:
secretKeyRef:
name: db-credentials
key: DB_HOST
- name: DB_PORT
valueFrom:
secretKeyRef:
name: db-credentials
key: DB_PORT
- name: DB_NAME
valueFrom:
secretKeyRef:
name: db-credentials
key: DB_NAME
- name: SPRING_DATASOURCE_USERNAME
valueFrom:
secretKeyRef:
name: db-credentials
key: DB_USERNAME
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: DB_PASSWORD
volumeMounts:
- name: p6spy-config
mountPath: /opt/app/config/spy.properties
subPath: spy.properties
readOnly: true
- name: app-config
mountPath: /opt/app/config/application.yaml
subPath: application.yaml
readOnly: true
resources:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 60
periodSeconds: 30
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
volumes:
- name: p6spy-config
configMap:
name: p6spy-config
- name: app-config
configMap:
name: app-config
# 06-service.yaml
apiVersion: v1
kind: Service
metadata:
name: p6spy-app-svc
namespace: p6spy-app
spec:
selector:
app: p6spy-app
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
type: ClusterIP
kubectl apply -f 00-namespace.yaml
kubectl apply -f 01-configmap-spy-properties.yaml
kubectl apply -f 02-configmap-app.yaml
kubectl apply -f 03-secret-db.yaml
kubectl apply -f 05-deployment.yaml
kubectl apply -f 06-service.yaml
# 배포 확인
kubectl -n p6spy-app get pods
kubectl -n p6spy-app get svc
modulelist)| 모듈 | 설명 |
|---|---|
P6SpyFactory |
코어 모듈 (비활성화 불가) |
P6LogFactory |
SQL 로깅 모듈 |
P6OutageFactory |
슬로우 쿼리 / 장애 감지 모듈 |
modulelist=com.p6spy.engine.spy.P6SpyFactory,com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
driverlist)프록시할 실제 JDBC 드라이버를 등록한다. 복수 드라이버는 쉼표로 구분한다.
# 단일 드라이버
driverlist=com.mysql.cj.jdbc.Driver
# 복수 드라이버
driverlist=com.mysql.cj.jdbc.Driver,org.postgresql.Driver,oracle.jdbc.OracleDriver
참고: JDBC 4.0을 지원하는 드라이버는 DriverManager에 자동 등록되므로, DataSource 방식이 아닌 경우
driverlist를 비워둘 수 있다.
appender)| Appender | 클래스명 | 용도 |
|---|---|---|
| 표준 출력 | com.p6spy.engine.spy.appender.StdoutLogger |
K8s 환경 권장 (kubectl logs 호환) |
| 파일 출력 | com.p6spy.engine.spy.appender.FileLogger |
로그 파일 보관 필요 시 |
| SLF4J 연동 | com.p6spy.engine.spy.appender.Slf4JLogger |
Logback/Log4j2 통합 |
Kubernetes 환경에서는 StdoutLogger가 권장된다. stdout으로 출력된 로그는 kubectl logs로 직접 확인할 수 있고, EFK (Elasticsearch-Fluentd-Kibana) 등 중앙 로깅 시스템과 자연스럽게 연동된다.
CustomLineFormat 플레이스홀더:
| 플레이스홀더 | 설명 |
|---|---|
%(connectionId) |
커넥션 ID |
%(currentTime) |
현재 시간 (밀리초 또는 dateformat 적용) |
%(executionTime) |
실행 시간 (밀리초) |
%(category) |
카테고리 (statement, commit, rollback 등) |
%(effectiveSql) |
드라이버에 제출된 원본 SQL |
%(effectiveSqlSingleLine) |
원본 SQL (개행 제거) |
%(sql) |
바인드 변수가 실제 값으로 치환된 SQL |
%(sqlSingleLine) |
바인드 변수 치환 SQL (개행 제거) |
%(url) |
데이터베이스 URL |
권장 설정 예시:
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(currentTime)|%(executionTime)ms|%(category)|conn%(connectionId)|%(sqlSingleLine)
dateformat=yyyy-MM-dd HH:mm:ss.SSS
출력 예시:
2026-04-15 14:23:45.123|12ms|statement|conn5|SELECT * FROM users WHERE id = 42
2026-04-15 14:23:45.200|3ms|commit|conn5|
# 카테고리 제외 (불필요한 로그 줄이기)
excludecategories=info,debug,result,resultset
# 특정 테이블만 로깅
include=users,orders,payments
# 특정 테이블 제외
exclude=audit_log,session_store
# 정규식 필터 (filter=true 필수)
filter=true
sqlexpression=^(?!SELECT 1 FROM DUAL).*$
# 실행 시간 임계값 (ms) - 이 값 이상인 쿼리만 로깅
executionThreshold=100
# 바이너리 데이터 로깅 제외
excludebinary=true
# 모듈 활성화 필요
modulelist=...,com.p6spy.engine.outage.P6OutageFactory
# 장애 감지 활성화
outagedetection=true
# 감지 간격 (초) - 이 시간 이상 걸리는 쿼리를 장애로 간주
outagedetectioninterval=5
기존 JDBC URL에 p6spy: 를 삽입한다.
# 변경 전
spring.datasource.url=jdbc:mysql://db-host:3306/mydb
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 변경 후
spring.datasource.url=jdbc:p6spy:mysql://db-host:3306/mydb
spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver
import com.p6spy.engine.spy.P6DataSource;
// 기존 DataSource를 P6DataSource로 래핑
DataSource realDataSource = createRealDataSource();
DataSource p6DataSource = new P6DataSource(realDataSource);
p6spy-spring-boot-starter를 사용하면 설정만으로 자동 적용된다.
# application.yaml
decorator:
datasource:
p6spy:
enable-logging: true
log-format: "%(executionTime)ms | %(sqlSingleLine)"
reloadproperties=true
reloadpropertiesinterval=60 # 60초마다 설정 파일 재로드
Kubernetes에서 ConfigMap을 업데이트하면, 마운트된 파일이 자동 갱신된다 (일반적으로 1~2분 소요). reloadproperties=true 설정과 결합하면 Pod 재시작 없이 P6Spy 설정을 변경할 수 있다.
# ConfigMap 업데이트 후 자동 반영
kubectl -n p6spy-app edit configmap p6spy-config
주의:
reloadproperties는driverlist등 드라이버 관련 설정은 리로드하지 않는다. 드라이버 변경 시에는 Pod 재시작이 필요하다.
실시간 로그 스트리밍:
# 단일 Pod 로그 조회
kubectl -n p6spy-app logs -f deployment/p6spy-app
# 특정 Pod 로그 조회
kubectl -n p6spy-app logs -f pod/p6spy-app-xxxxx-yyyyy
# 최근 100줄만 조회
kubectl -n p6spy-app logs --tail=100 deployment/p6spy-app
# 최근 1시간 이내 로그
kubectl -n p6spy-app logs --since=1h deployment/p6spy-app
SQL 필터링 (grep 활용):
# SELECT 쿼리만 필터링
kubectl -n p6spy-app logs deployment/p6spy-app | grep "|statement|" | grep -i "SELECT"
# 슬로우 쿼리 (100ms 이상) 필터링
kubectl -n p6spy-app logs deployment/p6spy-app | awk -F'|' '$2+0 >= 100'
# 특정 테이블 관련 쿼리
kubectl -n p6spy-app logs deployment/p6spy-app | grep -i "users"
# Pod 내부 접속
kubectl -n p6spy-app exec -it deployment/p6spy-app -- bash
# 로그 파일 확인
tail -f /var/log/p6spy/spy.log
# 슬로우 쿼리 추출
awk -F'|' '$2+0 >= 100' /var/log/p6spy/spy.log
StdoutLogger 사용 시 컨테이너 stdout은 Kubernetes 노드의 로그 파일로 저장되며, Fluentd/Fluent Bit 등으로 수집할 수 있다.
Fluent Bit 파서 설정 예시:
[PARSER]
Name p6spy
Format regex
Regex ^(?<timestamp>[^|]+)\|(?<exec_time>[^|]+)\|(?<category>[^|]+)\|(?<connection>[^|]+)\|(?<sql>.*)$
Time_Key timestamp
Time_Format %Y-%m-%d %H:%M:%S.%L
spy.properties:
appender=com.p6spy.engine.spy.appender.Slf4JLogger
logback-spring.xml:
<configuration>
<appender name="P6SPY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/p6spy/sql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/p6spy/sql.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<logger name="p6spy" level="INFO" additivity="false">
<appender-ref ref="P6SPY_FILE" />
</logger>
</configuration>
#!/bin/bash
# slow-query-monitor.sh
# 사용법: ./slow-query-monitor.sh [임계값ms] [namespace]
THRESHOLD=${1:-100}
NAMESPACE=${2:-p6spy-app}
echo "=== 슬로우 쿼리 모니터링 (임계값: ${THRESHOLD}ms) ==="
echo "=== Namespace: ${NAMESPACE} ==="
echo ""
kubectl -n ${NAMESPACE} logs -f deployment/p6spy-app | while IFS='|' read -r timestamp exec_time category conn sql; do
ms=$(echo "$exec_time" | grep -oP '\d+')
if [ -n "$ms" ] && [ "$ms" -ge "${THRESHOLD}" ]; then
echo "[SLOW] ${timestamp} | ${exec_time} | ${conn}"
echo " SQL: ${sql}"
echo ""
fi
done
DBeaver에서 P6Spy를 사용하면 GUI 클라이언트에서 실행하는 모든 SQL 쿼리를 로컬 파일에 기록할 수 있다. 이는 개발/디버깅 시 쿼리 성능 분석에 유용하다.
참고: DBeaver에서의 P6Spy 사용은 Kubernetes 배포와 별개로, DBeaver 클라이언트 로컬에서 P6Spy 드라이버를 사용하는 것이다.
다음 JAR 파일을 로컬에 다운로드한다.
| 파일 | 다운로드 URL |
|---|---|
| p6spy-3.9.1.jar | https://repo1.maven.org/maven2/p6spy/p6spy/3.9.1/p6spy-3.9.1.jar |
| 실제 DB 드라이버 JAR | 각 DB 벤더 사이트 또는 Maven Central |
Step 1: Driver Manager 열기
메뉴: 데이터베이스(Database) → 드라이버 관리자(Driver Manager) → 새로 만들기(New)
Step 2: 드라이버 정보 입력
| 필드 | 값 |
|---|---|
| Driver Name | P6Spy MySQL (또는 원하는 이름) |
| Driver Type | Generic |
| Class Name | com.p6spy.engine.spy.P6SpyDriver |
| URL Template | jdbc:p6spy:mysql://{host}:{port}/{database} |
| Default Port | 3306 (DB에 맞게 변경) |
다른 DB의 URL Template 예시:
jdbc:p6spy:postgresql://{host}:{port}/{database}jdbc:p6spy:oracle:thin::{port}:{server}@jdbc:p6spy:mariadb://{host}:{port}/{database}Step 3: 라이브러리(Libraries) 탭 설정
파일 추가(Add File) 클릭p6spy-3.9.1.jar 파일 선택파일 추가(Add File) 클릭mysql-connector-j-8.x.jar)클래스 찾기(Find Class) 클릭com.p6spy.engine.spy.P6SpyDriver 선택확인(OK) 클릭DBeaver가 실행되는 디렉터리 또는 클래스패스에 spy.properties 파일을 생성한다.
파일 위치 (택 1):
C:\DBeaver\spy.properties 또는 /opt/dbeaver/spy.properties)-Dspy.properties=<path> JVM 인자 지정DBeaver에 JVM 인자 추가 (dbeaver.ini):
# dbeaver.ini 파일 끝에 추가
-Dspy.properties=/path/to/spy.properties
spy.properties 내용 (DBeaver용):
# DBeaver용 P6Spy 설정
driverlist=com.mysql.cj.jdbc.Driver
appender=com.p6spy.engine.spy.appender.FileLogger
logfile=C:/logs/dbeaver-spy.log
append=true
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(currentTime)|%(executionTime)ms|%(category)|%(sqlSingleLine)
dateformat=yyyy-MM-dd HH:mm:ss.SSS
excludecategories=info,debug,result,resultset
excludebinary=true
데이터베이스(Database) → 새 데이터베이스 연결(New Database Connection)P6Spy MySQL 드라이버 선택| 필드 | 값 |
|---|---|
| Host | DB 서버 주소 |
| Port | DB 포트 (예: 3306) |
| Database | 데이터베이스 이름 |
| Username | DB 사용자 |
| Password | DB 비밀번호 |
연결 테스트(Test Connection) 클릭하여 접속 확인완료(Finish) 클릭DBeaver에서 쿼리를 실행하면 spy.properties에 지정된 로그 파일에 다음과 같은 형태로 기록된다:
2026-04-15 14:30:12.456|5ms|statement|SELECT * FROM users WHERE id = 1
2026-04-15 14:30:13.789|120ms|statement|SELECT o.* FROM orders o JOIN users u ON o.user_id = u.id WHERE u.email LIKE '%@example.com'
2026-04-15 14:30:14.001|2ms|commit|
이미 사용 중인 DBeaver 커넥션이 있을 경우:
연결 편집(Edit Connection) → 드라이버 속성(Driver Properties) 탭라이브러리 편집(Edit Driver) → 라이브러리(Libraries) 탭p6spy-3.9.1.jar 추가jdbc:p6spy:mysql://... 형식으로 변경spy.properties 배치Kubernetes 클러스터 내부 DB에 DBeaver로 접근하려면 port-forward를 사용한다.
# DB 서비스를 로컬 포트로 포워딩
kubectl -n database port-forward svc/mysql-service 3307:3306
# 이후 DBeaver에서 localhost:3307로 접속
DBeaver JDBC URL: jdbc:p6spy:mysql://localhost:3307/mydb
| 자료 | URL |
|---|---|
| P6Spy 공식 문서 | https://p6spy.readthedocs.io/ |
| P6Spy GitHub | https://github.com/p6spy/p6spy |
| P6Spy 설치 가이드 | https://p6spy.readthedocs.io/en/latest/install.html |
| P6Spy 설정 레퍼런스 | https://p6spy.readthedocs.io/en/latest/configandusage.html |
| P6Spy 통합 가이드 | https://p6spy.readthedocs.io/en/latest/integration.html |
| Maven Central (3.9.1) | https://central.sonatype.com/artifact/p6spy/p6spy |
| 자료 | URL |
|---|---|
| Baeldung - P6Spy SQL Logging | https://www.baeldung.com/java-p6spy-intercept-sql-logging |
| Spring Boot 3 + P6Spy | https://ozkanpakdil.github.io/posts/my_collections/2023/2023-04-08-springboot-3-hibernate-6-print-sql-with-p6spy/ |
| Curious Programmer - p6spy | https://curiousprogrammer.net/posts/2022-09-29-spying-on-your-database |
| MyBatis-Plus P6Spy 통합 | https://baomidou.com/en/guides/p6spy/ |
| 자료 | URL |
|---|---|
| DBeaver 드라이버 관리 | https://dbeaver.com/docs/dbeaver/Driver-Manager/ |
| DBeaver 커스텀 드라이버 추가 (Wiki) | https://github.com/dbeaver/dbeaver/wiki/Database-drivers |
| 프로젝트 | 설명 | URL |
|---|---|---|
| spring-boot-data-source-decorator | Spring Boot P6Spy 자동 설정 | https://github.com/gavlyukovskiy/spring-boot-data-source-decorator |
| p6spy-spring-boot-starter | Spring Boot Starter | 위 프로젝트에 포함 |
최신 버전 3.9.1 — 2026-09-20 확인. https://github.com/p6spy/p6spy/releases ↩︎