메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

한빛 10주년 기념기고: JSP에 대한 이런 저런 이야기들

한빛미디어

|

2003-03-19

|

by HANBIT

10,885

저자: 티맥스 소프트 자바 테크놀러지 이벤절리스트 이아스

한동안 이곳에 글 올리기가 뜸했습니다. "왜 그랬을까..."는 아마 짐작하실 수 있는, 바로 "회사일(!)" 덕분이지만, 한빛미디어가 10주년이라는 소식을 듣고 단순히 축하 메시지만으로는 부족하지 않을까 싶어 휴식시간을 쪼개가며 글을 마련해 보았습니다. 사실 쓰고 싶은 것은 많지만, 그 많은 아이템들 중에서 이번에는 두 가지만 뽑아보려 합니다.

첫번째는, 톰켓 4.1에서 지원하기 시작한 태그 인스턴스 재활용에 대한 것입니다. 정확히는 4.1.6부터 JspServlet의 옵션으로 지원하기 시작했는데, TOMCAT_HOME/conf/web.xml에 있는 JspServlet관련 설정에 다음과 같이 추가하면 됩니다.

jsp
org.apache.jasper.servlet.JspServlet

logVerbosityLevel
WARNING


enablePooling
true

3

즉, enablePooling 초기화 매개변수를 true로 잡으면 태그 인스턴스를 재활용한다는데, 실제 이 옵션을 켠 상태에서 JSP 페이지로부터 생성된 서블릿 코드는 다음과 같습니다.
public class foo_jsp extends HttpJspBase {

  private static java.util.Vector _jspx_includes;
  private org.apache.jasper.runtime.TagHandlerPool _jspx_tagPool_eg_foo_att3_att2_att1;
  private org.apache.jasper.runtime.TagHandlerPool _jspx_tagPool_eg_log;
  private org.apache.jasper.runtime.TagHandlerPool _jspx_tagPool_eg_log_toBrowser;

  public foo_jsp() {
    _jspx_tagPool_eg_foo_att3_att2_att1 = new org.apache.jasper.runtime.TagHandlerPool();
    _jspx_tagPool_eg_log = new org.apache.jasper.runtime.TagHandlerPool();
    _jspx_tagPool_eg_log_toBrowser = new org.apache.jasper.runtime.TagHandlerPool();
  }

  public java.util.List getIncludes() {
    return _jspx_includes;
  }

  public void _jspDestroy() {
    _jspx_tagPool_eg_foo_att3_att2_att1.release();
    _jspx_tagPool_eg_log.release();
    _jspx_tagPool_eg_log_toBrowser.release();
  }
보시다 시피 태그 인스턴스가 _jspService()의 지역 변수가 아닌 JSP 서블릿 클래스의 인스턴스 필드로 할당되어, 모든 JSP 요청 스레드가 이 인스턴스 필드 태그를 공유하게 되고, 이점이 바로 기존에 스레드마다 _jspService()를 실행하면서 태그 인스턴스를 생성하여 사용하는 방식과 다른 "재활용"의 의미인 셈입니다. 그렇다면 이런 태그 인스턴스의 재활용은 과연 어떤 효과를 가져다줄까요? 이론적으로는 인스턴스의 생성 시간 단축과 메모리 절약이 떠오르는데, 이에 대해 JavaServer Pages의 저자 한스 벅스턴이 톰켓 개발자 메일링 리스트에서 논의한 메시지들이 있습니다(여기 참고). 일단 간략히 결론부터 말하면 간단한 테스트에서는 그다지 큰 성능상의 이익을 얻지는 못하지만, 앞서 언급한 원칙적 장점을 고려해본다면 실제 서비스시에는 꽤 도움이 되지 않을까 싶네요.

그런데 한편으로는, 이렇게 성능상에 잠재적으로 향상을 불러올 수 있는 기능을 왜 옵션으로 설정할 수 있게 해놓았을까요? 거기에는 서블릿의 인스턴스 필드로 잡았을 때의 스레드간의 동기화 문제가 걸려있기 때문입니다. 태그 핸들러를 지역 변수로 잡는 경우에는 각 스레드별로 상충할 일이 없지만, 인스턴스 필드인 경우 해당 JSP를 요청하는 모든 스레드가 공유하게 되므로, 스레드 안전한 상황과는 더욱 멀어지는 꼴이죠. 이런 상황에 대해 근본적으로 대처하고 싶으면 역시 태그 인스턴스 재활용 옵션을 끄거나, 혹은 자신만의 스레드 안전한 로직으로 구현해야 할 필요성이 있을 것입니다.

이제 두번째 주제로 넘어가보죠. 며칠전 자바 썬 닷컴 사이트에 JSP 2.0에 대한 흥미로운 채팅이 있었습니다(여기 참고). 『Core Servlets and JSP』의 저자 마티 홀과 JSP 2.0 스펙 리드인 마크 로스가 참여, 많은 질문들에 답했습니다. 특히 관심가는 것은, 마티의 책이 2권으로 불어나서 발간된다는데, 먼저 새로이 EL을 다룰 첫 번째 책은 이번 자바원 컨퍼런스(6월)에 맞춰 나올 예정이고, JSF와 스트럿츠등의 응용 기술을 다룰 두번째 책도 가을쯤에 나올 것 같다는군요. 국내에서도 분발하여 JSP 2.0뿐만 아니라 EL, JSTL, JSF, 스트럿츠에 관한 좋은 책들이 나와주었으면 하는 은근한 소망(내지는 질투? ^^)이 생깁니다. 그리고 마크에 따르면, JSP 2.0 규격은 J2EE 1.4가 최종 발표될 올 여름에 최종판이 함께 나올 계획이라네요. 아직은 개선의 여지가 많으니 더 좋은 JSP 개발을 원하시는 분들의 많은 의견 개진 바랍니다.

봄입니다. 아직까지는 많이 춥고, 심지어 강원도에서는 다시 스키를 탈 수 있는 정도라네요. 어디에선가는 전쟁의 포효가 들리기도 하고, 경제는 시베리아 벌판을 방불케 하지만, 그래도 묵묵히 JSP 책을 쓰고 규격을 만드는 사람들을 보면 봄은 여전히 우리 곁에 있어 보입니다.

JSP의 봄이 시작되었습니다.
TAG :
댓글 입력
자료실

최근 본 상품0