JSP/Servlet Spec 버전별 특징 프로그래밍

Java 웹 어플리케이션을 개발하다보면, 의외로 자기가 현재 사용중인 JSP/Servlet 스펙의 버전을 모르는 상태로 개발하는 것을 많이 보게 된다.

특히, 자주 나타나는 것으로 개발은 Tomcat 에서 하면서, 실제 갑은 톰캣이 아닌 다른 WAS를 사용할 경우가 있는데, 이는 나중에 아주 심각한 문제로 대두될 수 있다. Tomcat 5에서 Tomcat 5가 지원하는 JSP 2.0/Servlet 2.4로 (해당 스펙의 기능을 이용해서) 개발했다가, 나중에 갑이 우리는 죽었다 깨나도 웹 로직 8.1(JSP 1.2/Servlet 2.3) 쓸래... 그래버리면, 그때부터는 열심히 노가다로 고쳐야 된다.

간단하게 JSP/Servlet 스펙을 내가 아는대로 정리해본다. 특히 개발시 Tomcat으로 개발 환경을 구축한다면, 갑이 원하는 WAS가 지원하는 스펙 버전을 확인해서 그 스펙 버전에 맞는 톰캣을 사용하도록 한다. 물론 각 WAS별 지원 스펙은 해당 WAS의 업체에 물어보면 된다.

Tomcat 버전별 지원 스펙

* Tomcat 3.x : JSP 1.1, Servlet 2.2
* Tomcat 4.x : JSP 1.2, Servlet 2.3
* Tomcat 5.x : JSP 2.0, Servlet 2.4

위 내용은 http://tomcat.apache.org/whichversion.html에서 확인할 수 있다.
물론 상위 버전을 지원하는 WAS는 하위 버전 스펙도 지원한다. Tomcat 5.x에서 JSP 1.1/Servlet 2.2 어플리케이션 짜도 괜찮다. 하지만 안그러는게 더 안전할 거 같다.

Tomcat 3.x : JSP 1.1, Servlet 2.2 는...

* web.xml 에서 다음과 같은 DTD를 선언해줘야 한다.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
 <!-- 어쩌구 저쩌구...-->
</web-app>

* 한글 파라미터 처리에 심각한 문제가 있다. ServletRequest.setCharacterEncoding(String)메소드가 존재하지 않기 때문에 각 요청에 대해 일괄적인 문자 인코딩 지정을 할 수가 없다.
* 한글 파라미터 처리를 하려면 모든 요청에 대해서 다음 처럼 인코딩 변환작업을 해줘야 한다.
String param = new String(request.getParameter("param").getBytes("latin1"),"euc-kr");

위와 같은 노가다를 안 하려면 MVC 패턴 프레임워크를 사용하면서 Controller 부분에서 일괄적으로 request 객체를 바꿔치기해서 getParameter()가 인코딩을 자동으로 해주도록 해야 한다. Spring MVC에서 그런식으로 한 예제(이거도 사실 불완전함).
사실.. 한글 문제가 아니더라도 MVC패턴 프레임웍을 쓰는것이 여러모로 좋은 것은 이미 다들 아실거 같다.
* Filter와 Listener가 존재하지 않는다. 특히 Filter는 상당한 노가다를 줄여주는 역할을 해서, 많이 애용되지만 JSP 1.1/Servlet 2.2에는 존재하지 않는다.
* 서블릿을 web.xml에서 매핑하지 않고 패키지명을 포함한 클래스의 완전한 이름을 통해 브라우저에서 서블릿의 직접 호출이 가능하다. 매우 좋지 않은 습관이지만 어쨌든 가능하다.

너무 오래된 스펙이고 불편한 점이 많으므로 되도록 사용하지 않는게 좋다. 갑이 이 스펙의 WAS를 요구하면 설득해서 최소한 JSP 1.2/Servlet 2.3 으로 바꾸도록 하길 권장하고 싶다.

Tomcat 4.x : JSP 1.2, Servlet 2.3 는...

* web.xml 에서 다음과 같은 DTD를 선언해줘야 한다.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
....
</web-app>

