경진의 블로그

JSP 본문

자바개발과정/기타(ETC)

JSP

aith 2008. 6. 17. 01:04
JSP

자바 서버 페이지 개요

1. JSP는 서버에서 동적 웹 컨텐츠를 생성하는 데 자바를 사용할 수 있도록 지원하는 기술이다.

2. JSP의 정점으로 강력한 이식성, 빠른 수행 속도, 프리젠테이션 로직과 비즈니스 로직 분리, 컴포넌트의 재사용, 커스텀 태그의 사용으로 인한 개발 편의성 등이 있다.

3. 서블릿 컨테이너는 지정된 URL에 대하여 설정된 특정한 서블릿에 요청된 서블릿이나 JSP 파일을 실행하고 그 결과를 웹 서버에 넘겨주는 역할을 한다.

자바 서버 페이지의 기본

1. JSP에서 사용되는 스크립트 언어는 자바이다.

2. JSP의 태그는 주석, JSP지시어 스크립트 요소 그리고 액션으로 나눌수 있다.

3. 주석은 HTML 주석, 자바 스타일 주석, 그리고 <%-- --%>주석이 있다.

4. 지시어에는 page, include, taglib이 있다.

5. page지시어는 JSP 페이지에 대한 속성을 지정하는 데 사용되는 지시어이다.

6. include지시어는 해당 JSP파일에 지정된 파일을 삽입하도록 하는 지시어이다.

7. taglib지시어는 해당 페이지가 해당 애플리케이션에 필요한 기능을 구현한 커스텀 태그를 사용한다고 JSP컨테이너에게 알려주는 역할을 한다.

8. 스크립트 요소는 선언문, 스크립틀릿, 표현식으로 나뉜다.

9. 선언문 태그는 페이지에 삽입된 코드를 통해 변수나 메소드를 선언하는데 사용된다.

10. 스크립틀릿 태그는 JSP 페이지 내의 스크립트를 작성하는 데 사용된다.

11. 표현식 태그는 JSP페이지 내에서 직접 클라이언트로 출력 될 내용(텍스트)을 포함시키는 데 사용된다.

내장 객체와 액션

1. 내장 객체는 페이지 작성자가 선언한 변수가 아니라 JSP 컨테이너가 JSP 파일에 대한 서블릿 생성시에 정의하는 객체들이다.

2. 내장 객체에는 request, response, pageContext, session, application, out, config, page, exception이 있다.

3. request 객체는 클라이언트의 요청정보를 담고 있는 객체이다.

4. response 객체는 요청을 시도한 클라이언트로 전송할 응답(HTTP Response) 을 나타내는 객체이다.

5. pageContext 객체는 JSP 페이지와 관련된 프로그램 코드에서 다른 내장 객체를 얻거나 하나의 페이지에서 다른 페이지로 요청 처리 제어권을 임시, 혹은 영구적으로 넘겨주는 데 사용한다.

6. session 객체는 웹 서버와 클라이언트간의 세션데이터를 저장하고 있는 객체이다.

7. application 객체는 특정 웹 애플리케이션이 실행되는 실행 환경에 대한 정보를 담고 있는 객체이다.
 
8. out객체는 JSP파일에 대한 서블릿이 요청을 처리하여 응답을 전송할 때 전송할 응답에 대한 출력 스트립 객체이다.

9. config 객체는 JSP페이지에 대한 서블릿 인스턴스가 참조하게 될 초기 설정 데이터에 대한 정보를 담고 있는 객체이다.

10. page 객체는 JSP 페이지에 생성되는 서블릿 인스턴스 객체를 참조하는 레퍼런스이다.

11. excepton 객체는 JSP페이지 작성자가 페이지에서 발생한 예외를 처리할 페이지를 지정한 경우 지정된 에러 페이지에 전달되는 예외 객체이다.

12. 내장 객체 session, request, application 들은 그 성격상 해당 객체에 정의된 속성들의 유효한 범위를 갖는다. 즉, session속성은 클라이언트와 세션이 유지되고 있는 동안 유효하고, request속성은 요청을 시도한 클라이언트의 요청을 처리하는 동안 유효하며, application 객체 속성은 해당 웹 어플리케이션이 실행 되는 동안 유효하다.

