설문 조사 폼을 만들이 있어서 작업 중에 설문 조사의 질문과 선택 옵션의 수는 가변적이므로 Parameter 컬렉션을 사용했다. 작업을 마무리 한 후 정상적으로 동작하는 지 테스트를 한 후 서버에 배포했다.


그런데.


이른바 "내 컴퓨터에서는 잘 되는데요?" 문제가 발생했다.


그렇다. 테스트를 할 때는 아무리 많은 질문과 옵션을 추가해도 잘 동작하던 것이, 서버에스는 IndexOutOfBound 예외를 내면서 설문이 제대로 처리되지 않는 문제가 발생했다.


설문 조사를 올리시는 분께서는 "음.. 7개가 넘어가면 설문 내용이 없어져요."라고 했고, 나는 "그럴리가 없다! 그 부분에 있어서 내 로직이 틀릴 리가 없다!" 라고 했다.

무지하면 용감하다더니, 어찌도 그리 당당할 수 있었을까? 다시 생각하니 부끄럽다.


서버에 배포된 설문 조사 폼을 확인해 보니, 정말 7개 이상으로 질문을 추가하면 죽는 것이 아닌가? 똑같은 설문 내용으로 내 컴퓨터(개발 컴퓨터)에서 테스트를 하니 "내 컴퓨터에서는 잘 된다."..


이 때까지는 자바스크립트로 설문 내용을 추가하는 부분에 이상이 있을 것으로 예상했다. 그런데 역시 이때까지는 Integer의 범위를 벗어나는 것도 아니고, 왜 하필 7개일까? 라며 이상하게만 생각하고는 자바스크립트 부분을 확인해 봤지만, 역시 이상은 없었다.


그러다 문득 톰캣 이 자식이 방해 공작을 하는 것이 아닐까 하는 생각에

"tomcat post form input limit length"를 키워드로 검색하니 한 블로그 글이 검색됐다.

그리고 그 글에는 내 문제의 원인이 무엇인지 명확하게 나와있었다. 그렇다. 파라미터의 수를 제한하는 설정이 있었던 것이다.


테스트 서버의 톰캣 설정은 그 파라미터 갯수 제한이 무한대라서 파라미터 갯수의 제한이 있다는 걸 모르는 상태에서는 그런 문제가 발생할 지 전혀 예측할 수 없었고,

실서버에서는 maxParameterCount="50" 으로 50개의 제한이 있었다.


질문 하나를 구성하는 속성은 제목, 질문 타입, 옵션 5개로 7개였으니, 톰캣이 수용할 수 있는 최대 질문의 수는 7개가 되는 것이고, 그 수 이상이 되면 서버가 빵~ 예외를 터뜨린다. 여태까지 파일 업로드 크기의 제한이 있는 줄은 알았지만, 파라미터의 수에 제한이 있을 줄은 몰랐다. 폼 파라미터의 갯수 및 크기 제한을 하는 설정은 아래와 같다.


server.xml 파일


maxParamterCount 속성은 폼 파라미터의 최대 수이고, maxPostSize는 폼의 최대 전송 용량(byte)이다. 값을 -1로 하는 경우 제한을 두지 않도록 한다.



"내 컴퓨터에서는 잘 되는데요?"

"님 컴퓨터에서도 잘 돌아가요"가 될 수 있도록 내가 사용하는 것들을 잘 알고 써야겠다.

  1. moonsun_ 2014.05.24 23:17 신고

    그리고나서도 하루 정도를 더 고생시켰던.. 설문조사..

  2. 익명 2018.01.23 17:35

    비밀댓글입니다

안드로이드 Phonegap을 사용하기 위해서 폰갭 홈페이지의 가이드 문서를 그대로 따라하려는데,

create.. 즉 시작부터 막혔다.


에러메시지는 다음과 같다


...create.js(38, 5) Microsoft JScript 런타임 오류: 'length'은(는) null 이거나 개체가 아닙니다.

...create.js(38, 5) Microsoft JScript Runtime Error: 'length'is null or not an object.


create.js 파일을 열어보니 다음과 같은 내용이 있다.

function setTarget() {
    var targets = shell.Exec('android.bat list targets').StdOut.ReadAll().match(/id:\s\d+/g);
    return targets[targets.length - 1].replace(/id: /, ""); // TODO: give users the option to set their target 
}

결국 targets 라는 객체에 length 속성이 없다는 얘긴데,

targets를 보면 android.bat list target 명령을 쉘에서 실행하여 아웃풋으로 출력되는 값 중

"id : 숫자"의 형식으로 된 문자열의 배열을 반환하도록 되어있다.

match는 일치하는 문자열이 없으면 null을 반환하므로 당연히 targets에 대해 length 속성도 없다.


그렇다면 android.bat list targets의 문제다.


콘솔에서 android.bat list targets를 실행해보니 다음과 같이 나타난다.



각종 환경을 설치할 때 C:\Program Files 아래에 둔 것은 JDK 밖에 없다.

오류 메시지에 보면 C:\Program Files 에서 Files가 끊어진 것으로보아 띄어쓰기는 인식을 못한다는 얘기고,

붙여주기만 하면 된다.


시스템 설정의 환경 변수 설정에서 JAVA_HOME의 경로 설정에

양 끝에 큰 따옴표(")만 붙여 주어 위 문제를 해결할 수 있었다.



'머리가 뛰다' 카테고리의 다른 글

Behavior-Driven-Development BDD?  (0) 2013.02.22
Redmine 설치기  (0) 2013.02.16
Phonegap create 오류  (0) 2012.11.25
구글느님 다 해쳐드세영.. ㅠㅠ  (0) 2012.11.06
자바스크립트는 보면 볼수록 상콤하다.  (0) 2012.10.25
iBatis Result Mapping...  (0) 2012.09.13

+ Recent posts