* ServletRequest.setCharacterEncoding(String)를 통해서 파라미터의 문자 인코딩을 일괄적으로 지정할 수 있다.
* Filter와 Listener가 존재한다.
* Filter와 ServletRequest.setCharacterEncoding(String)를 이용하면, 한번에 한글 관련 설정이 끝난다.
  FIlter 강좌 하나...(영문)
  Listener 강좌 하나...(영문) : 리스너는 웹 어플리케이션이 시작/종료 되거나, 세션 생성/파괴와 같은 특정 이벤트가 발생할 때 부가적인 작업을 해줄 수 있도록 하는 클래스이다.
* 기본적으로 서블릿 매핑을 web.xml에 작성하지 않으면 서블릿을 호출할 수 없다.(이게 더 좋은거다... 보안상)
* JSTL 1.0 이 도입되었다.

JSP 1.2/Servlet 2.3 이 현재 우리나라에서 제일 많이 쓰이는 것으로 보이며 개발시 어느정도 무난하다 할 수 있다.

Tomcat 5.x : JSP 2.0, Servlet 2.4 는...

* web.xml 에서 다음과 같은 Schema를 선언해줘야 한다.
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
<!-- DTD에서 Schema 로 바뀌었다. -->
</web-app>

* 쉽고 강력해진 Tag Library 작성기능.
* EL을 JSTL이 아닌 모든 템플릿 문자열에서 사용가능하다.
* JSTL 1.1 이 도입되었다.
* Function 커스텀 태그를 만들 수 있다.
* 그외 자세한 JSP 2.0/Servlet 2.4의 변경 사항 JSP 2.0 뭐가 바뀌었나를 참조한다.

Tomcat 4.x/5.x에서의 한글 문제 해결법도 한 번 읽어보시길 권한다.

개인적으로는 JSP 2.0/Servlet 2.4의 사용을 권장하고 싶다. 스펙 버전이 올라갈 수록 JSP 개발은 더 쉬워지고 생산성도 높아진다(물론 갑이 이 스펙을 지원하는 WAS 사용을 결정했을 때 얘기이다).

tags : java jsp servlet 서블릿 spec 스펙 version 버전

핑백

  • 2012-05-23 개발일지 | bluepoet&#039;s diary 2012-05-24 10:43:03 #

    ... 을 알았다. 더불어 톰캣(WAS) 버전에 따른 JSP와 SERVLET 스펙에 맞는 커스텀태그가 지원된다는 사실 또한 알게 되었다. 해당 내용은 아래 잘 설명되어 있다. Jsp/Servlet 스펙별 특징 중요한 것은 머리로만 이해해서는 온전한 내 것이 될 수 없다. 프로그래머로서의 명언 &#8220;백문이불여일타!&#8220; 비단, 코드뿐만 아니라 개발환경의 ... more

  • setCharacterEncoding(String) | purplike 2013-09-30 14:37:07 #

    ... b-app-2_4.dtd 가 있는 tomcat5/common/lib/servlet-api.jar 파일로 교체 (Servlet 2.4에 tomcat 5.x http://kwon37xi.egloos.com/2793511) 다른방법? 안해봄.. response.setContentType("text/html;charset=UTF-8"); http://st ... more

덧글

  • 대나무 2006/11/02 15:17 #

    상위버전으로 갈수록 개발도 편해지고 기능도 좋아지지만 고객들은 기존의 라이센스를 버리기를 원치않지요. 역시 세상은 예산이 지배하는지라... ^^;
  • 권남 2006/11/02 22:29 #

    대나무님// 솔직히 갑들한테 "걍 Tomcat 쓰시죠", 그러고 싶은데, 아직까지 톰캣을 오픈소스라고 거부하는 분들이 많더라구요.
    근데.... 그렇다고 구버전의 상용 WAS를 쓰면서 WAS 유지보수 계약 맺고 있는 것을 본 적도 별로 없습니다... --;
  • 백일몽 2006/11/03 00:28 # 삭제

    외부업체가 개발하는 것을 보고 '오호라~ 스프링을 쓰는구나' 했는데 나중에 알고보니 was는 웹로직. 이게 무슨 삽질인지??
※ 로그인 사용자만 덧글을 남길 수 있습니다.