문제

12월 27, 2018 6:15:49 오후 org.apache.catalina.core.StandardWrapperValve invoke
심각: Servlet.service() for servlet [action] in context with path [] threw exception [Request processing failed; nested exception is org.apache.tiles.request.render.CannotRenderException: java.io.IOException: JSPException including path '/WEB-INF/jsp/XXX.jsp'.] with root cause
org.apache.jasper.JasperException:

Validation error messages from TagLibraryValidator for c in /WEB-INF/jsp/XXX.jsp
null: org.xml.sax.SAXParseException; lineNumber: 643; columnNumber: 56; An invalid XML character (Unicode: 0xb) was found in the CDATA section.

Validation error messages from TagLibraryValidator for fmt in /WEB-INF/jsp/XXX.jsp
null: org.xml.sax.SAXParseException; lineNumber: 643; columnNumber: 56; An invalid XML character (Unicode: 0xb) was found in the CDATA section.

어느날, JSP를 수정하다가 갑자기 위와 같은 오류 로그가 뜨며 컴파일 에러가 나기 시작했다. JSTL이나 스크립틀릿을 이용하여 로직을 추가한 것도 아니고 단순히 HTML 소스를 복붙하여 퍼블리싱 된 화면을 보고자 하였는데 오류가 나니 심히 당황스러웠다. 소스 1번째 줄부터 끝까지 눈으로 훑어보아도 도저히 오류날 이유가 없는데 오류는 나고 있으니 답이 안 나왔다. 오류 로그를 구글링해봐도 뚜렷한 답이 안 나오던 찰나에 구글링 검색어를 조금 바꿔서 검색해보니 바로 답이 나왔다.

원인 및 해결

처음 오류 로그를 구글링할 땐 Validation error messages from TagLibraryValidator for부분이 문제의 원인인가 해서 검색을 해봤는데 c태그나 fn 등의 JSTL 관련 태그 라이브러리를 사용하였다면 그것에서 무언가 오류가 나고 있을 것이다 라는 답변들이 대부분이었다. 하지만 나는 위에 써놨듯이 퍼블리싱 된 HTML 소스만 붙여넣었기 때문에 태그 라이브러리 소스 코드는 단 1줄도 없는 상태였다.

이걸로 한 2시간 헤매던 찰나에 An invalid XML character (Unicode: 0xb) was found in the CDATA section.부분이 눈에 띄어 구를링해보니 바로 답이 나왔다.

0xb: Vertical tabulation
0x1b: Escape
0x3: End of text
0x1: Start of heading

위와 같은 특수문자, 유니코드는 XML에서 사용할 수 없다고 한다. 그래서 JSP 상에서도 오류가 났던 것이다. 이클립스 검색(Ctrl+F)에서 해당 문자들을 replace 해주니 정상적으로 컴파일 되는 것을 확인할 수 있었다. 아래는 해당 유니코드들을 한번에 처리할 수 있는 정규표현식이다.

[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD\u10000-\u10FFF]+