MyBatis #{param} IntelliJ에서 실행 안 될 때 해결법
문제 상황
MyBatis에서 작성한 SQL을 IntelliJ Database Console에서 실행하면 다음과 같은 문제가 발생합니다.
INSERT INTO TB_USER (USER_ID)
VALUES (#{userId})
이 SQL은 IntelliJ에서 실행되지 않습니다.
환경
- MyBatis 기반 백엔드
- IntelliJ Database Console 사용
- SQL 직접 테스트 필요
원인: #{}는 SQL이 아니다
핵심은 이것입니다.
#{}는 SQL 문법이 아니라 MyBatis 파라미터 바인딩 문법입니다.
MyBatis는 실행 시 아래처럼 변환합니다.
-- 실제 DB에 전달되는 SQL
INSERT INTO TB_USER (USER_ID)
VALUES (?)
그리고 JDBC가 값 바인딩을 수행합니다.
? = 'A123'
즉, IntelliJ는 MyBatis를 모르기 때문에 #{}를 해석할 수 없습니다.
해결 방법
1. ?로 변환 (가장 권장)
INSERT INTO TB_USER (USER_ID)
VALUES (?);
실행 시 IntelliJ가 값 입력을 요청합니다.
이 방식은 MyBatis가 실제로 DB에 보내는 SQL과 동일합니다.
2. :param 사용 (대안)
VALUES (:userId)
IntelliJ에서 지원하는 Named Parameter 방식입니다.
다만 MyBatis 구조와는 다릅니다.
3. 직접 값 입력 (비추천)
VALUES ('A123')
빠르지만 다음 문제가 있습니다.
- 타입 오류 가능
- 실제 실행 구조와 다름
핵심 정리
#{}는 MyBatis 전용 문법- 실제 SQL은
?형태로 실행됨 - IntelliJ에서는
?로 바꿔야 실행 가능 - 디버깅 정확도를 위해
?사용 권장
Takeaway
DB에서 실행되는 SQL은 항상
?기반이다.
이 구조를 이해하면 MyBatis 디버깅과 SQL 테스트가 훨씬 쉬워집니다.