개발자
spring boot 4 에서 웹개발프로젝트를 진행중입니다.. jsp페이지에서 받아온 searchText값을 쿼리문으로 비교 후 foodinfolist를 반환해주는데 sql developer에서는 SELECT * FROM foodinfolist WHERE food_name LIKE '%' || '치킨' || '%'; 해당 코드가 정상동작 돼서 잘 검색하지만 mapper.xml에서 <mapper namespace="com.springproj.dietwebservice.repository.IFoodInfoDAO"> <select id="findfoodinfo" parameterType="java.lang.String" resultType="com.springproj.dietwebservice.domain.FoodInfoVO">> <![CDATA[ SELECT * FROM foodinfolist WHERE food_name LIKE '%' || #{searchText} || '%' ]]> </select> </mapper> 해당 코드를 실행하면 sql문이 부적합합니다 라고 에러가 발생합니다.. 뭐가 문제인지 모르겠습니다.. searchText: 치킨 으로 데이터도 잘 담겨오는데.. [2m2024-01-31T16:24:22.500+09:00[0;39m [31mERROR[0;39m [35m8208[0;39m [2m---[0;39m [2m[nio-8090-exec-9][0;39m [2m[0;39m[36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m [2m:[0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00900: SQL 문이 부적합합니다 선배님들 조언부탁드립니다..
답변 4
완전히 같은 텍스트인데 문제가 있다면 특수문자 인코딩 문제라던지 세미콜론같은 부분을 의심 해 보시기 바랍니다. 디버깅의 기본은 파티셔닝 입니다. 쿼리를 좀 더 간단하게 만들어서 (특수문자등 제외) 그 상태에서는 돌아가는지 확인 해보는 등 문제가 있을 수 있는곳과 문제가 없는곳을 구분지어가면서 문제가 있을 수 있는 영역을 점점 좁혀가면서 디버깅 해 보세요
김태현
작성자
서울it아카데미 컴퓨터정보전자과 • 2024년 01월 31일
답변 감사합니다 조언 주신대로 한번 찾아보겠습니다!!
<mapper namespace="com.springproj.dietwebservice.repository.IFoodInfoDAO"> <select id="findfoodinfo" parameterType="java.lang.String" resultType="com.springproj.dietwebservice.domain.FoodInfoVO"> SELECT * FROM foodinfolist WHERE food_name LIKE '%' || #{searchText} || '%' </select> </mapper> 이렇게 수정했는데 정상작동 됩니다.. 답변 감사합니다..
CDATA 는 mybatis 에서 비교연산자( > 혹은 < )를 사용할 경우 xml 문법이 새로 열리거나 닫히는 문제때문에 보통 사용합니다. 그래서 비교연산자를 이용하는 경우가 아니르면 chatGpt 가 달아놓은 답변처럼 concat 함수를 사용해서 검색할 문자열을 만들면 됩니다. 그 외엔 sql developer 등의 툴에서 동작하는 쿼리를 거의 그대로 사용 가능합니다. 다만 먼저 말씀드린 경우처럼 비교연산자를 써야하는데 CDATA 문법이 번거롭고 가독성이 떨어질 경우를 대비해 mybatis에서는 >(>) <(<) 로 치환해서 사용 가능합니다.
김태현
작성자
서울it아카데미 컴퓨터정보전자과 • 2024년 02월 12일
JPA도 교육했습니다! 다만 팀프로젝트에서 선택을 mybatis로 진행했습니다!! 추후 개인프로젝트때 같은 내용으로 jpa로 작업해보겠습니다 답변 감사합니다!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 01월 31일
XML 파일에서 변수 치환 기호를 사용할 때, CDATA 섹션 내부에서는 작동하지 않을 수 있습니다. 그리고 따옴표 없이 바로 변수를 사용해도 동작합니다. 아래와 같이 쿼리를 수정해 보세요. ```xml <select id="findfoodinfo" parameterType="java.lang.String" resultType="com.springproj.dietwebservice.domain.FoodInfoVO"> SELECT * FROM foodinfolist WHERE food_name LIKE CONCAT('%', #{searchText}, '%') </select> ``` 또한 위 방식으로 여전히 문제가 발생한다면, SQL 쿼리의 잘못된 부분을 확인하기 위해 MyBatis 설정에서 로깅 레벨을 DEBUG 또는 TRACE로 설정하면 SQL 쿼리가 어떻게 생성되는지 확인할 수 있습니다. 이렇게 하면 문제의 원인을 좀 더 정확하게 파악할 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!