JPA 쿼리 파라미터 로그 — 물음표 대신 값 보기
JPA 로그에 where name=? and age>? 처럼 물음표만 찍히고 실제 값이 안 보인다면, Spring Boot 3.x(Hibernate 6) 기준으로 로거 이름 하나만 켜면 됩니다: logging.level.org.hibernate.orm.jdbc.bind=TRACE. 예전 글에 흔히 나오는 org.hibernate.type=trace는 Hibernate 6에서는 파라미터 값을 찍지 않습니다(내부 로그만 잔뜩 나옵니다). 이 글은 Java 21 + Hibernate 6.5.3에서 직접 돌려 확인한 설정과 실제 출력, 그리고 안 나올 때 원인 3가지를 정리합니다.
1. 설정 두 줄이면 끝난다 (Spring Boot 3.x · Hibernate 6)
application.yml에 아래 두 줄을 넣습니다. SQL 문장은 org.hibernate.SQL, 바인딩되는 파라미터 값은 org.hibernate.orm.jdbc.bind가 담당합니다.
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.orm.jdbc.bind: TRACE
application.properties를 쓴다면 이렇게 씁니다.
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.orm.jdbc.bind=TRACE
2. 실제로 이렇게 찍힌다
회원 한 명을 저장하고 이름·나이로 조회했을 때의 출력입니다. (Java 21.0.4 / Hibernate 6.5.3.Final / H2 2.3.232에서 직접 실행)
DEBUG org.hibernate.SQL - insert into member (age,joinedAt,name,id) values (?,?,?,default)
TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:INTEGER) <- [33]
TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:DATE) <- [2026-07-22]
TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [홍길동]
DEBUG org.hibernate.SQL - select m1_0.id,m1_0.age,m1_0.joinedAt,m1_0.name from member m1_0 where m1_0.name=? and m1_0.age>?
TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [홍길동]
TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [20]
읽는 법은 간단합니다. (1:VARCHAR)의 1은 SQL 안 물음표의 순서, VARCHAR는 JDBC 타입, <- [홍길동]이 실제로 들어간 값입니다. 즉 첫 번째 ?에 '홍길동', 두 번째 ?에 20이 들어간 것입니다.
3. show-sql과 org.hibernate.SQL은 뭐가 다른가
둘 다 SQL을 보여주지만 나가는 통로가 다릅니다. 이 차이 때문에 "로그 파일에는 SQL이 안 남는다"는 문제가 생깁니다.
| 설정 | 출력 형태 | 특징 |
|---|---|---|
spring.jpa.show-sql=true |
Hibernate: select ... |
로거를 안 거치고 System.out으로 바로 찍는다. 시각·로그레벨이 없고 로그 파일·수집기에 안 남는다. |
logging.level.org.hibernate.SQL=DEBUG |
DEBUG org.hibernate.SQL - select ... |
정식 로거를 탄다. 시각·스레드가 붙고 로그 파일에 남는다. 이쪽을 권한다. |
실제로 show_sql만 켜고 돌리면 로그 레벨 표시 없이 Hibernate: insert into member (age,joinedAt,name,id) values (?,?,?,default) 형태로만 나옵니다. 두 개를 같이 켜면 같은 SQL이 두 번 찍히니 둘 중 하나만 쓰세요.
4. 파라미터 값이 안 나올 때 원인 3가지
① Hibernate 5 시절 로거 이름을 그대로 쓰고 있다. 가장 흔한 경우입니다. 검색하면 아직도 org.hibernate.type: trace 또는 org.hibernate.type.descriptor.sql: trace가 많이 나오는데, Hibernate 6에서 바인딩 로그는 org.hibernate.orm.jdbc.bind로 옮겨졌습니다. 실제로 Hibernate 6.5.3에서 옛 이름만 켜고 돌려 보면 JdbcTypeRegistry, BasicTypeRegistry 같은 내부 로그만 쏟아지고 binding parameter 줄은 한 줄도 안 나옵니다.
| 버전 | 파라미터 로거 이름 |
|---|---|
| Hibernate 5 (Spring Boot 2.x) | org.hibernate.type.descriptor.sql.BasicBinder |
| Hibernate 6 (Spring Boot 3.x) | org.hibernate.orm.jdbc.bind |
② 레벨을 DEBUG로 줬다. 바인딩 로그는 TRACE입니다. DEBUG까지만 열면 SQL은 보이는데 값은 안 보입니다.
③ show-sql만 켜 두었다. show-sql은 SQL 문장만 담당하고 파라미터와는 아무 관계가 없습니다. 값을 보려면 위 로거를 따로 켜야 합니다.
5. 반대로 DB에서 읽어온 값도 보고 싶다면
넣는 값이 아니라 조회 결과로 읽어온 값을 보려면 org.hibernate.orm.jdbc.extract를 켭니다. 같은 환경에서 돌려 보면 이렇게 나옵니다.
logging.level.org.hibernate.orm.jdbc.extract=TRACE
# 출력
TRACE org.hibernate.orm.jdbc.extract - extracted value (1:BIGINT) -> [1]
Hibernate 6.5.3 산출물 안에 들어 있는 org.hibernate.orm.jdbc.* 로그 카테고리는 batch, bind, extract, lob, mutation 다섯 개입니다. 배치 처리가 실제로 묶여 나가는지 볼 때는 batch를 켜면 됩니다.
6. 지연 로딩 때문에 안 보이는 쿼리도 있다
로그를 켰는데 "이 쿼리는 대체 어디서 나갔지?" 싶은 SELECT가 보인다면 지연 로딩(LAZY) 때문일 가능성이 큽니다. 반대로 트랜잭션 밖에서 프록시를 건드려 LazyInitializationException이 나는 상황도 같은 뿌리입니다. 저장할 때 예상 못 한 SELECT가 먼저 나간다면 JPA merge와 persist 차이를 함께 보면 이해가 빠릅니다.
자주 묻는 질문 (FAQ)
Q. 물음표 자리에 값이 채워진 완성된 SQL 한 줄로 보고 싶은데요?
Hibernate 기본 기능으로는 안 됩니다. SQL과 파라미터가 별도 로그로 나옵니다. 한 줄로 합쳐 보려면 p6spy 같은 JDBC 프록시 라이브러리를 따로 붙여야 합니다. 다만 의존성이 늘고 운영에 실수로 남기 쉬우니, 값만 확인하면 되는 상황이라면 위 로거 설정으로 충분합니다.
Q. spring.jpa.properties.hibernate.format_sql=true도 같이 쓰나요?
써도 됩니다. SQL을 여러 줄로 들여쓰기해 읽기 쉽게 만들어 줍니다. 파라미터 값 출력과는 별개 설정이라 서로 영향을 주지 않습니다.
Q. Spring Boot 2.x(Hibernate 5)를 쓰고 있습니다.
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE를 쓰면 됩니다. Boot 3.x로 올릴 때 이 줄이 조용히 동작을 멈추므로 org.hibernate.orm.jdbc.bind로 바꿔 주세요.
마무리
정리하면 Spring Boot 3.x(Hibernate 6)에서는 org.hibernate.SQL=DEBUG로 SQL을, org.hibernate.orm.jdbc.bind=TRACE로 파라미터 값을 봅니다. 값이 안 보인다면 대개 Hibernate 5 시절 로거 이름을 쓰고 있거나, 레벨을 TRACE가 아닌 DEBUG로 준 경우입니다. 로거 이름은 Hibernate 버전에 묶여 있으니, 버전을 올릴 때 이 설정도 함께 점검하세요. 그리고 운영 프로필에서는 꼭 꺼 두시기 바랍니다.
📚 참고 출처 (2026년 7월 22일 확인)
· Hibernate ORM 6.5.3.Final 공식 산출물(hibernate-core-6.5.3.Final.jar) 내 로그 카테고리 확인
· Hibernate ORM 6.5 User Guide
· Spring Boot Reference — Working with SQL Databases
본문 로그는 Java 21.0.4 + Hibernate 6.5.3.Final + H2 2.3.232 환경에서 직접 실행해 얻은 출력입니다.

COMMENTS