Server/SpringBoot

[SpringBoot] MYBATIS MySql LIKE 동적쿼리 에러

100winone 2019. 12. 10. 17:55

** 주의 **

MySql myBatis를 사용할 때 동적 쿼리이다.

iBatis나 oracle, MSSQL은 쿼리를 다르게 짜주어야한다.

 

많은 사람들이 이 부분에서 삽질을 했다고 하는데..나 또한 여기서 오랜시간을 들여버렸다...(날렸다고 생각은 안한다...이렇게 배우는 거지......)

모르면 이렇게 무식하게 고생하는 watermelon(수박)에......

 

아무튼 거두절미하고 .. 

처음에는 동적쿼리에서 LIKE 는 다르게 사용해야 하는지 모르고 일반 쿼리문 처럼 SQL을 짰다가 동작하지 않아서 많은 검색들을 해보았다. 사스가 stackOverflow...에서 발견한 것이 

AND 컬럼명 LIKE CONCAT('%',#{동적쿼리값},'%')

바로 이런식으로 넣어 주어야 한다는 것!!!! 그런데 나는 여기서 또 난관에 부딪힌다..]

고쳐주었는데도 null pointer에러가 계속해서 났다. 이유가 무엇일까......한참을 고민해보았다...

 

	    WHERE 1 = 1
        <if test="optionId=='id2'">
	    	AND divcd LIKE CONCAT('%',#{valueById},'%')
	    </if>
	    <if test="optionId=='id3'">
	    	AND subject LIKE CONCAT('%',#{valueById},'%')
	    </if>
	    <if test="optionId=='id4'">
	    	AND content LIKE CONCAT('%',#{valueById},'%')
	    </if>

처음 내 쿼리는 이런식으로 짜여져 있었다. 문제가 무엇인지도 모른채.....

 

맨 처음 (<if태그> 따옴표들 위치를 의심하긴했었지만 고칠 생각을 하지 않았었다. 왜냐하면 .. MyBatis 공식홈페이지? 같이 생긴 곳에서 ,, 나와있는 따옴표의 위치들과 내 코드가 일치했었기 때문.

내말인 즉슨 <if test="optionId=='id2'"> 이런 식으로 (" ' ' ") 이렇게 큰 따옴표 안에 작은 따옴표가 있었다.

ex)

그리고 내가 참조했었던..사이트...

 

https://mybatis.org/mybatis-3/ko/dynamic-sql.html

 

MyBatis – 마이바티스 3 | 동적 SQL

동적 SQL 마이바티스의 가장 강력한 기능 중 하나는 동적 SQL을 처리하는 방법이다. JDBC나 다른 유사한 프레임워크를 사용해본 경험이 있다면 동적으로 SQL 을 구성하는 것이 얼마나 힘든 작업인지 이해할 것이다. 간혹 공백이나 콤마를 붙이는 것을 잊어본 적도 있을 것이다. 동적 SQL 은 그만큼 어려운 것이다. 동적 SQL 을 사용하는 것은 결코 파티가 될 수 없을 것이다. 마이바티스는 강력한 동적 SQL 언어로 이 상황은 개선한다. 동적 SQL 엘

mybatis.org

 

하지만 이 코드를 반대로 (' " " ') 이런식, 즉 작은따옴표 안에 큰따옴표로 설정해 주었더니 쿼리가 잘 동작해서 DB값을 잘 가지고 왔다!!,,, 허무함을 느낌과 동시에 성취감을 느꼈다.

구글은 엄청난 방대한 정보를 갖고있는 유익한 플랫폼이다. 하지만 무조건적인 정답은 될 수 없고 본인이 적당히 거를줄 아는 능력을 갖고, 정보를 사용해야 함을 또 다시 느끼는 계기가 되었다.

AND divcd LIKE CONCAT('%',#{valueById},'%') 
// 수정한 쿼리