13. 액션은 페이지 내에서 공통적으로 요구되는 기능을 XML 기반의 태그로 구현한 것이다.

14. 액션에는 forward 액션, include액션, useBeen액션, plugin 액션이 있다.

15. forward액션은 현재 페이지의 요청 처리 제어권을 지정된 지정한 페이지로 영구히 넘겨주기 위해 사용된다.

16. include 액션은 현재 페이지에 다른 페이지를 끼워 넣기 위해서 사용된다.

17. useBeen액션은 서버측에 존재하는 자바 빈즈 컴포넌트와 통신을 위한 기능을 구현한 내장 액션이다.

자바 빈즈

1. 자바 빈즈 컴포넌트는 자바 언어로 쓰여진 하나의 자바 클래스이다.

2. 자바 빈즈 컴포넌트를 사용하는 목적은 프리젠테이션 로직과 비즈니스 로직의 분리, 컴포넌트 재사용 및 공유의 용이성, 웹 애플리케이션의 OOP(객체 지향)적인 설계를 들 수 있다.

3. 자바 빈즈 컴포넌트로 사용되기 위해서는 생성자는 파라미터가 없어야 하고, 자바 빈즈 컴포넌트의 속성(Property)들은 읽기, 쓰기 중 적어도 하나이상의 기능을 수행 할 수 있어야 한다. 또한 getXXX()는 파라미터를 받지 않는 구조이어야 하며 setXXX()는 반드시 하나의 파라미터를 받는 구조이야한다.

4. 자바 빈즈 컴포넌트의 객체를 생성하기 위해 태그를 사용한다.

5. 자바 빈즈 컴포넌트의 속성에 값을 설정하기 위해 태그를 사용한다

6. 자바 빈즈 컴포넌트의 속성 값을 불러오기 위핸 태그를 사용한다.

7. 자바 빈즈 컴포넌트는 4가지 영역(page, request, session, application) 중 하나로 선언되어야 한다. 8. 자바 빈즈 컴포넌트의 디폴트 영역은 page이다.

세션 관리

1. HTTP 프로토콜은 Stateless한 특성을 가진다.

2. 세션이라 함은 서로 다른 두 호스트, 즉 클라이언트와 서버간에 네트워크 커넥션이 지속적으로 유지되고 있는 상태를 의미한다.

3. HTTP 세션이 종료되는 시점은 클라이언트의 세션 아이디가 무효화 되는 시점이다.

4. 쿠키는 클라이언트의 상태정보를 서버로 전송하기 위해 사용할 수 있는 방법 중 하나로 클라이언트에 저장되는 단순한 텍스트 이다.

5. 쿠키를 설정하는 방법에는 HTTP 헤더를 이용한 방법과 서블릿 SPI를 이용한 방법이다.

6. JSP에서 HTTP세션 관리를 위해 기본적으로 javax.servlet.http.HttpSession 인터페이스를 사용한다.

7. 특정 클라이언트에 대한 상태정보를 서버측에 저장하기 위해서 HttpSeesion 객체의 (session) setAttribute()를 사용한다.

8. 특정 클라이언트에 대한 상태정보를 클라이언트 측으로부터 불러오기 위해서 HttpSession객체의 (session) getAttribute()를 사용한다.

9. 세션 유지를 위해 HttpSession 객체가 생성되는 것과 동시에 고유한 세션 아이디를 생성하여 이를 쿠키에 담아 해당 클라이언트로 전송한다. 이후에는 이 세션 아이디를 기준으로 클라이언트의 상태정보를 관리하게 된다.

10. HttpSessionBindingListener를 사용하면 동시 사용자수를 구하는 것과 중복 로그인 방지 기능을 구현 할수 있다.

11. HttpSessionBindingListener의 valueBound()와 valueUnbound()를 구현하면 세션 유지에 관련된 보다 확장된 기능의 구현이 기능하다.

파일 업로드

파일을 업로드 하려면 폼 태그의 method속성은 POST 방식, enctype 속성은 mulipart/form-data로 지정해야 된다. 파라미터는 직접 가져울 수 없고, 데이터를 파싱해야 얻을 수 있는데, 업로드 모듈을 사용하는 것이 편하다.

