← 개발일지

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 테스트가 훨씬 쉬워집니다.