본문 바로가기

JSP

2. JSP의 개요


2. JSP의 개요

2-1. JSP란 무엇인가?

(1) JSP와 Java의 관계

JSP는 Java Server Pages의 약자로서 선 마이크로시스템즈(Sun Microsystems)사의 자바 서블릿(Servlet) 기술을 확장시켜 웹 환경 상에서 100% 순수한 자바만으로 서버 사이드 모듈을 개발 하기 위한 기술이다.

JSP도 서블릿과 마찬기지로 서버 사이드에서 DBMS와 같은 백 엔드 서버(Back-end Server)와 연동하여 이들 백 엔드 서버의 데이터를 가공하여 웹 상의 최종적 사용자에게 디스플레이할 수 있고, 여러 조건에 따라 디스플레이할 수 있는 내용들을 동적으로 처리할 수 있는 기능을 제공하고 있다.

JSP는 웹 프로그래밍 언어들 중의 하나이다. 웹 프로그래밍 언어는 동적인 페이지를 생성하기 위한 서버 측 스크립트 언어이다. 그러한 언어들 중에서 JSP는 자바라는 언어를 기반으로 만들어진 것이며, 다음과 같은 특징을 갖고 있다.

- 객체 지향적
- 플랫폼 독립적
- 네트워크 지향적
- 뛰어난 보안성
- 멀티 쓰레드 기능
- 친근한 코드

JSP는 자바 언어가 갖는 특징들을 그대로 이어 받고 있다.

자바는
J2SE(Standard Edition),
J2EE(Enterprise Edition),
J2ME(Micro Edition)으로
나누어져 개발되는데 JSP는 J2EE를 구성하는 기술 중에 하나이다.

 [참고] J2SE, J2EE, J2ME와 서블릿, JSP와의 관계

서블릿과 JSP는 J2SE영역이 아니고, J2EE영역이기 때문에 JDK(J2SE)에서는 서블릿 관련 API가 없이 개발할 수 없다. 그러면 J2EE를 반드시 설치해야 하는가? 그렇지 않다. 톰캣(Tomcat)에 있는 servlet-api.jar 파일을 클래스패스(CLASSPATH)에 연결하면 된다. 만일 EJB를 개발한다면 J2EE을 설치하는 것이 좋다. 그렇지 않으면 톰캣에 있는 servlet-api.jar파일로 충분하다.

J2EE 설치 시 J2EE 환경은 J2SE 환경 위에서 운용되게 되므로 J2EE에 속하는 프로그래밍을 하기 위해서는 먼저 J2EE 환경은 J2SE 환경 위에서 운용되게 되므로 J2EE에 속하는 프로그래밍을 하기 위해서는 먼저 J2SE가 설치되어 있어야 하며 J2EE를 지원하는 서버가 준비되어 있어야 한다.


J2EE 컨테이너(Container)가 관리하는 컴포넌트(container-managed component) 그룹과 서비스 API(Service API)그룹으로 나누어진다.

* 컨테이너 측면과 서비스 API 측면을 구별하는 이유

- 각 분야마다 전문가들이 개별 컴포넌트 하나만 집중해서 개발하면 된다. 이미 개발되어 제공되는 서비스들 및 컨테이너를 연계하여 집중적인 튜닝을 통해 성능을 향상할 수 있다.
- 커넥션 풀링(Connection Pooling)과 같은 일반적으로 사용되는 컴포넌트나 서비스는 그쪽 전문가에게 맡기고, 일선 개발자들은 비즈니스 로직 개발에 집중할 수 있다.

(2) 컨테이너 (Container)

톰캣은 컨테이너의 좋은 예제이다. 아파치와 같은 웹 서버가 사용자로 부터 서블릿에 대한 요청을 받으면, 서블릿을 바로 호출하는 것이 아니라, 서블릿을 관리하고 있는 컨테이너에게 이 요청을 넘긴다. 여기서 컨테이너란 물론 서블릿이 배포(deploy)된 컨테이너를 말한다. 요청을 넘겨받은 컨테이너는 HTTP Request와 HTTP Response 객체를 만들어, 이를 인자로 서블릿 doPost()나 doGet()메소드 중 하나를 호출한다.

