Yong Choi avatar Yong Choi committed fbf1cc2

revised ch 13

Comments (0)

Files changed (1)

SimpleWebApps.rst

 간단한 서블릿 작성
 ------------------
 
-서블릿을 작성하려면, *javax.servlet.http.HttpServlet* 추상 자바 클래스를 CLASSPATH 내에 둠으로써 자이썬 서블릿이 그것을 확장하여 코드의 환경을 준비할 수 있도록 할 필요가 있다. 이 추상 클래스는, 다른 서블릿 구현 클래스와 함께 *servlet-api.jar* 파일에 속해 있다. 이 추상 클래스를 상속하는 어떠한 자바 서블릿이든지 반드시 구현해야하는 두 개의 메소드가 있는데, 그것은 바로 *doGet*\ 과 *doPost*\ 이다. 전자는 서블릿을 위해 HTTP GET 동작을, 후자는 HTTP POST 동작을 수행한다. 그외에 *doPut*, *doDelete* 및 *getServletInfo* 메소드도 구현하는 것이 일반적이다. *doPut* 메소드는 HTTP PUT 동작을 수행하며, *doDelete*\ 는 HTTP DELETE를, *getServletInfo*\ 는 서블릿에 대한 설명을 제공한다. 다음의 예제돠 같이 *doGet*\ 과 *doPost*\ 만 사용하는 경우도 많다.
+서블릿을 작성하려면, *javax.servlet.http.HttpServlet* 추상 자바 클래스를 CLASSPATH 내에 둠으로써 자이썬 서블릿이 그것을 확장하여 코드의 환경을 준비할 수 있도록 할 필요가 있다. 이 추상 클래스는, 다른 서블릿 구현 클래스와 함께 *servlet-api.jar* 파일에 속해 있다. 이 추상 클래스를 상속하는 어떠한 자바 서블릿이든지 반드시 구현해야하는 두 개의 메소드가 있는데, 그것은 바로 *doGet*\ 과 *doPost*\ 이다. 전자는 서블릿을 위해 HTTP GET 동작을, 후자는 HTTP POST 동작을 수행한다. 그외에 *doPut*, *doDelete* 및 *getServletInfo* 메소드도 구현하는 것이 일반적이다. *doPut* 메소드는 HTTP PUT 동작을 수행하며, *doDelete*\ 는 HTTP DELETE를, *getServletInfo*\ 는 서블릿에 대한 설명을 제공한다. 다음의 예제와 같이 *doGet*\ 과 *doPost*\ 만 사용하는 경우도 많다.
 
 자, 매우 간단한 자바 서블릿 코드를 살펴보도록 하자.
 이 서블릿은 웹 애플리케이션에서의 자신의 위치와 이름을 화면에 출력하는 기능만을 가지고 있다.
 JSP를 사용함으로써 자바 코드를 HTML 마크업에 통합하여 동적인 페이지 내용을 생성해낼 수 있다. 그렇다고 JSP를 맹목적으로 추종하는 것은 아니다.
 JSP는, 올바르게 사용하지 않을 경우에는 코드를 실재하는 악몽으로 만들어버릴 수 있다. JSP가 자바스크립트, HTML 및 자바를 한 개의 파일에 섞기에 편리하지만, 이는 유지보수를 매우 어렵게 만든다. 자바 코드를 HTML이나 자바스크립트와 뒤섞는 것은 좋지 못하다. 마찬가지로 자이썬을 HTML이나 자바스크립트와 뒤섞는 것도 좋지 않다.
 
-모델-뷰-컨트롤러 (MVC) 패러다임을 통해, 자바나 자이썬으로 구현한 로직과 HTML 등의 마크업과 깔끔하게 분리할 수 있다. 자바스크립트는 항상 HTML과 따라가는데 이는 클라이언트측 스크립트 언어이기 때문이다. 달리 말해서, 자바스크립트 코드는 로직 코드와 분리된다고 할 수 있다. MVC의 관점에서, 컨트롤러 코드는 마크업 및 자바스크립트 코드로서, 최종사용자로부터 데이터를 획득하는 데에 사용된다.
+모델-뷰-컨트롤러 (MVC) 패러다임을 통해, 자바나 자이썬으로 구현한 로직과 HTML 등의 마크업을 깔끔하게 분리할 수 있다. 자바스크립트는 항상 HTML과 따라가는데 이는 클라이언트측 스크립트 언어이기 때문이다. 달리 말해서, 자바스크립트 코드는 로직 코드와 분리된다고 할 수 있다. MVC의 관점에서, 컨트롤러 코드는 마크업 및 자바스크립트 코드로서, 최종사용자로부터 데이터를 획득하는 데에 사용된다.
 모델 코드는 데이터를 조작하는 업무 로직이다.
 모델 코드는 자이썬 또는 자바 내에 들어간다. 뷰는 결과를 표출하는 마크업 및 자바스크립트이다.
 
     </html>
 
 
