요즘은 블로그 쓰는 시간을 내는 건 사치를 부리는 것 같아서 짧게 짧게..

 

호주 북부에 몰아쳤던 싸이클론 올가인가 하는 놈이 다 죽어가면서 브리즈번에 도착했는데, 그래도 싸이클론이었던 지라 그 영향력이 대단하다. 일주일째 천둥 번개와 비를 수시로 뿌려대고 체감 기온은 한 10도는 떨어진듯하다. 덕분에 평화가 감기가 들려버렸다. 어제 저녁부터 밤새 열이 오르내리더니 기침도 하기 시작했다. 오늘은 어린이 집도 못보내고 병원에나 다녀온 뒤 집에서 돌봐줘야 할 것 같다. 비상모드.

 

제이보스 씸(Seam)을 공부하면서 신기했던 것 한 가지는 씸 애플리케이션이 브라우저의 창과 탭을 구분한다는 것이었다. 예를 들어 쇼핑몰을 돌아다니다가 여러 개의 탭을 열어서 각각 다른 상품을 선택하고 동시에 결재로 들어가면 두 가지 카드의 결재가 병렬적으로, 서로 영향을 주지 않고 진행하는 것이 가능하다는 것이다. 같은 브라우저 인스턴스에서는 멀티 창과 탭에서 모두 웹 세션이 공유되기 때문에 서로 영향을 준다는 것이 상식인데, 이게 어찌 가능한지 신기할 따름이었다. 씸 책에서는 이게 씸을 차세대 프레임워크로 차별화 시켜주는 것이다라며 한것 치켜올리기도 한다. 처음 이런 기능을 보면서 혹시 브라우저가 탭이나 창을 구분할 수 있는 ID 같은 것을 헤더에 보내주는 것이 아닐까라고 생각했다. 궁금해서 테스트를 해보니 탭이 달라져도 HTTP 헤더에 아무런 변화가 없다. 그러면 씸은 도대체 어떻게 각 탭에서의 작업을 완벽히 분리해서 처리할 수 있는 것일까?

답은 알고보니 매우 간단했다. 씸이나 JSF의 컨버세이션이 어떻게 유지되는지를 이해하면 사실 자명한 현상이다. 씸은 일반적으로 HTTP GET요청이 갈 때마다 새로운 컨버세이션을 만든다. 따라서 쇼핑 카트와 주문 프로세스가 하나의 컨버세이션이라면 링크를 클릭하거나 URL을 옮겨 적어 같은 브라우저에서 새 창을 열거나 새 탭을 열게 되면 HTTP GET이 날라가고, 그 안에서 새로운 컨버세이션이 시작되는 것이다. 이렇게 시작된 컨버세이션은 히든 필드에 ID를 숨겨서 POST를 타고 계속 넘어간다. 따라서 탭이 달라지고 창이 달라지면 분리된 컨버세이션이 만들어지고, 그 안에 새로운 컨텍스트를 가진 카트와 결재 컴포넌트들이 만들어져서 POST로 계속 이어지는 컨버세이션ID에 결합되어서 돌아가는 것 뿐이다. 알고보니 간단.

물론 씸은 원한다면 GET으로 링크를 타고 넘어갈 때도 컨버세이션을 유지시켜 줄 수도 있다. URL에 ID를 넣게 해주는 것을 지원한다. 그렇다면 이런 경우에 URL을 카피해서 다른 탭에서 작업을 계속 한다면? 그때는 탭마다 분리된 컨버세이션이 생기지는 못할 것이다.  시간이 없어서 직접 검증은 못해봐서 100% 장담은 못하겠지만 지금까지 공부한 씸에 대한 이해로는 이정도.

씸과 비슷한 stateful 방식의 애플리케이션을 지원하는 스프링 웹 플로는 URL의 파라미터로 각각의 컨버세이션을 구분하는 것이 디폴트이다. POST를 사랑하는 JSF가 기본이 아니기 때문이다. 물론 원한다면 SWF에서도 탭마다 병렬적으로 다른 컨텍스트를 유지시키는 것이 가능하겠지.

아무튼 stateful의 세계는 여러모로 흥미롭다. 조만간 바쁜 작업을 마무리 하고 나면 stateful 개발에 올인해볼 생각이다. 그나저나 친애하는 자바 챔피언 양회장님은 한국 씸 프레임워크 사용자 모임(KSFUG)을 언제 시작하시려나. 발기인으로 참여한지 4개월째인데, 아직도 모임 사이트 소식이 없다…

 