컨테이너는 서블릿과 웹 서버가 서로 통신할 수 있는 손쉬운 방법을 제공하고, 서블릿의 생명주기(라이프 사이클)을 관리하고, 요청이 들어 올때 마다 생기는 스레드에 대한 멀티 스레딩을 지원하며, 보안 관리, JSP를 지원한다.

J2EE에서는 두 가지 타입의 컨테이너를 제공한다. 웹 컨테이너(Web Container)와 EJB 컨테이너(EJB Container)이다. 웹 컨테이너(Web Container)는 서블릿(서블릿 컨테이너)과 JSP(JSP 컨테이너)에 대한 실행 환경을 제공하고, EJB 컨테이너(EJB Container)는 Enterprise JavaBean에 대한 실행 환경을 제공한다.

- Servlet 컨테이너 : 서블릿을 동작 시킬수 있는 환경을 제공하는 서버 프로그램이다. 즉 HTTP 요청을 받아서 해당 서블릿을 동작을 시키고 그 결과를 사용자의 브라우저로 전달을 해줄 수 있는 기능을 제공한다. 보통 컨테이너라고 하는 이유는 서블릿 프레임워크 안에서 동작을 하고 서블릿이 동작할 수 있는 환경을 제공해주며, 기타 필요한 작업등을 제공해주기 때문에 그렇게 얘기를 한다. 즉 HTTP 파라미터 파싱 및 결과 전달 컨트롤, Forwarding, Redirecting 등의 기능을 컨테이너에서 제공을 해준다. 이때 서블릿 개발자는 자신이 만든 서블릿을 이 컨테이너에 등록 하게 되고, 실제 동작을 컨테이너가 알아서 하게 되기 때문에 사용되는 언어입니다.

- JSP 컨테이너 : 실제로 JSP 컨테이너의 의미는 서블릿 컨테이너의 개념과 동일이다. 그렇지만 조금 자세히 보면 실제로 JSP 컨테이너라는 것은 별도로 존재하지 않는다. 실제로는 서블릿 컨테이너가 JSP 컨테이너가 된다. 그 이유는 JSP는 PHP/ASP와 같이 완전히 스크립트 형식으로 동작하지 않고 서블릿으로 변환이 된 이후에 실행되기 때문이다. 그리고 JSP를 서블릿으로 컴파일을 해주는 것이 바로 JSP 엔진입니다. 다른 프로그램은 잘 모르겠지만 톰캣의 경우에는 JSP엔진이 바로 JSPServlet 이다. 즉 JSP를 컴파일하고 동작을 시켜주는 것을 특정 서블릿이 담당하고 있습니다. 여기서 보면 JSP 자체가 완전한 서블릿으로 컴파일 되지 않는 다는 것을 알 수 있다. 즉 JSPservlet이 구동 할 수 있는 형태의 서블릿으로 바뀌게 된다. 그런 의미에서 보면 별도의 JSP 컨테이너가 있다고 할 수 도 있을 것 같다. 결과론적으로 JSP 컨테이너는 서블릿으로 변환하는 파싱과정이 하나 더 켜있는 것이고, 나머지는 똑같다고 볼 수 있다.

- EJB(Enterprise Java Bean) 컨테이너 : EJB 스펙은 확장 기능하고, 다중 사용자 처리에 안전한 트랜잭션 기능을 인식하는 분산된 비즈니스 어플리케이션 컴포넌트들을 개발하기 위해 필요한 표준화된 모델을 제공한다. EJB는 비즈니스 로직을 구현한 각종 컴포넌트들을 서버에 분산시킴으로써 지속성 있는 데이터를 객체 지향적인 방식으로 표현할 수 있도록 해준다.

 [참고] 톰캣(Tomcat) - 웹 컨테이너