-이 JSP 예제에서, 첫 번재 양식이 컨트롤러 역할을 하는 *add_to_page.py*\ 라는 이름의 자이썬 서블릿으로 리다이렉트함을 볼 수 있을 것이다. 이 경우에, *p*\ 라는 이름의 입력 텍스트 상자 내에 포함된 텍스트는 서블릿을 전달되어, 페이지에 다시 표출된다.
+이 JSP 예제에서, 첫 번째 양식이 컨트롤러 역할을 하는 *add_to_page.py*\ 라는 이름의 자이썬 서블릿으로 리다이렉트함을 볼 수 있을 것이다. 이 경우에, *p*\ 라는 이름의 입력 텍스트 상자 내에 포함된 텍스트는 서블릿을 전달되어, 페이지에 다시 표출된다.
 다시 표출될 텍스트는 *page_text*\ 라는 이름의 어트리뷰트에 저장되며, JSP 페이지 내에서 ${} 표기에 의해 참조됨을 볼 수 있을 것이다. 예제 13-6은 *add_to_page.py*\ 의 코드이다.
 
 *예제 13-6. 단순한 자이썬 컨트롤러 서블릿*
 
 먼저, 애플리케이션의 진정한 드라이버가 될 *Main.java* 클래스를 생성한다. Main.java의 목적은 자이썬 개체 팩토리 패턴을 사용하여 자이썬 기반 스윙 애플리케이션을 자바로 강제변형하는 것이다. 이 클래스는 애플리케이션의 시작점이며 자이썬 코드는 그 아래에서 모든 작업을 수행할 것이다. 이 패턴을 통하여, 자이썬 코드를 통하여 구현할 수 있는 자바 인터페이스가 필요하므로, 이 예제는 또한 GUI를 볼 수 있도록 하는 데에 쓰이는 *start()* 메소드를 구현하는 매우 간단한 인터페이스를 사용한다. 끝으로, 아래와 같은 이름의 자이썬 클래스는 *Main.java* 드라이버와 자바 인터페이스를 위한 코드이다. 이 애플리케이션의 디렉토리 구조는 예제 13-8에서와 같다.
 
-*예제 13-8. Object Factory Application Code*
+*예제 13-8. 개체 팩토리 애플리케이션 코드*
 
     **JythonSwingApp**
         **JythonSimpleSwing.py**
 
 
 
-넷빈스를 사용한다면, 프로젝트를 clean 및 빌드할 때 JAR 파일이 자동으로 생성될 것이다. 명령행 또는 터미널에서는, *JythonSimpleSwing.py* 모듈이 클래스 경로 내에 있다면 *java -jar* 옵션을 사용하여 JAR 파일을 쉽게 생성할 수 있다. 넷빈스와 같은 IDE를 사용할 때에 좋은 또 다른 점은, 프로젝트의 속성에 대한 몇 가지 설정을 통하여 웹 스타트 애플리케이션을 만들 수 있다는 것이다. 구체적으로는, 프로젝트 속성으로 가서 왼쪽 메뉴에서 *Application - Web Start*\ 를 선택하고 *Enable Web Start* 옵션을 선택하면 필요한 파일의 생성을 IDE에서 처리해준다. 또한 넷빈스는 웹 스타를 통하여 다른 장비에서 애플리케이션을 구동할 때에 필요한 JAR 파일의 self sign 옵션을 갖고 있다. 한번 사용해보고, 변경을 가한 후에는 프로젝트를 clean 및 빌드하도록 하자.
+넷빈스를 사용한다면, 프로젝트를 clean 및 빌드할 때 JAR 파일이 자동으로 생성될 것이다. 명령행 또는 터미널에서는, *JythonSimpleSwing.py* 모듈이 클래스 경로 내에 있다면 *java -jar* 옵션을 사용하여 JAR 파일을 쉽게 생성할 수 있다. 넷빈스와 같은 IDE를 사용할 때에 좋은 또 다른 점은, 프로젝트의 속성에 대한 몇 가지 설정을 통하여 웹 스타트 애플리케이션을 만들 수 있다는 것이다. 구체적으로는, 프로젝트 속성으로 가서 왼쪽 메뉴에서 *Application - Web Start*\ 를 선택하고 *Enable Web Start* 옵션을 선택하면 필요한 파일의 생성을 IDE에서 처리해준다. 또한 넷빈스는 웹 스타트를 통하여 다른 장비에서 애플리케이션을 구동할 때에 필요한 JAR 파일의 self sign 옵션을 갖고 있다. 한번 사용해보고, 변경을 가한 후에는 프로젝트를 clean 및 빌드하도록 하자.
 
 웹 스타트 애플리케이션에서 필요한 파일을 수동으로 생성하려면, 애플리케이션 JAR의 외부에 둘 두 개의 부가적인 파일을 생성할 필요가 있다. 늘 하는 것과 같이 프로젝트를 위한 JAR를 생성하고, 애플리케이션을 구동시키는 데에 필요한 관련 JNLP 파일, 그리고 JNLP를 참조하는 HTML 페이지를 작성한다. 웹으로부터 애플리케이션을 실행시킨다면 원하는 위치에 HTML 페이지가 있어야 할 것이다. 예제 13-10는 HTML에 포함되는 것과 마찬가지로 JNLP를 생성하는 코드이다.
 
 WSGI와 Modjy
 ============
 
-*웹 서버 게이트웨이 인터페이스*의 약자인 WSGI는, 웹 서버와 웹 애플리케이션 간의 통신을 제공하는 저수준 API이다. 사실, WSGI는 그 이상이며 WSGI를 사용하여 완전한 웹 애플리케이션을 실제로 작성할 수 있다. 하지만 WSGI는 파이썬 메소드와 함수를 호출하는 표준 인터페이스에 가깝다. 파이썬 PEP 333은 다양한 웹 서버들 사이에서 웹 애플리케이션의 이식성을 높이기 위하여 제안된, 웹 서버들과 파이썬 웹 애플리케이션 또는 프레임워크 사이의 표준 인터페이스를 기술한다.
+*웹 서버 게이트웨이 인터페이스*\ 의 약자인 WSGI는, 웹 서버와 웹 애플리케이션 간의 통신을 제공하는 저수준 API이다. 사실, WSGI는 그 이상이며 WSGI를 사용하여 완전한 웹 애플리케이션을 실제로 작성할 수 있다. 하지만 WSGI는 파이썬 메소드와 함수를 호출하는 표준 인터페이스에 가깝다. 파이썬 PEP 333은 다양한 웹 서버들 사이에서 웹 애플리케이션의 이식성을 높이기 위하여 제안된, 웹 서버들과 파이썬 웹 애플리케이션 또는 프레임워크 사이의 표준 인터페이스를 기술한다.
 
 이 섹션에서는 *modjy*\ 를 활용하여 매우 간단한 "Hello Jython" 애플리케이션을 생성하기 위하여 WSGI를 활용하는 방법을 보인다. Modjy는 자이썬을 위한 WSGI compliant 게이트웨이/서버로서, Java/J2EE 서블릿에 기반하고 있다. modjy 웹사이트(http://opensource.xhaus.com/projects/modjy/wiki)에 의하면, modjy는 다음과 같이 묘사된다.
 
 
 modjy 애플리케이션을 자바 서블릿 컨테이너에서 구동하기 위한 첫 번째 단계는 WAR 파일로 포장할 자바 웹 애플리케이션을 생성하는 것이다. 다른 도구의 도움 없이 애플리케이션을 작성할 수도 있고 넷빈스 6.7과 같은 IDE의 도움을 받을 수도 있다. modjy는 2.5.0 버전 이후부터 자이썬에 포함되므로, 일단 웹 애플리케이션을 작성한 후에는 *jython.jar*\ 가 CLASSPATH에 있도록 해야한다. 끝으로, 애플리케이션 배포 기술자 (web.xml) 내에 modjy 서블릿에 대하여 설정할 필요가 있다. 이 예제에서는, 구글 앱 엔진을 위한 modjy 애플리케이션을, 로컬의 글래스피쉬 환경에 배포할 것이다.
 
-modjy를 위한 애플리케이션 배포 기술자를 설정하기 위해서는, modjy 서블릿을 설정하고, 필요한 매개변수를 제공한 다음, 서블릿 매핑을 제공한다. 예제 13-11에 나타난 구성에서, modjy 서블리 클래스는 *com.xhaus.modjy.ModjyServlet*\ 이다. 서블릿에서 필요로하는 첫 번째 매개변수의 이름은 *python.home*\ 이다. 이 매개변수의 값은 자이썬 홈과 같다. 다음으로, *python.cachedir.skip* 매개변수는 true로 한다.
+modjy를 위한 애플리케이션 배포 기술자를 설정하기 위해서는, modjy 서블릿을 설정하고, 필요한 매개변수를 제공한 다음, 서블릿 매핑을 제공한다. 예제 13-11에 나타난 구성에서, modjy 서블릿 클래스는 *com.xhaus.modjy.ModjyServlet*\ 이다. 서블릿에서 필요로하는 첫 번째 매개변수의 이름은 *python.home*\ 이다. 이 매개변수의 값은 자이썬 홈과 같다. 다음으로, *python.cachedir.skip* 매개변수는 true로 한다.
 *app_filename* 매개변수에는 호출할 수 있는 애플리케이션의 이름을 넣는다. 다른 매개변수는 여러분이 설정하는 각 modjy 애플리케이션과 똑같이 설정될 것이다. web.xml의 끝 부분에는 서블릿 매핑이 필요하다. 예제에서, 모든 URL을 modjy 서블릿에 매핑한다.
 
-*예제 13-11. Configuring the Modjy Servlet*
+*예제 13-11. modjy 서블릿 설정*
 
 *web.xml*
 ::
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.