Preparing / Parameters 로그를 붙여넣으면 ? 자리에 값을 채운 실행 가능한 SQL로 바꿔줍니다.
왼쪽에 로그를 붙여넣으면 파라미터가 채워진 SQL이 여기에 나옵니다.
==> Preparing: 줄과 ==> Parameters: 줄을 복사합니다. 앞의 시간·스레드·로거 이름은 지우지 않아도 됩니다.MyBatis 로그 (입력)
==> Preparing: SELECT * FROM member WHERE member_id = ? AND status = ? AND deleted_at IS ? ==> Parameters: 1024(Long), ACTIVE(String), null
변환된 SQL (결과)
SELECT * FROM member WHERE member_id = 1024 AND status = 'ACTIVE' AND deleted_at IS NULL;
| 타입 | 로그 | SQL |
|---|---|---|
| Integer, Long, BigDecimal … | 1024(Long) | 1024 |
| String | PAID(String) | 'PAID' |
| 작은따옴표 포함 | O'Brien(String) | 'O''Brien' |
| null | null | NULL |
| Boolean | true(Boolean) | TRUE (Oracle: 1) |
| Timestamp | 2026-09-01 00:00:00.0(Timestamp) | '2026-09-01 00:00:00.0' |
| Timestamp (Oracle) | 2026-09-01 00:00:00.0(Timestamp) | TO_TIMESTAMP('…', 'YYYY-MM-DD HH24:MI:SS.FF') |
| Date / LocalDate (Oracle) | 2026-09-01(LocalDate) | TO_DATE('2026-09-01', 'YYYY-MM-DD') |
MySQL·MariaDB는 문자열 안의 역슬래시(\)도 이스케이프합니다. byte[] 같은 바이너리 값은 로그에 내용이 남지 않아 경고로 알려드려요.
MyBatis가 DEBUG 레벨에서 찍는 '==> Preparing:' 줄과 바로 다음 '==> Parameters:' 줄이면 됩니다. 날짜·스레드·로거 이름 같은 앞부분은 그대로 둬도 되고, 여러 쿼리가 섞인 로그를 통째로 붙여넣어도 쿼리별로 나눠서 변환합니다.
Mapper 인터페이스 패키지의 로그 레벨을 DEBUG로 올리면 됩니다. Spring Boot라면 application.yml에 logging.level.<mapper 패키지>: DEBUG 를 추가하세요. MyBatis 설정의 logImpl을 STDOUT_LOGGING으로 두는 방법도 있습니다.
Integer·Long·BigDecimal 같은 숫자 타입은 따옴표 없이, String·Timestamp 등 나머지는 작은따옴표로 감쌉니다. null은 NULL, Boolean은 TRUE/FALSE(Oracle은 1/0)로 바뀝니다. 값 안의 작은따옴표는 ''로 이스케이프합니다.
아니요. 작은따옴표·큰따옴표·백틱 문자열과 -- , /* */ 주석 안의 ?는 건너뛰고 실제 바인딩 자리만 채웁니다.
로그가 중간에 잘렸거나, 멀티스레드 환경에서 다른 요청의 로그 줄과 섞인 경우가 대부분입니다. 같은 스레드 이름의 Preparing/Parameters 두 줄만 골라서 다시 붙여넣어 보세요. 남는 ?는 그대로 둡니다.
JSON 응답을 확인할 땐 JSON Formatter도 같이 써보세요.