1. MultipartRequest는 COS 라이브러리에서 제공하는 파일 업로드 컴포넌트 이다.

2. MultipartRequest는 내부적으로 MultipartParser를 사용한다.

3. MultipartRequest의 특징은 안정적인 동작, 손쉬운 한글처리, 중복 파일 처리 인터페이스를 들 수 있다.

4. MultipartRequest 외에도 jspSmartUpload, NewtakeUploadPro 그리고 Jakarta Commons의 FileUpload 등의 파일 업로드 컴포넌트가 있다.

※ include 지시어의 대상이 되는 파일이 수정되더라도 include 지시어를 사용하는 파일이 리로드되지 않으면 그 수정내용은 반영되지 않는다. 이러한 문제는 톰캣 4.1대 부터 JASPER2엔진을 이용하면서 해결되었고 OC4J의 경우도 R3에서부터 해결되었다.

※ 선언문과 Thread-Safe문제
선언문을 이용하여 멤버 변수나 멤버 메소드를 선언 할 경우 다중 스레드로 인하여 동시에 사용되는 문제가 발생될 수 있다. 되도록이면 사용을 자제하도록 하고 꼭 필요한 경우라면 static으로 선언하여 스레드로 인한 문제가 발생되지 않도록 하는 것이 좋겠다.

서블릿 컨테이너? JSP 컨테이너? 웹 서버?

서블릿 컨테이너는 클라이언트 요청에 서블릿 인스턴스를 생성하거나 해당 인스턴스에 대한 요청을 처리할 스레드를 생성하고 관리하는 서버측의 자바 프로그램이다. 예전에는 서블릿 엔진이라는 용어를 사용하였으나 정식 문서에서는 서블릿 컨테이너라는 용어를 추천하고 있다. JSP 컨테이너는 JSP 파일에 대한 요청이 들어올 때 해당 파일에 대한 자바 원시 코드를 생성, 컴파일하고 이를 통하여 자바의 객체(서블릿 인스턴스)를 생성하는 일을 하는 자바 프로그램이다. JSP 컨테이너라는 용어 역시 굳이 JSP 맥락에서 설명할 때 사용하는 것이지 일반적으로 서블릿 컨테이너와 동일한 프로그램이다. 일반적으로 웹 서버 (HTTP 서버)는 서블릿 컨테이너(혹은 JSP 컨테이너)와는 별개의 프로세스로 실행되며 대부분이 자바로 작성된 프로그램이 아닌 경우가 많다. 이런 경우 서블릿 컨테이너는 우베 서버가 시작될 때 웹 서버와는 독립적인 프로세스로 생성되어 실행 되다가 우베 서버 프로세스와 함께 종료된다. 그러나 때에 따라서는 서블릿 컨테이너가 기본적인 웹 서버의 기능을 겸하고 있는 경우가 있는 데 이런 경우는 서블릿 컨테이너나 웹 서버가 동일한 프로세스로 작동하는 경우이다. 대부분의 경우 서블릿 컨테이너가 자체적으로 기본적인 웹 서버기능을 내장하고 있는 형태로 제공된다. 아파치 자카르타 프로젝트의 톰캣(Tomcat), 카우초(Caucho)의 레진(Resin), IBM의 웹스피어(WebSphere), 오라클(Oracle)의 OC4J 그리고 BEA의 웹로직(WebLogic)과 같은 서블릿 컨테이너가 자체적으로 HTTP 서버(웹서버)기능을 가지고 있는 경우가 대부분이다. 이 때문에 서블릿 컨테이너와 웹 서버라는 용어를 동일한 의미로 사용하는 경우도 있다. 또한 요즘 대부분의 JSP 컨테이너는 자체적으로 서블릿이다. JSP뿐만 아니라 웹 서버의 기능을 내장하는 형태로 제공되고 있으나 이들은 기본적인 HTTP서버의 기능만을 구현하고 있기 때문에 자체적으로 서블릿이나 JSP를 지원하고 있지 않은 대부분의 상용 웹 서버나 아파치와 같은 전용 웹 서버에 애드온(Add-On) 형태로 플러그인 할 수 있도록 설정 파일을 제공하고 있다.