스프링소스의 직원이자 톰캣의 핵심 개발자인 Mark Thomas의 Tomcat 7 관련 인터뷰 기사가 http://java.dzone.com/articles/memory-leak-protection-tomcat 에 실렸다. 구체적으로 Tomcat 7(또는 6의 최신버전)에서 그동안 말썽이던 메모리 누수 문제를 대폭 해결했다는 것이다. 톰캣의 리로딩 기능은 유용하지만 개발과정에서 왠만한 규모의 애플리케이션이라면 4-5차례 리로링을 하고 나면 PermGen이 모자란다고 칭얼거리며 뻗는 톰캣을 경험해봤을 것이다. 문제의 원인과 책임규명은 사실 복잡하고 지저분하다. 근본적인 원인은 리로딩 시에 기존 웹 앱의 클래스 로더를 톰캣이 제거하지만 GC 대상이 되지 못하기 때문이다. 클래스로더가 GC되야 역시 그 안에서 로딩된 애플리케이션의 클래스들도 함께 제거될텐데, 클래스로더가 톰캣 외에 다른 오브젝트를 통해서 참조되고 있기 때문에 문제가 된다. PermGen처럼 사이즈가 작은 메모리가 그래서 가장 먼저 타겟이 된다. 이런 문제의 원인은 다양한데, 위 기사에 잘 설명되어있다. 2004-2005년 즈음에 이 문제로 하이버네이트, CGLib, Commons Logging이 피터지는 공방을 벌였던 기억이 난다. 개빈 킹은 하이버네이트가 집중 공격 당하는 과정에서 열받아서 아파치 그룹의 프로젝트 중 ANT와 Log4J 빼면 다 쓰레기다라는 유명한 발언을 하기도 했다. 지금은 어떻게 생각하는지 모르겠지만. 결국 톰캣 개발자들은 이런 메모리 누수 원인은 대부분 애플리케이션과 라이브러리 탓이라고 책임을 돌렸다. 사실이긴 하다. 심지어 GWT가 적극 사용한다는 JRE의 java 2d API 조차도 메모리 누수의 주범이라고 한다. 깔끔하게 청소해주지 않는 ThreadLocal도 문제다(그래서 스프링은 Thread scope보다는 같은 ThreadLocal을 사용하지만 요청이 끝날 때마다 깔끔히 정리해주는 Request scope 사용을 권장한다).

아무튼 톰캣 최신 버전은 이런 잘 알려진 애플리케이션 내의 메모리 누수의 원인을 톰캣 차원에서 직접 해결하는 기능을 추가했다고 한다. 과연~. 개선했다는 클래스로더의 clearReference()메소드를 구경하고 싶지만.. 어흑 시간이.

 

아이폰 관련 기사나 글, 트위터에 보면 너도 나도 어플리케이션(application) 또는 어플이라는 말을 쓴다. 원 발음 그대로 차음하면 영 어색한 2음절 강세 단어(퍼래미터(parameter)나 어패치(apache) 같은)도 아닌데, 애플리케이션이라고 하면 안되나. 아예 통일해서 "어플(apple)이 만든 먹북(macbook)에서 어플리케이션(application)"을 쓴다라고 하던가.

Related posts:

  1. 유쾌한 이슈처리 재촉 메일
  2. 톰캣 앞에 아파치 웹 서버(Httpd)를 두어야 할까?

Facebook comments:

to “씸은 어떻게 멀티 탭을 구분할까, 톰캣의 메모리 누수 해결법 등등”

  1. 마지막에 application 얘기는 갑자기 왜 나오는… ??ㅋㅋ

    단순 폼 처리 컨버세이션을 씸으로 관리하는 거랑 SWF로 관리하는 거랑 어떤게 간편한가요?

  2. 보아뱀/ 스프링 MVC가 편해

  3. 저는 ‘애플리케이션’이라고 쓰는데
    안 되나요? ( ”);

  4. 에이콘에서 ‘애플리케이션’이라고 쓰라니까… 스프링 책을 그렇게 쓰도록 해.. ㅋㅋ

  5. 보 보 트 이 것이 트 MySQL 로 .

  6. To meet your pressing fiscal inevitably you let you meet your occasion on time.

    This loan is loans is 1 to 31 days. To use for these loans has
    also been fast and handy as these monetary resource hisher possession with the investor
    to get the loan sanctioned. CCJ”s, non payment, hold payment, arrears, debt administration and ansome different to the wretched borrows, who need the pressing amount of money. But pinch of monetary system can fall assure that Providers are bighearted each and all client the help they merit. payday

  7. Hey there just wanted to give you a brief heads up and let you know a few of the images aren’t loading properly. I’m not sure why but I think its a linking issue. I’ve tried it in two different browsers and both show the same outcome.

  8. mbt store 씸은 어떻게 멀티 탭을 구분할까, 톰캣의 메모리 누수 해결법 등등 » Toby’s Epril

  9. It is not my first time to visit this web
    page, i am visiting this web site dailly and obtain nice data from
    here everyday.

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha