설문 조사 폼을 만들이 있어서 작업 중에 설문 조사의 질문과 선택 옵션의 수는 가변적이므로 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

    비밀댓글입니다

  Moneycomb 서비스를 개발하면서 메인 도메인인 nabakcompany.com에 서브 도메인으로 moneycomb.nabakcompany.com을 추가하고, 같은 메인 도메인과 같은 웹 서버에서 리스닝 포트 번호만 달리해서 서비스를 하려고 했는데, DNS에 대한 이해가 부족한 탓인지 그게 안된다는 걸 이제야 알았다. 그러니까 포트 번호를 숨길 수는 없다.


  톰캣 문서와 검색을 통해서 서버 아이피가 동일하고, 서브 도메인이 다른 경우에는 웹 서버에서 가상 호스트를 추가하여, 각각의 서브 도메인에 대해 각각의 웹 애플리케이션을 제공할 수 있다는 것을 알게 되었다.


  현재 서버는 Apache 웹 서버 없이 Apache Tomcat 7로만 구동되고 있다.


| server.xml 파일에 호스트 추가

  $CATALINA_HOME 에 위치한 conf 폴더 내에 서버 설정을 위한 server.xml 파일이 있다. 호스트를 추가하기 위해서는  server.xml 파일을 아래와 같이 수정한다.


  Engine 엘리먼트 내에 Host 엘리먼트를 추가한다.

  톰캣을 설치한 후 설정을 수정하지 않았다면 파일의 끝부분에 localhost Host가 있다. 서브 도메인을 위한 호스트는 그 아래에 추가한다.


  Host의 속성으로 name에 DNS 호스팅 서비스(혹은 네임 서버)에서 추가한 서브 도메인을 입력하고, appBase는 웹 애플리케이션이 위치할 디렉토리를 지정한다. 상대경로로 입력할 경우 $CATALINA_HOME 아래가 기준이 된다.

다른 속성에 대한 설명은 아파치 톰캣7 문서를 참고.



| 디렉터리 및 ROOT.xml 파일 추가

  톰캣 5 이하에서는 server.xml 내에 Host 엘리먼트를 추가하면서 그 안에 Context 엘리먼트를 함께 추가해서 호스트 컨텍스트 정보를 포함시켰는데, 톰캣 6이상 부터는 따로 분리할 것을 권고한다.(라는 것을 다른 블로그에서 보았다..)[각주:1]

  $CATALINA_HOME/conf/Catalina 에 서브 도메인 이름과 같은 디렉터리를 만든다.

server.xml에서 설정한 서브 도메인이 sub.domain.com 이므로 디렉터리 이름도 sub.domain.com 이다.

/var/lib/tomcat7/conf/Catalina$ mkdir sub.domain.com 

(위의 /var/lib/tomcat7은 톰캣이 설치된 경로, 일반적으로는 /usr/local/apache-tomcat-7.x.x)

  그리고 만든 디렉터리 안에 ROOT.xml 파일을 생성하고 아래와 같이 입력한다.

docBase 속성은 컨텍스트의 루트로 사용될 애플리케이션이 위치한 경로이고,

privileged 속성은 값이 true일 때. 매니저 서블릿 같은 컨테이너 서블릿을 사용할 수 있도록 허용한다. (Set to true to allow this context to use container servlets, like the manager servlet. - 라고 되어있는데 무슨 의미인지 정확하게는 모르겠다..)



| 웹 애플리케이션 배치

  docBase에 설정한 경로에 웹 애플리케이션을 배치하면 webapps에 있는 것 맨치롬 서브 도메인으로 접속할 수 있다.


| 문제

  Host 엘리먼트의 appBase와 Context의 docBase의 정확한 기능이나..  unpackWARs 속성 값을 true로 했을 때 어디에 위치한 war 파일의 압축이 풀리는 건지 모르겠다.

appBase나 docBase에 넣어봤지만 어디에서도 압축이 풀리지 않아서 그냥 tar 명령어로 풀어서 배치했다. -_- (왜 있는데 쓰질 못하니!)

  매번 파일럿 프로젝트만 개발하고 운영 단계까지 넘어가지 않다보니, 그냥 '돌아만'가는 서버 구축을 하다가, '제대로 돌아' 가는 서버를 구축하려니 공부해야할 것들이 점점 더 쌓이는 것 같다. 웹 서버 로드밸런싱이나, DB 서버 확장 등 어디서부터 시작해야할 지 막막하다.


잘못된 내용이나, 빠진, 부족한 내용에 대한 태클은 환영입니다. :)


References


  1. http://www.sjune.net/archives/807 [본문으로]
  1. 예쁜꽃이피었으면 2017.04.18 10:34 신고

    감사합니다~ 담아갈게요~

Apache Commons HttpClient 라이브러리를 찾을 수가 없다!

자바 표준 라이브러리의 Http관련 클래스를 쓰려고 찾다보니 예제 소스가 아파치 프로젝트의 HttpClient를 사용하는게 대부분이었다.

패키지는 org.apache.commons. httpclient

그런데 아무리 찾아봐도 아파치 프로젝트 홈페이지에서는 저 패키지의 라이브러리를 찾을 수가 없다 -_ - 이곳저곳, 말도 안되는 라이브러리 받아서 내용 보고.. 한참을 돌아다니다가 HttpComponents 라이브러리 소개 내용을 보다가 눈에 걸리적 거리는게 있었는데...

HttpComponents Client is a successor of and replacement for Commons HttpClient 3.x. Users of Commons HttpClient are strongly encouraged to upgrade.


"HttpComponents Client는 Commons HttpClient 3.x 의 대체입니다. Commons HttpClient 유저들은 업그레이드 할 것을 강력히 추천합니다." 

네 그렇습니다. commons의 HttpClientHttpComponents
대체 되었습니다.

근데 왜 HttpComponents 홈페이지의 예제 코드는 아직도 commons를 사용하고 있냐고... 괜히 이것 때문이 더 헷갈렸다.


혹시나 HttpClient 라이브러리를 아파치 홈페이지에서 찾고 계신 분은
Http Components 라이브러리를 받으시면 되겠습니다.
그리고 commons를 찾고 계시는 분들을 위해 링크를 걸어둡니다.

'마음이 뛰다' 카테고리의 다른 글

인생은 재밌다.  (0) 2011.09.10
막막 룰루랄라.  (0) 2011.08.26
롬업 후 APN 설정  (0) 2011.08.23
DHD LeeDroid 롬업, 커널업 완료  (0) 2011.08.22
왜 대체 NullPointerException이 뜨는거야!  (0) 2011.08.22
아빡치 에잇퉤퉤페 Apache Http Client  (0) 2011.08.18

+ Recent posts