-
서블릿 구현및 실행Servlet 2019. 2. 20. 07:57
서블릿 구현및 실행
서블릿은 주로 웹서버에서 동작하는 애플리케이션을 구현할 때 사용한다.
서블릿을 사용하기 전에 웹서버에서 외부 프로그램을 호출하고 .
수행결과를 웹 브라우저로 전송하는 CGI(Common Gateway Interface)라는 기술을 사용했다.
그러나 접속자가 많아질수록 처리 효율이 떨어지는 단점이 존재
서블릿은 이런 시점에 썬마이크로 시스템즈가 발표한 기술.
수행상의 흐름과 구조를 익히고 웹서버 애플리케이션의 의미를 점검한다.
웹애플리케이션
서블릿을 만드는 목적 - 클라이언트에게 서비스 하기위해
서버에는 서블릿이 필요.
웹서버와 서블릿이 어떤구조 이며 , 클라이언트가 서블릿에 접근하는 방법을 알아봄
웹 애플리케이션 접근
클라이언트는 웹서버에 서비스를 요청할때 URL을 보냄
서버는 요청받은 URL을 다음과 같이 활용
예) http://70.12.200.93:8080/edu/index.jsp
1 2 3 4
1. IP가 70.12.220.93인 컴퓨터를 찾아감
2. 8080 포트를 사용하고 있는 서버를 찾아감
3. edu라는 이름의 웹 애플리케이션을 찾아감
4. /index.jsp 파일을 찾아감
개발용정리 19.02의 URL 정보그림 참고
웹 애플리케이션 위치
서비스는 서버에서 애플리케이션 단위로 이루어진다.
웹서버마다 자동으로 애플리케이션으로 인식하여 올려주는 디렉터리가 있다.
아파치톰캣을 설치한 디렉터리 하위 파일에 webapps디렉터리에
애플리케이션들이있다.
webapps디렉터리 하위 디렉터리 또는
디렉터리가 압축된 war 파일은 하나의애플리케이션으로 인식한다.
WAS의 종류에 따라 애플리케이션이 위치하는 디렉터리의 이름이 다를수 있다.
웹 애플리케이션의 구조
워크 스페이스 안에 만든 프로젝트이름은 웹프로젝트이름이고 루트 디렉터리는
WebContent 이다 이 디렉터리가 톰캣의 webapps의 하위 디렉터리에 해당한다.
어차피 애플리케이션 루트 디렉터리는 URL에서 "/"라는 기호로 접근하므로 디렉터리 이름이 무엇인지는
상관이 없다.
웹애플리케이션들이 공통으로 가져야하는 디렉터리와 파일이 있는데
WEB-INF 디렉터리와 하위의 web.xml 파일이다.
클래스파일은 classes 디렉터리 밑에
jar파일은 lib 밑에 위치시켜야 서버에서 자동으로 인식이가능함.
환경 설정 파일 web.xml
웹서버가 서비스를 시작하기 위해 구동할 때 서버에서 많은 일이 일어난다.
클라이언트에 서비스하기 위해 웹 애플리케이션을 준비하는 작업
웹서버는 web.xml 파일을 읽는다.(웹 애플리케이션의 서비스 처리를 위한 설정파일)
웹 애플리케이션 서비스 시작시 웹 서버가 읽어서 사용하는 파일이다.
서블릿 디렉터리
서블릿디렉터리는 공식적으로 존재하는 디렉터리(서블릿 컨테이너를 내장한)
모든 WAS의 구조는 같다 .
서블릿 디렉터리라는 웹 애플리케이션의 루트 디렉터리 하위의
WEB-INF/classes
이클립스에서 자바소스를 작성하서 자동으로 컴파일 되어 클래스 파일이 생성된다.
WEB-INF/classes로 지정하러면 프로젝트에서 다음과 같이 한번만 설정해주면된다.
1.BuildPath -> Configure BuildPath 를선택
2.Source 탭을 선택후 Browse를 선택한다.
3.폴더 목록에서 edu>WebContent/ 아래 WEB-INF 폴더선택후
4.classes폴더를 만듬
5.자바 소스 컴파일후 출력위치가 변경된 것을 볼수 있다.
서블릿 구현
웹브라우저에서 클라이언트 요청에 따라 서버가 실행할수 있는 자바프로그램은 서블릿뿐이다.
서블릿 객체의 상속구조와 생명주기
서블릿 클래스 간의 관계
서블릿을 구현할때 반드시 상속받아야 하는 클래스가 있는데.
HttpServlet 클래스이다.
HttpServlet에는 웹상에서 클라이언트 요청이 있을때 해당서블릿을 실행하는
모든 조건이 포함되어있다.
그래서 모든 서블릿은 반드시 HttpServlet을 상속 받아야한다.
HttpServlet을 상속받지 않은 클래스는 서블릿이라 할 수 없고 , 따라서
클라이언트가 실행을 요청하여도 실행되지 않는다.
Servlet 인터페이스
Servlet은 서블릿 프로그램을 개발할때 반드시 구현해야하는 메소드를 선언 하고있는 인터페이스
init()
service()
destroy()
getServletConfig()
getServletInfo()
등 5개의 메소드를 선언하고 있다.
이는 서블릿 프로그램의 생명주기와 연관된 메소드들
GenericServlet 클래스
Servlet인터페이스를 상혹하여 클라이언트 서버환경에서
서버단의 필요한 기능을 구현한 추상클래스
service를 재외한 모든 메소드를 재저의하여 적절한 기능으로 구현
GenericServlet 클래스를 상속하면
애플리케이션의 프로토콜에 따라 재정의 구문을 적용해야함
HttpServlet 클래스
Http프로토콜에 맞게 동작을 수행하도록 구현한 클래스
반드시 재정의해야하는 메소드는 없으며
어떤 요청방식을 지원하는 서블릿인지에 따라서
필요한 메소드를 재정의하여 구현한다.
서블릿 실행 순서
서블릿의 실행 순서를 이해하려면 IoC라는 개념을 알아야한다.
Java SE프로그램은 개발자가 main()메소드 안에 구현한 순서대로 실행한다.
즉 프로그램이 실행되는 순서를 개발자가 제어한다.
그러나 Java EE 기반 프로그램은 실행의 흐름은 개발자가 제어하는 것이아니라
컨테이너가 제어한다.
개발자가 아닌 제3자가 프로그램의 실행의 흐름을 제어하는 것을 IoC(Inversion of Control)
우리말로하면 제어의 역전 이라고한다.
서블릿도 여기에 속함
EE기반 컨테이너들이 프로그램을 어떤 순서로 동작시키는지 알고 해당 순서에 맞게 개발해야한다.
서블릿의 실행순서와 설명
1. 클라이언트로부터 처리 요청을 받음
클라이언트가 웹브라우저를 통해 요청을 보내면 웹서버는 이를 받아서 요청정보의 헤더 안에
URI를 분석함 이때 요청받으 페이지가 서블릿이면 서블릿 컨테이너에 처리를 넘김.
서블릿 컨네이너는 요청받은 서블릿을 WEB-INF/classes 나 WEB-INF/lib에서
찾아서 실행 준비함
2.최초 요청의 여부 판단
서블릿 컨테이너는 현재 실행할 서블릿이 최초 요청인지 판단한다. 실행할 서블릿 객체가 메모리에
없으면 최초요처잉고, 이미 있으면 최초요청이 아닌것으로 판단한다. 최초요청은
말그대로 처음 요청할때 딱한번만 실행된다.
3.서블릿 객체 생성
서블릿 컨테이너는 요창받은 서블릿이 최초의 요청이라면 해당 서블릿을 메모리에 로딩하곡 개체를 생성한다.
일반 자바 객체는 new 명령문으로 여려개의 객체를 직접생성할 수있지만, 서블릿은 최초요청이들어왔을때
한번만 객체를 생성하고 이때 생성된 객체를 계속 사용한다.
4.init()메소드 실행
init()은 서블릿 객체가 생성된 다음에 호출되는 메소드로서 ,Servlet인터페이스에 선언되어있고
기능은 GenericServlet 클래스에 구현되어있다. init() 메소드는 처음 요청시 서블릿 객체가 생성된 다음
호출되므로 주로 서블릿 객체의 초기화 작업이 구현되어있다.
GenericServlet 클래스에 구현되 내용을 바꾸고 싶으면 메소드를 오버라이드한다.
5. service() 메소드 실행
service() 메소드는 실행하는 서블릿의 요청 순서에 상관없이 클라이언트이 요청이 있을때마다
실행된다.
service메소드에는 실제로 처리해야하는 내용이 구현되어있다.
service 메소드는 Servlet인터페이스에 선언 되어있고 , GenericServlet클래스에
abstract 메소드로 선언되어 있으므로 HttpServlet 클래스에 메소드 몸체가
구현되어있다. HttpServlet클래스에 구현된 내용을 변경하고싶으면
service를 오버라이드하면 된다.
service() 메소드가 끝나면 서버에서 실행은 끝난다.
서버프로그램이 실행이 완료된 후에는 서블릿 컨테이너가 실행결과를 웹서버에 전달하고
웹서버는 서비스를 요청한 클라이언트에 응답한다.
콜백메소드와 서블릿 객체의 생명주기
콜백메소드란?
어떤 객체에서 어떤 상황이 발생하면 컨테이너가 자동으로 호출하여
실행되는 메소드를 의미
서블릿의 콜백 메소드
메소드이름 메소드가 실행되는 시점 실행횟수 기능구현
--------------------------------------------------------------------------
init() 클라이언트로부터 최초로 서블릿 요청이 있을때 실행 1 초기화 작업
service() 클라이언트로 부터 요청이 있을때 마다 실행 N 실제 서블릿이 처리해야하는 작업
destroy() 서블릿 객체가 메모리에서 삭제될 떄 실행 1 자원 해제 작업
서블릿 객체의 생성
서블릿 객체의 생성과 삭제 시점
서버입장에서 최초로 서블릿 요청이 있을때
서블릿컨테이너는 해당 서블릿 객체를 메모리에 생성한다음 ,init()->service() 순으로 실행.
이후 같은 서블릿 요청이 있으면 최초요청시 생성한 서블릿 객체의service() 메소드를 실행한다.
서블릿은 한번 생성한 객체를 재사용하는것에서 처리속도, 메모리 부분에서 이전 기술보다 효율적인 장점이 있다.
서블릿 객체의 삭제
최초 요청시 생성되 서블릿 객체가 삭제되는 시점은 서버를 중지시켜줄 웹 애플리케이션 서비스를 중지할때이다.
웹 서버에서 전체 서비스를 중지 할 수도 있고 일부 서비스만 중지 할수도 있다.
어떤 상황이든지 서블릿 객체가 삭제되는 시점은 웹서에서 웹애플리케이션 서비스가 중지되는 시점에
destroy() 메소드가 실행
서블릿은 최초 요청시 객체가 생성되고 이때 생성된 객체가 재사용되며, 서버가 중지 될대 서블릿 객체는 비로소 삭제된다.
서블릿 실행
WEB-INF/classes 나 WEB-INF/lib 디렉터리에 있는 파일들은 웹애플리케이션 서버가 사용한다.
그러나WEB-INF 밑에서 웹문서를 만들면 ,
WEB-INF는 웹서버가 사용하는 파일들이 들어있는 중요한 디렉터리이기때문에 외부에서 접근할수 없도록 막아져있다.
외부에서 클라이언트가 접근할수가 없다.
그러므로 서버쪽에 설정이필요함
1. web.xml 설정을 이용해서 접근하는
2. servlet 3.0 이상 부터는 어노테이션부터 접근가능
1.web.xml 설정을 통해 접근
프로젝트 마우스 오른쪽 클릭
Java EE Tools > Generate Deployment Descriptor Stub
기본적인 web.xml 파일이 생성됨.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>edu</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
welcome file-list 사이에 소스를 지우고 다음과 같은 소스 작성
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>edu</display-name>
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>com.edu.test.FirstServiet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
서버를 작동시킨뒤 edu/hello로 접근하면.
init하고 service 가 실행되는 것을 볼 수 있다.
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>com.edu.test.FirstServiet</servlet-class>
</servlet>
<servlet>태그는 HttpServlet클래스를 상속받고 있는 클래스를 web.xml에 등록시킬때 사용한다.
<servlet-name>first</servlet-name>
태그를 등록하는 서블릿의 이름부여 개발자가 지정하는 이름 클래스 이름에 등록하면 서블릿 클래스이름이아닌 등록된 서블릿 이름으로 사용해야 올바르게 작동함
<servlet-class>com.edu.test.FirstServiet</servlet-class>
태그를 등록하는 서블릿의 실제 클래스 이름을 지정 웹서버가 서블릿 객체를 찾아 올바르게 서블릿에 관한 설정을 할수 있다.
패키지 명과 대소문자를 구분하여 정확하게 이름을 지정해야한다.
<servlet-mapping>
서블릿 실행 요청할때 사용할 URI를 지정하기 위해 사용한다. <servlet>으로 등록된 서블릿이 아니면 사용할수 없다.
<servlet-name>first</servlet-name>
태그는 실행할 서블릿 이름을 지정한다.
<url-pattern>/hello</url-pattern>
서블릿을 실행할때 사용할 URL을 지정한다. 'http://서버주소:포트번호/웹 애플리케이션 이름'까지는 생략하고 그다음부터 지정하면된다.
</servlet-mapping>
2. @WebServlet으로 접근가능
어노테이션을 통해 접근하려면 서블릿 클래스 선언부압에 @WebServlet(접근시 사용할 URI)를지정하면된다.
xml로 파일을설정하면 여러개의 서블릿을 태그로 등록하기 때문에 관리가 쉽다.
URL값이 변경되어야할때는 소스를 수정하지 않고 도 web.xml 에서 쉽게 변경할 수 있다.
@WebServlet설정방식은 쉽게 URL패턴이 지정가능하나 여러 서블릿에대한 정보를 볼수없고
유지보수성이 떨어지고 , 패턴값이 달리지면 소스를 수정해야함.
요청 방식에 따른 실행
서블릿이 실행될때 service메소드가 자동으로 실행된다.
HttpServlet 클래스에 service 메소드의 몸체를 구현해야한다.
요청이있을때 호출되므로 재정의 해야한다.
service를 재정의 하지 않을때가 있다.
service를 그대로 사용하고 싶을때는 기존에 것을 사용
1. protected void service (HttpServletRequeest req , HttpServletResponse resp)
2. public void service (ServletRequest req , ServletResponse resp)
서블릿 요청시에 2번이 실행결과를
2번 서비스는 단순히 같은 객체에 있는 1번 service()호출만해줌
1번 형태의 service 메소드는 클라이언트의 실행요청에 따라 서로 다른 메소드를 호출하도록 구현되어있음
1번형태의 service메소드는 바로 이 요청방식 정보를 추출후
추출된 요청방식 정보에 따라 서로 다른메소드를 호출하도록 구현되어있다.
service() 를 재정의 할것인지 , doGet,doPost 를 재정의 할 것인지는
상황에 맞게 하면됨
제출하는 상황에는 제출시에만 페이지가 넘어가야하므로
doPost()메소드에 서비스처리를 구현하면 된다.
'Servlet' 카테고리의 다른 글
서블릿 디렉터리를 WEB-INF/classes 로지정하는 이유 (0) 2019.02.21 요청정보와 응답정보 (0) 2019.02.20 개발환경 구축 (0) 2019.02.20 HTTP 프로토콜의 이해 (0) 2019.02.20 자바와 웹 (0) 2019.02.20