본문 바로가기
오류를 개발새발

MyBatis) 동적 쿼리가 안 돌아가다? (원인은 단순한 곳에)

by 휴일이 2022. 11. 23.

 

 

MyBatis로 동적 쿼리를 추가했는데

Error로 Tomcat이 작동을 안 하는 사태가 발생했다 ㅡ.ㅡ

 

 

오류 로그

Caused by: org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [C:\IntelliJ\hi\target\hi-1.0.0-BUILD-SNAPSHOT\WEB-INF\classes\mapper\BoardMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'file [C:\IntelliJ\hi\target\hi-1.0.0-BUILD-SNAPSHOT\WEB-INF\classes\mapper\BoardMapper.xml]'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'SearchBoard'.  Cause: java.lang.ClassNotFoundException: Cannot find class: SearchBoard
	at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:523)
	at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:380)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1767)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1704)
	... 55 more
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'file [C:\IntelliJ\hi\target\hi-1.0.0-BUILD-SNAPSHOT\WEB-INF\classes\mapper\BoardMapper.xml]'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'SearchBoard'.  Cause: java.lang.ClassNotFoundException: Cannot find class: SearchBoard
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:123)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:95)
	at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:521)
	... 58 more
Caused by: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'SearchBoard'.  Cause: java.lang.ClassNotFoundException: Cannot find class: SearchBoard
	at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:118)
	at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:76)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:138)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:131)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:121)
	... 60 more
Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias 'SearchBoard'.  Cause: java.lang.ClassNotFoundException: Cannot find class: SearchBoard
	at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:120)
	at org.apache.ibatis.builder.BaseBuilder.resolveAlias(BaseBuilder.java:149)
	at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:116)
	... 64 more
Caused by: java.lang.ClassNotFoundException: Cannot find class: SearchBoard
	at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:196)
	at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:89)
	at org.apache.ibatis.io.Resources.classForName(Resources.java:261)
	at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:116)
	... 66 more

MyBatis에서 나는 오류 같았다

 

 

 

+ 동적 쿼리를 추가한 Mapper

<sql id = "selectQuery">
    SELECT no, title, content, id, view_cnt, comment_cnt, reg_date
    FROM board
</sql>

<sql id = "selectKindBoard">
    <choose>
        <when test=' option == "A" '>
            AND (title LIKE concat('%',#{keyword},'%')
            OR content LIKE concat('%',#{keyword},'%'))
        </when>
        <when test=' option == "T" '>
            AND title LIKE concat('%',#{keyword},'%')
        </when>
        <otherwise>
            AND id LIKE concat('%',#{keyword},'%')
        </otherwise>
    </choose>
</sql>

<!-- 아래 두개가 문제가 있음 -->
<select id="searchSelectPage" parameterType="SearchBoard" resultType="BoardDto">
    <include refid="selectQuery"/>
    WHERE true
    <include refid="selectKindBoard"/>
    ORDER BY reg_date DESC, no DESC
    LIMIT #{offset}, #{pageSize}
</select>

<select id="searchResultCnt" parameterType="SearchBoard" resultType="Integer">
    SELECT count(*)
    FROM board
    WHERE true
    <include refid="selectKindBoard"/>
</select>

 

 

주석을 활용한 결과

 

1) sql 쿼리들 자체는 문제가 없음

2) <include> 대신 쿼리문을 직접 넣어줘도 오류 발생

.

.

.

 

 

결론은

parameterType="SearchBoard" 의 경로 설정을 안 해줘서 나는 오류였다 ㅡ.ㅡ

mybatis-config.xml 에 SearchBoard의 typeAlias를 추가해주니 잘 돌아간다 :)

 

mybatis-config.xml

<typeAliases>
    <typeAlias alias="MemberDto" type="com.holiday.hi.domain.MemberDto"/>
    <typeAlias alias="BoardDto" type="com.holiday.hi.domain.BoardDto"/>
    <typeAlias alias="CommentDto" type="com.holiday.hi.domain.CommentDto"/>
    <typeAlias alias="SearchBoard" type="com.holiday.hi.domain.SearchBoard"/>
</typeAliases>

 

 

 

<!-- Mapper에 새로운 쿼리를 추가할 땐, parameter OR result의 Type이 경로 설정 되어있는지 확인하자 -->

728x90