반응형
스프링(Spring)에서 톰캣 WAS를 실행할 때, 간혹가다가 Could not find SQL statement to include with refid 'TEST'라는 에러 메시지를 발견하곤 한다. 이 문제의 원인은 우리가 xml에서 refid를 사용하는 경우가 있는데, 거의 대부분의 문제는 xml에서 선언하는 위치에 따라 문제가 발생한다.
목차
1. 원인 및 해결방법
1. 원인 및 해결방법
우리가 xml에서 IBatis나 MyBatis를 사용한다고 가정을 하고, refid 쿼리를 아래와 같이 사용한다.
<select id="TEST01_LIST" parameterClass="Map" resultClass="StringMap">
<include refid="TEST01_SELECT" />
WHERE 1 = 1
<include refid="TEST01_WHERE" />
ORDER BY 1
</select>
위와 같이 refid를 사용하면 따로 <sql> 태그를 사용하여 refid에 해당하는 쿼리를 작성해야 한다.
<sql id="TEST01_SELECT">
SELECT NAME
, ID
FROM TEST
</sql>
<sql id="TEST01_WHERE">
AND NAME = #{NAME}
</sql>
이렇게 작성하는 경우에는 에러가 발생한다.
작성 방법은 정확하다. 근데, 톰캣 WAS를 구동할 때, XML은 위에서부터 읽어 내려오기 때문에 맨 위에서의 TEST01_LIST라는 <SELECT> 태그 위에 TEST01_SELECT와 TEST01_WHERE SQL 태그를 먼저 선언해야 SELECT 태그를 읽어올 수 있다.
즉, 아래와 같이 순서를 바꿔야 한다.
<sql id="TEST01_SELECT">
SELECT NAME
, ID
FROM TEST
</sql>
<sql id="TEST01_WHERE">
AND NAME = #{NAME}
</sql>
<select id="TEST01_LIST" parameterClass="Map" resultClass="StringMap">
<include refid="TEST01_SELECT" />
WHERE 1 = 1
<include refid="TEST01_WHERE" />
ORDER BY 1
</select>
이렇게 순서대로 선언을 해야 TEST01 순서에 TEST01_SELECT와 TEST01_WHERE을 읽어올 수 있고, 문제를 해결할 수 있다.
반응형
최근댓글