11. Project&Server


  request와 client object 와는 다른게 하나의 프로젝트나 하나의 전체 서버(여러 프로젝트들의 집합을 포함하는)에 걸쳐서 동시에 관리되어지는 즉, global값을 사용하는 경우에 사용되는 object들이다.

  간단한 예로, 해당 웹서버에 대한 접속 건수는 오직 하나 존재해서, 하위의 모든 어플리케이션에서 접속때마다 증가시켜주어야 한다. 이때 server나 project같은 object가 사용된다.

11.1 Project

  하나의 어플리케이션 안에서 global값으로 사용되는 변수를 담는 object이다. 특정 project를 application manager를 통해서 종료하는 경우에 파괴되고, start, restart의 경우 초기화가 이루어진다. 따라서, 중요한 정보가 있다면, File이나 DataBase에 저장하는 것이 좋다.

  이 object는 서버에 메모리공간을 확보하여 저장하게 되며, 모든 project마다 독립적으로 사용된다. 별도의 정의된 속성은 없다.

필요한 경우 어플리케이션간 공유를 위해서 project의 하위 속성으로 등록해서 사용할 수 있다.

11.2 Server

  이 object는 웹서버에서 관리하는 global object로 모든 하위의 어플리케이션에서 접근가능하다. 웹서버가 start되면 초기화 되고, 웹서버를 stop시키면, 파괴된다.( 여기서 말하는 서버란, URL이 다르면 즉, 포트가 다르면 달라지게 된다. ). 역시 필요한 정보를 별도로 보관해야 한다.

  몇가지 지정된 속성이 있다.

hostname포트번호를 포함하는 URL ex)www.netscape.com:80
host포트번호없는 URL ex)www.netscape.com
protocol프로토콜 ex) http:
port프로토콜 ex) http:
jsVersionServer Version ex) 3.0 WindowsNT


  필요한 경우 공유를 위해서 server의 하위 속성으로 등록해서 사용할 수 있다.

  • LOCK/UNLOCK

      project와 server의 속성들은 동시에 여러 사용자가 접근하는 경우가 있기 때문에, lock, unlock과 같은 함수를 제공한다.

    상황) server.counter라고 해서 접속 건수를 저장하는 값이 있고 현재 3이라고 하자, 이 때, a라는 사람이 접근을 해서, server.counter 에 값을 4라고 쓰려고 할 때, b라는 사람도 접근을 했다. 같은 작업을 하게 되면, 아직 counter의 값이 3이 있을 경우 최종 값은 5가 되야 하지만, 두사람이 동시에 쓰게 되면 4가 되어 버리는 결과를 초래하게된다.
      이러한 현상을 막기위해 현재 내가 쓰기 시작할 때, lock를 걸어 놓으면, 다른 사람이 쓸려고, unlock이 될 때 까지 기다리게 한다. 이때, 계속 기다리다가 Timeout이 되면서 에러메세지가 사용자에게 갈 수 있다. 그러므로 이런 경우는 별도의 문장을 추가해서 사용자에게 정보를 제공해야한다.

      이러한 lock, unlock기능을 제공하는 class가 Lock이며, 두 함수를 제공한다. 추가로 isValid()함수를 제공하여 사용자가 lock에 대한 일관성이 깨지면, false를 return하게 된다.

      예) project.cnt 값을 예로 들어 설명하면, 다음과 같은 두가지 방식이 있다.

    project.cnt = new Lock();
    if( ! project.cnt.isValid() ) {
        redirect("lockerr.html");
    }
    ...........
    Lock Class를 사용한 경우로 해당 request가 종료되고 나면, lock이 해제된다.
    if( project.cnt.lock() ) {
        ..................
        project.cnt.unlock();
    }else redirect("lockerr.html");
    lock(), unlock()함수를 사용하는 경우로 반드시 두가지 함수를 명시적으로 사용해야 한다.


  • Deadlock

      두 개의 프로세서가 lock를 서로 기다릴 때를 말한다. 즉, 1번 프로세스가 a.lock()상태에서 b.lock()을 걸고, 2번 프로세스가 b.lock()에서 a.lock()을 걸 게 되면, 서로 상대방이 lock를 걸고 있는 값이 풀릴 때까지 마냥 기다리게 되는 현상이 발생하기도 한다. 이러한 경우를 deadlock이라 부른다.

      이러한 결과를 피하기 위해서는 하나의 값을 lock를 걸었으면, 풀린뒤에 다른 값에 lock을 거는 것이다. deadlock을 웹서버에서 전적으로 피하게 해주는 기능이 존재하지 않는 다는 것을 명심하라.

      웹에서는 여러 client가 동시에 접속하게 된다는 점을 항상 명심해서 lock을 걸고 작업하는 부분이 있다면, 세심하게 신경써야 하며, 혹시 사용자가 작성한 함수가 포함되어 있을 경우에도 반드시 뒤져서 deadlock의 가능성이 있는 지 확인해야 한다.

- Last Update : 2001.7.5 by Deadfire(http://www.deadfire.net)

LiveWire 강좌
LiveWire란?
최초예제/동작원리
실행환경 준비
컴파일 및 실행
SSJS의 기본
     - Function
     - Classes/Objects
     - 사용 Tag
     - SSJS의 처리과정
기본 함수
Client To Server
     - FORM Tag
     - URL
Server To Client
     - FORM Tag
     - Cookie
Session
Client
Project/Server
File
Database
     - Database고려사항
     - Function/예제
기타
     - Stored Procedure
     - 외부함수호출
마치며

Copyright ⓒ 1997 ~, Deadfire Program Master