JDBC 커넥션 풀 (Conneciton Pool)

커넥션을 가져오는 일은 자원 소모가 크고 시간이 많이 걸리는 일이다. 한번 사용한 커넥션을 버리지 않고 재활용하는 커넥션 풀이 있다.

풀은 일반적으로 Vector와 같은 타입의 객체를 통해서 구현 되고, 이 안에 담겨있는 Connection 객체는 DB와 연결을 지속하면서 포트를 점유한 상태로 있다 웹 애플리케이션은 이 풀에서 놀고 있는 커넥션 하나를 물어와서 실행 한 후에 커넥션을 완전히 닫아 버리는 대신에 Pool에 돌려주어서 사용할 수 있는 상태로 만들어 놓는 방법이다.

http://www.javastudy.co.kr/docs/jhan/javaadvance/8-3.htm

프리젠테이션 로직? 비즈니스 로직?

프리젠테이션 로직이란 말 그대로 보여주기 위한 로직을 말한다.
즉, 화면상의 디자인 구성을 위한 로직을 일컫는 말로써, 게시판에서 게시물 목록을 화면에 표시하기 위한 for(or while)문 등의 사용이 여기에 해당된다.

반면 비즈니스 로직이라는 것은 어떠한 특정한 값을 얻기 위해 데이터의 처리를 수행하는 응용프로그램의 일부를 말한다. 즉, 원하는 값을 얻기 위해서 백엔드에서 일어나는 각종처리를 일컫는 말이다.
예를 들자면 위의 예제에서 처럼 오늘 날짜를 구해오는 로직이 여기에 해당된다.

JSP와 자바 빈즈를 사용하는 구조에서 일반적으로 JSP는 프리젠테이션 로직을 담당하고, 자바 빈즈는 비즈니스 로직을 담당한다.

자바 빈즈

자바 빈즈 컴포넌트로 사용할 클래스 파일은 어디에 저장하지?

사실 필자도 처음 자바 빈즈라는 것을 알고 사용해 보려 했을 때 다소 막막함을 느꼈던 것이 사실이다.

내가 만들어 놓은 class파일이 적용되려면 classpath에 추가가 되어야 할 텐데, 그럼 웹 서버를 다시 재시작 시켜야 하나? 너무 번거로운대...;

우리가 class 파일을 만들 때 마다 별도의 classpath에 추가하면, 서로 다른 개발자들의 취향에 따라 디렉토리를 선정할게 뻔하기 때문에 개발자들 사이에 혼란이 올 가능성이 크다. 물론 처음부터 끝까지 혼자서 다 하겠다면 할 말은 없지만, 서블릿을 먼저 공부하였다면 이미 알고 들어 왔을 이미 알고 들어 왔을 이야기이지만(애석하게도 필자는 서블릿 보다 JSP를 먼저 공부했다) 모든 웹 애플리케이션의 루트 아래에는 WEB-INF라는 디렉토리가 존대 한다. 이 디렉토리 아래에는 classpath와 관련하여 또다시 두개의 디렉토리가 있다. 하나는 classes이고, 또 하나는 lib이다. 여기의 classes 디렉토리가 바로 class파일들을 저장해 두는 디렉토리이다.

즉, classpath추가의 불편함을 없애고 좀더 유연한 관리를 위해 서블릿과 자바 빈즈 컴포넌트로 사용할 class파일들을 이 디렉토리에 넣어 사용한다. 두번째 lib디렉토리에는 classes와 비슷하지만, 약간 다른 면이 있다. lib디렉토리에는 class 파일을 직접 넣는 것이 아니라 class 파일의 묶음인 jar 파일을 넣어두는 디렉토리이다 (lib에 넣었을 경우엔 서블릿 컨테이너에 따라 다르나 일반적으로 재시작해야 인식한다.)

다시 한번 정리해서 말하자면 우리가 만든 class 파일은 웹 애플리케이션의 루트 아래 WEB-INF/classes 디렉토리에 넣거나 WEB/lib에 jar로 묶어서 넣어 두면 되는 것이다.
Tag
0 Comments
댓글쓰기 폼