"JSP는 서버 측에서 동작하고 웹 서버와 연동이 돼서 동적인 페이지를 생성한다."라고 요약할수 있다. 이는 JSP가 동작하는 곳이 서버의 환경이라는 것이다. 이는 JSP를 사용하기 위해서는 서버 환경이 구축돼야 하며, 기본적으로 웹 서버와 웹 컨테이너가 설치되어 있으면 된다. 대부분의 웹 컨테이너에는 웹 서버 기능을 가지고 있다. 이에 <웹 서버 + 웹 컨테이너 + 웹 어플리케이션 서버>의 기능을 가지고 있는 톰캣(Tomcat)을 많이 사용한다.
톰캣은 웹 컨테이너일 뿐, 완벽한 J2EE 애플리케이션 서버가 아님을 기억하자. 따라서 톰캣에는 EJB 컨테이너가 없다.


(3) 서비스 API(Service API)

가. JDBC 2.0 API
J2EE의 한 구성요소로 표함 된 JDBC 2.0 API는 DataSource나 분산 트랜잭션 지원과 같은 향상된 기능을 제공한다. DataSource 객체는 데이터베이스 리소스 풀링을 처리하고, 분산 트랜잭션 지원 기능은 분산된 기업형 컴포넌트들이 하나의 단일 트랜잭션을 이룰 수 있도록 해 준다.

나. XML(eXtensible Markup Language)
J2EE에서는 디플로이먼트 디스크립터(deployment descriptors)를 작성하는 포맷으로 XML을 채택한다. 디플로이먼트 디스크립터는 J2EE 어플리케이션의 환경을 설정하는데 쓰인다.

다. JavaMail
많은 대규모의 어플리케이션들에서 이메일 메시지를 보내고, 읽을 수 있는 능력을 요구하는데, J2EE에서는 JavaMail API를 보유하고 있다.

라. JTA(Java Transaction API)
J2EE에서는 EJB 등과 같은 컴포넌트들에 대한 트랜잭션 관리를 자동화해 줄 수 있는 스펙을 정의한다. JTA는 컨테이너 내에 상주하면서, 다중 컴포넌트들과 다중 데이터 원본들에 대해서 까지도 트랜잭션을 적용할 수 있도록 해 준다.

마. JMS(Java Messaging System)
JMS는 컴포넌트끼리 비동기적이며, 발생한 에러에 쓰러지지 않고 잘 견뎌낼 수 있는(fault-tolerant : 무정지 네트워크의 구현) 어플리케이션 메시지를 주고 받을 수 있도록 해 주는 표준적 API를 제공한다. JMS는 메시지 큐(message queue)라 불리는 소프트웨어를 통해 구현되는 경우가 많다. 메시지 큐는 컴포넌트들 사이의 메시지의 통신을 위한 일종의 허브(hub) 역할로, 책임 지고 메시지를 받아서 전달해 주는 매개 역할을 한다. 메시지 전달에 메시지 큐를 사용하면, 비록 실시간으로 메시지 통신이 일어나지 않더라도 메시지 통신에 일관성이 지켜지도록 해 준다.

바. JNDI(Java Naming and Directory Interface)
JNDI는 기업형의 네이밍과 디렉토리(naming and directory service)에 대해 접근할 수 있도록 해주는 API로 분산환경의 서버들 간의 객체를 공유하는 방법을 제공한다. DNS(Domain Name System)도 일종의 네이밍 서버로 시스템에서 이용되는 어떤 이름(name)들의 영역을 관리하는데 쓰이며, 각종 시스템들 사이에 이름(name)을 번역해 주는 일을 수행한다.

출저 : http://blog.naver.com/yswon72


'JSP' 카테고리의 다른 글

3. JSP의 동작 구조  (0) 2010.12.26
1. 웹 프로그래밍의 이해  (0) 2010.12.26