웹과 JSP 프로그래밍의 이해
1. 인터넷과 웹의 개요
인터넷과 웹
인터넷 - 컴퓨터가 서로 연결되어 TCP/IP라는 통신 프로토콜을 이용하여 정보를 주고받는 전 세계 컴퓨터 네트워크
(TCP/IP : 컴퓨터 사이의 통신 표준 및 네트워크의 라우팅 및 상호연결에 대한 자세한 규칙을 지정하는 프로토콜 스위트)
(통신 프로토콜(통신 규약)은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식.)
웹 - 인터넷에 연결된 컴퓨터들을 통해, 사람들이 정보를 공유할 수 있는 정보공간
인터넷은 전세계 컴퓨터 통신 네트워크를 말하고, 웹은 그 인터넷을 이용하여 정보공유하는 공간이다. (WWW. ~~)
웹의 동작원리
웹은 기본적으로 클라이언트/서버 방식으로 동작.
클라이언트(웹브라우저)가 특정 페이지를 웹서버에 요청하면 웹서버는 그 페이지를 클라이언트에게 보내어 응답한다.
좀더 자세히, 클라이언트가 서버에 HTML 페이지나 파일을 요청하면 서버가 이에 응답하여 HTML페이지나 파일을 클라이언트에게 제공하는 장소가 바로 웹이다.
가장 널리 쓰이는 웹서버는 아파치, 톰캣, IIS 등이다.
2. 정적 웹페이지와 동적 웹페이지
URL
-> 인터넷의 자원의 위치를 나타냄. 서버에게 서비스를 요청할 때 URL을 요청한다.
정적 웹페이지
-> 컴퓨터에 저장된 텍스트파일을 그대로 보는것.
HTML은 가장 단순한 웹 언어이다. 서버에 HTML, 자바스크립트, 이미지 등을 저장해두고, 클라이언트가 특정 HTML문서를 요청하면 전송해준다.
정적 웹페이지 동작방식
- 사용자가 웹브라우저에게 URL을 입력하여 요청. (웹페이지를.)
- 웹서버가 ~~.html 파일 검색
- 웹서버에서 준비돼있던 HTML문서 그대로 클라이언트에 전달
- 웹브라우저가 HTML문서 보여줌
단점
- 미리 만들어놓은 정보만 보여줌. 고객 변화에 대응 못함. (몇백명의 고객이 모두 똑같은 페이지 밖에 못봄)
- 사용자의 기호에 맞게 능동적으로 변화하는 웹페이지가 필요. (각 학생별 이클래스 화면, 사용자별 메일화면 등)
- 새로운 것을 추가, 수정, 삭제 할 때도 모두 수동으로 해야함. 관리어려움
장점
- 동적요소 없으므로 데이터베이스 필요없고 구축하기 쉬움
- 단순 문서로만 이루어져 있어 서버간 통신이 거의 없고 속도가 빠름 (서버끼리도 통신을하나..?)
- 정적문서로만 이루어졌기 때문에 모든 호스팅 서버에서 동작할 수 있음. (호스팅:서버컴퓨터의 공간 빌려주는 서비스)
동적 웹페이지
사용자가 웹페이지에 글을 작성하거나 환경설정 등을 바꾸면 그 내용이 서버에 있는 데이터베이스에 저장되고 결과가 웹페이지에 반영되는 형태로 동작한다.
동적 웹페이지의 동작방식
- 사용자가 웹브라우저에 URL입력하여 요청
- 해당 URL의 웹서버에서 요청 분석
- 데이터베이스 연동이 있다면 이를 처리
- 웹서버는 그 결과 전송받아 HTML문서로 생성
- 요청에 맞게 정제된 html문서를 클라이언트에게 보내고
- 웹브라우저가 html문서를 보여준다.
3. 서블릿과 JSP
웹프로그래밍 언어는
1. 클라이언트 측 실행언어
2. 서버측 실행언어 --> 서블릿 , JSP 로 나뉜다.
원래는 자바를 기반으로 하는 서블릿을 먼저 개발했으나 서블릿개발이 어려워서 HTML코드에 직접 자바코드를 삽입할 수 있도록 개발된 기술이 JSP이다.
서블릿의 개념과 특징
- 서블릿 - 자바를 사용하여 웹페이지를 동적으로 생성하는 서버 측 웹프로그래밍
- 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종 !!!!!!!!!
- JSP가 HTML문서안에 자바 코드를 포함하고, 서블릿은 자바코드안에 HTML 포함함.
- 서블릿은 이식 가능함 - 서블릿은 자바로 작성하기 때문에 플랫폼 독립적임 - 윈도우운영체제(서버:glass fish)에서 서블릿 만들고 나중에 유닉스, 리눅스(서버 : Apache Tomcat)같은 다른 운영체제에서 실행할 수 있음.
- 웹서버는 경량 스레드를 사용해서 서블릿을 호출하므로 자바의 멀티스레딩 기능을 사용하여 여러 클라이언트 요청을 동시에 서블릿에서 채울 수 있음. // CGI(Common Gateway Interface - 서버가 모든 클라이언트 요청에 대해 새로운 프로세스를 시작해야 함.)와 다르게 확장가능
- 서블릿은 자바의 주요기능을 상속해서 메모리 관리 문제 및 메모리 낭비 줄일 수 있음. (가비지 컬렉터, 예외처리, 자바보안관리자 등)
JSP의 개념과 특징
- HTML 내에 자바코드 삽입. HTML표준에 따라 작성되므로 웹디자인 하기 편리.
- 웹서버에서 동적으로 웹페이지 생성하여 웹브라우저에 전달하는 서버측 스크립트 언어.
- JSP는 실행 시 자바 서블릿으로 변환된 후 실행됨.
- JSP 태그 라이브러리를 사용하면 자바 코딩 없이 태그만으로 간단한 적기 가능. -> 생산성 좋음.
- JSP에서는 서블릿의 모든 기능 사용가능.
(아직 이해 안되거나 모르는 내용)
- 코드를 수정할 때 서블릿에서는 업데이트를 하고 다시 컴파일해야 함. JSP는 다시 컴파일하고 프로젝트를 배포할 필요가 없다.
- JDBC, JNDI, EJB 등 모두 포함하고 있는 엔터프라이즈 자바 API를 사용할 수 있음.
- 쉽게 개발할 수 있도록 JSP에서는 내장객체, 미리정의된 태그, 표현식언어와 사용자정의 태그 사용가능.
- 서블릿은 프레젠테이션 로직과 비즈니스 로직이 섞여있으나 JSP기술은 그 두 로직을 분리할 수 있기 때문에 관리가 쉽다.
- JSP는 액션태그, 사용자 정의 태그 등 다양한 태그와 표현언어, 내장객체 등을 사용함으로써 서블릿보다 코드를 줄일 수 있다.
4. 서블릿과 JSP의 동작과정
서블릿의 동작과정
- 클라이언트가 URL 입력하면 해당 HTTP Request(요청)을 서버의 서블릿 컨테이너로 전송. HTTP Request를 전송받은 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성함.
- 배포 서술자 web.xml을 기반으로 사용자가 요청한 url을 분석하여 "어느 서블릿 객체에 대한 요청인지" 찾음.
- 해당 서블릿 객체에서 service 메소드를 호출, ㅋㄹ라이언트의 POST, GET여부에 따라 doGET() 또는 doPOST() 호출. doGET()과 doPOST() 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보냄.
- 웹서버는 정적 웹 페이지 처럼 *.class의 실행결과를 웹브라우저에 응답으로 전달하므로 웹브라우저는 새로 가공된 html 페이지를 동적으로 처리한 결과를 보여줌. 웹브라우저는 새로 가공된 html페이지를 동적으로 처리한 결과를 보여주는 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킴.
JSP의 동작과정
- 웹브라우저가 웹 서버에 JSP를 요청. 웹서버는 Hello.jsp에서 jsp확장자 보고 "JSP페이지구나." 생각하고 웹서버에 있는 JSP컨테이너에 전달.
- JSP 컨테이너는 JSP 페이지를 서블릿프로그램인 Hello_jsp.java 로 변환(번역)한다.
- JSP컨테이너가 서블릿 프로그램을 컴파일하여 Hello_jsp.java로 만들고 이를 웹서버에 전달한다.
- 웹서버는 정적 웹페이지처럼 *.class의 실행결과를 웹브라우저에 응답으로 전달하므로 웹브라우저는 새로 가공된 html 페이지를 동적으로 처리한 결과를 보여준다.
5. 서블릿과 JSP의 생명주기
서블릿의 생명주기
- 로딩단계 - 서블릿객체가 처음 요청된 경우, 서블릿 클래스를 메모리(사용자공간에 웹브라우저 응용프로그램이 적재되어있음)에서 로딩하여 객체를 생성해야 한다. 생성된 객체는 메모리에 게속 존재하기 때문에 이후부터는 서블릿객체가 새로 생성되지 않고, 메모리에 있는 서블릿 객체를 사용한다.
- 초기화 단계 : init() 메소드 - 서블릿이 처음 요청될 때 초기화하는 메소드. 객체가 생성되면서 최초에 한번만 호출된다. 해당 서블릿 클래스를 호출할 경우 init() 메소드를 호출할 필요 없이 기존에 있던 서블릿 클래스를 호출하면 된다.
- 실행단계 : service() 메소드 - 서블릿 컨테이너가 요청을 받고 응답을 줄 때 필요한 서블릿의 메소드. 서블릿 인터페이스를 구현한 HttpServlet 클래스의 doGet(), doPost() 등의 메소드가 호출된다. 클라이언트의 요청이 있을 때, GET, POST 여부에 따라 실행된다. 여러 클래스가 동시에 요청하더라도 스레드가 생성되므로 수행속도 빠르다.
- 소멸단계 : destroy() 메소드 - 서블릿 클래스가 더이상 사용되지 않으면 서블릿 컨테이너는 주기적으로 destroy()메소드 호출하여 제거한다. 제거된 서블릿 클래스 다시 사용하려면 init() 메소드를 다시 호출해야 한다.
JSP 생명주기
- 번역단계 - JSP컨테이너가 JSP소스파일 -> 자바코드(서블릿)로 변환함. (그림에서는 Hello.jsp에 대한 요청이 Hello_jsp.java 파일로 변환됨.) // 번역단계에서 생성된 자바코드 = 서블릿. (첫단계부터 서블릿으로 바꿔서 진행.)
- 컴파일단계 - 원래 자바는 클래스파일로 컴파일 되잖어. 그냥 .java 파일을 컴파일하여 .class 파일로 만드는 단계. JSP페이지 내의 선언문, 처리문, 표현문, 등의 스크립트 태그를 사용하여 삽입된 자바 코드의 구문 오류를 검사한다.
- 로딩 및 초기화단계 : jsplnit() 메소드 - JSP컨테이너가 앞의 두 단계에서 생성된 *.class를 로딩하고 클래스의 인스턴스(객체는 붕어빵 개념, 인스턴스는 실제 붕어빵들.)를 작성한다. 이때 JSP컨테이너는 서블릿의 init() 메소드, 즉 jspInit() 메소드를 호출하여 인스턴스가 된 객체를 초기화한다. 일반적으로 초기화는 한번 만 수행되고, 데이터베이스 연결, 파일 열기, 룩업테이블 생성 등을 초기화한다.
- 실행단계 :_jspService() 메소드 - 실행 단계에서는 각 클라이언트의 요청에 대해 JSP컨테이너가 요청 및 응답객체 전달한다.이 단계는 JSP생명주기가 끝날 때 까지 지속적으로 모든 클라이언트의 요청에 대해 상호작용한다.
- 소멸단계 : jspDestroy() 메소드 - JSP 생명주기를 완료. JSP컨테이너는 실행되고있는 JSP를 jspDestroy() 메소드를 사용하여 제거. jspDestroy() 메소드는 서블릿의 destroy() 메소드에 해당. 이 메소드는 DB 연결해제 또는 열려있는 파일 닫기 등을 수행해야할 때 jspDestroy() 메소드를 오버라이딩.