본문 바로가기
개발일지/어!?

[JAVA] 인덱스 {} 이(가) 범위를 벗어났습니다 (MSSQL)

by 리콩알 2023. 7. 26.
반응형
인덱스 {}이(가) 범위를 벗어났습니다.

 


알다가도 모르겠는 이번 에러 문제!!

고객사 운영 유지보수 중 다음과 같은 에러가 발생한다는 문의가 들어왔다.

처음에는 컬럼 자릿수 문제인가 했는데 그런건 아니고....

문제되는 화면의 해당 쿼리를 DB에서 실행 했을 때는 에러 없이 잘 조회 되었는데, 왜 이런 에러가 날까....? 

 

알고보니 XML파일에서 해당 쿼리를 실행 하였을 때 라인주석처리( -- )로 인해 발생하는 에러였다.

아니!!! 라인 주석처리 기존에 잘 쓰고 있는데 왜 에러가 나는 거냐구여ㅠㅠ

 

보통 DB에서는 /* */ , -- 등의 주석처리가 실행되는데 문제 없지만,  Ibatis에서 라인주석( -- )을 사용하는 경우 내부파싱에 의 주석처리가 아닌 한 줄로 쿼리를 실행하게 된다.

즉, 코드를 작성할 때 Enter로 줄바꿈을 하였지만 Ibatis에서 컴파일 할 경우 Enter로 줄바꿈을 하지 않고 한 줄로 동작하기 때문이다.

 

 

예를 들어 아래와 같은 쿼리 조회 시 일부 컬럼을 주석처리 했다고 가정했을 때,

SELECT BO.TITLE  --게시물 제목
     , BO.BOARD_ID --게시물 ID
 FROM USED_GOODS_BOARD BO
  INNER JOIN USED_GOODS_REPLY RE ON BO.BOARD_ID = RE.BOARD_ID --
 WHERE TO_CHAR(BO.CREATED_DATE,'YYYYMM') = '202210'
 ORDER BY RE.CREATED_DATE, BO.TITLE
 -- [프로그래머스/SQL] 조건에 부합하는 중고거래 댓글 조회하기 게시물 참조

Ibatis에서는 아래와 같은 쿼리로 변경되어 동작한다.

SELECT BO.TITLE  --게시물 제목
     , BO.BOARD_ID --게시물 ID
 FROM USED_GOODS_BOARD BO -- INNER JOIN USED_GOODS_REPLY RE ON BO.BOARD_ID = RE.BOARD_ID
 WHERE TO_CHAR(BO.CREATED_DATE,'YYYYMM') = '202210'
 -- [프로그래머스/SQL] 조건에 부합하는 중고거래 댓글 조회하기 게시물 참조

 

 

해결방법

일반 라인주석(--)이 아닌 /* 내용 */ 주석 또는 <!-- --> 주석을 사용하니 정상적으로 실행되는 것을 확인했다!

Character Set을 확인해서 jsp파일, xml파일, DB, Tomcat등이 동일하게 설정되어있다면 에러가 나지 않지만 일일이 Character Set을 확인할 수 없기 때문에 그리고 어디서 라인 주석 처리가 잘못 컴파일 되는지 알 수 없기 때문에 XML파일에서 주석처리 시 일반 라인 주석( -- )이 아닌 전체 주석을 권고합니당

 

반응형