상세 컨텐츠

본문 제목

[Servlet] Servlet 실행 방법 / @WebServlet

Backend/JSP & Servlet

by hyeminyy 2023. 11. 25. 17:38

본문

728x90

서블릿 실행

Servlet 파일을 담을 Package를 만들어보자. src 폴더에 마우스 오른쪽 버튼을 누르고 단축메뉴에서 [New] -> [Package]를 선택한다.

package 이름은 co.kr.test ,보통 패키지 이름은 도메인으로 하는 것이 편할 것이다.

패키지를 만들고. src 디렉터리 아래 kr.co.test 패키지가 생성이 된다. 그리고 kr.co.test에 마우스 오른쪽을 누르고,

[New] -> [Class] 를 선택하여 FirstServlet 파일을 하나 만들어준다. ( 다른 이름 사용해도 괜찮다. )

새 클래스 파일을 만들고, 다음과 같이 작성한다.

import javax.servlet.http.HttpServlet;

서블릿을 작성하기 위해 상속받아야 하는 HttpServlet 클래스가 있는 패키지를 포함하는 소스이다.

public class FirestServlet extends HttpServlet{

HttpServlet는 서블릿이 웹상에서 HTTP 프로토콜을 이용해 서비스를 처리하기 위한 반드시 상속 받아야하는 클래스이다.

즉, 모든 서블릿 클래스의 상위 클래스는 HttpServlet이어야 한다.

 

Servlet 실행 순서

 

1. 클라이언트로부터 처리 요청을 받는다.

 - 클라이언트가 웹 브라우저를 통해 요청을 보내면 웹서버는 이를 받아서 요청정보의 헤더 안에 있는 URI를 분석한다. 이 때, 요청 받은 페이지가 서블릿이면 서블릿 컨테이너에 처리를 넘긴다. 서블릿 컨테이너는 요청받은 서블릿을 WEB-INF/classes나 WEB-INF/lib에서 찾아서 실행 준비를 합니다.

 

2. 최초의 요청 여부를 판단한다.

 - 서블릿 컨테이너는 현재 실행할 서블릿이 최초의 요청인지를 판단한다. 실행할 서블릿 객체가 메모리에 없으면 최초의 요청이고, 이미 있으면 최초의 요청이 아닌 것으로 판단한다. 최초의 요청은 말 그대로 처음 요청할 때 딱 한 번 실행한다.

 

3. 서블릿 객체 생성한다.

 - 서블릿 컨테이너는 요청받은 서블릿이 최초의 요청이라면 해당 서블릿을 메모리에 로딩하고 객체를 생성한다. 일반 java 객체는 new 명령문으로 여러 개의 객체를 언제든지 직접 생성할 수 있지만, 서블릿은 최초 요청이 들어왔을 때 한 번만 객체를 생성하고 이때 생성된 객체를 계속 사용한다.

 

4. init() 메소드 실행한다.

 - init()는 서블릿 객체가 생성된 다음에 호출되는 메소드로서, Servlet 인터페이스에 선언되어 있고, 기능은 GevericServlet 클래스에 구현되어 있다. init() 메소드는 처음 요청 시 서블릿 객체가 생성된 다음 호출되므로 주로 서블릿 객체의 초기화 작업이 구현되어 있다. GenericSerlvlet 클래스에 구현된 내용을 바꾸고 싶다면 init() 메소드를 재정의하여 원하는 내용으로 변경하면 된다.

 

5. service() 메소드를 실행한다.

 - service() 메소드는 실행하는 서블릿의 요청 순서에 상관없이 클라이언트의 요청이 있을 때마다 실행된다. 따라서 service() 메소드에는 실제 서블릿에서 처리해야 하는 내용이 구현되어 있다. service() 메소드는 Servlet 인터페이스에 선언되어 있고, GenericServlet 클래스에 abstract 메소드로 선언되어 있으므로, HttpServlet 클래스에 메소드 몸체가 구현되어 있다. HttpServlet 클래스에 구현된 내용을 변경하고 싶다면 service() 메소드를 재정의하여 원하는 내용으로 변경하면 된다.

 

Servlet 만들기

 

init() 메소드는 서블릿이 최초로 호출되었을 때 서블릿 컨테이너가 자동으로 실행한다. 서블릿 객체가 생성된 후, 한 번만 실행되므로 서블릿의 초기화 작업을 담당한다.

 

service() 메소드는 클라이언트의 요청이 있을 때마다 매번 서블릿 컨테이너가 자동으로 실행한다. 따라서 서블릿 실행 요청이 있을 때마다 실행되어야 하는 내용을 구현한다.

 

서블릿의 콜백 메소드

메소드 이름 메소드가 실행되는 시점 실행 횟수 기능 구현
init() 클라이언트로부터 최초의 서블릿 요청이 있을 때 실행 1 초기화 작업

service() 클라이언트로부터 요청이 있을 때마다 실행 n 실제 서블릿이 처리해야 하는 작업
destroy() 서블릿 객체가 메모리에서 삭제될 때 실행 (서비스나 서버 중지 시) 1 자원 해제 작업

 

서블릿 객체의 생성

 - 서블릿 객체가 메모리에 생성되는 시점은 서버 입장에서 클라이언트로부터 최초로 서블릿 실행 요청이 있을 때이다. 

 - 서버 입장에서 최초로 서블릿 요청이 있을 때 서블릿 컨테이너는 해당 서블릿 객체를 메모리에 생성한 다음, init() -> service() 순으로 실행한다. 이후에 같은 서블릿 실행 요청이 있으면 최초 요청 시 생성한 서블릿 객체의 service() 메소드를 실행한다.

 - 서블릿은 한 번 생성한 객체를 재사용하여 처리 속도, 메모리 부분에서 효율적이다.

 

서블릿 객체의 삭제

 - 최초 요청 시 생성된 서블릿 객체가 삭제되는 시점은 서버를 중지시켜 웹 애플리케이션 서비스를 중지할 때이다.

 - 전체 또는 일부만 서비스 중지 가능하다. 어떤 상황이든지 서블릿 객체가 삭제되는 시점은 웹 서버에서 웹 애플리케이션 서비스가 중지되는 시점이다. 이 때 destroy() 메소드가 호출되어 실행된다.

 - 서블릿은 최초 요청 시 객제가 생성되고 이때 생성된 객체가 재사용되며, 서버가 중지될 때 서블릿 객체는 삭제된다.

 

WEB-INF는 웹서버가 사용하는 파일이 들어있는 중요한 디렉터리이다. 따라서 외부에서 클라이언트가 곧바로 접근할 수 없도록 막아놓았다.  WEB-INF 우클릭 [New] -> [JSP File] 를 선택하여 파일 이름을 test 라고 입력한다.

<body> test </body> 라고 입력 후 저장한다.

 

[Run As] -> [Run on Server]를 선택하면, 웹 브라우저에서 test.jsp 를 실행한다.

실행하면 404 Not Found라는 응답을 받았다. WEB-INF 디렉터리 자체가 서버에서 서비스되고 있지 않기 때문이다.

 

해결 방법은 ?

 - 클라이언트가 곧바로 /WEB-INF에 접근하면 안 된다.

 - 클라이언트가 서블릿에 접근할 수 있게 하려면 서버 쪽에서 설정해주어야 한다. 

 

1. web.xml 설정을 통한 접근

/wepapp/WEB-INF/web.xml에서 편집 할 것이다.

기존 web.xml 에서 <welcome-file-list></welcome-file-list>  내용을 전부 지워주고

<servlet></servlet> 과 <servlet-mapping></servlet-mapping> 안에 내용을 적어줍니다.

파일 이름 오타있어서 수정 후&nbsp; run 했습니다 !

<servlet-class></servlet-class> 내용 안에는 만든 서블릿 경로를 적어줍니다. 저는 co.kr.test.FirstServlet입니다.

 

FirstServlet.java 파일을 run 해주면 Consol에 init(), Service()가 실행되었다고 뜹니다.

 

다시 또 run을 누르면 이번에는 service() 만 실행된 것을 볼 수 있다.

 

 

<servlet>
	<servlet-name></servlet-name>
    <servlet-class></servlet-class>
</servlet>

 

<servlet> 태그는 HttpServlet을 상속받고 있는 클래스를 web.xml에 등록할 때 사용한다.

<servlet> 태그를 사용하려면 반드시 <servlet-name>, <servlet-class> 태그를 같이 사용해준다.

<servlet-name> 태그는 등록하는 서블릿의 이름으로 개발자가 지정하는 이름이다.

<servlet-class> 태그는 등록하는 서블릿의 실제 클래스 이름을 지정한다. 웹 서버가 서블릿을 찾아갈 때 사용하는 정보로서 패키지명과 함께 대소문자를 정확하게 입력해야 한다.

 

	<servlet-mapping>
  		<servlet-name></servlet-name>
  		<url-pattern></url-pattern>
  	</servlet-mapping>

 

<servlet-mapping> 태그는 web.xml에서 <servlet> 태그로 등록한 서블릿을 실행 요청할 때 사용할 URL을 지정하기 위해 사용한다.

<servelt-name> 태그는 실행할 서블릿 이름을 지정한다. 이 때 지정하는 이름은 반드시 <servlet> 태그에 등록한 서블릿 이름으로 지정해야한다. 아니라면, 오류가 난다.

<url-pattern> 태그는 서블릿을 실행할 때 사용할 URL을 지정한다. 'http://서버주소:포트번호/웹 애플리케이션이름'까지는 생략하고, 그 다음부터만 지정하면 된다. 경로를 지정할 떼는 /를 구분자로 하여 개발자 마음대로 정하면 된다.

 

2. @WebServlet을 통해 접근

어노테이션은 자바 주석문처럼 소스 안에 @ 기호와 함께 사용된다.

 

 

서블릿의 클래스 선언부 앞에 @WebServlet(접근 시 사용할 URI)를 지정하면 된다.

 

그리고 web.xml 파일을 열어 <servlet> ~ </servlet-mapping> 태그까지 모두 주석 후, servlet을 run 시켜주면

 

http://localhost:8080/project/hello2 경로로 서블렛이 실행이 된다.

 

 

@WebServlet 어노테이션 속성 

속성 설명
description 서블릿 설명 입력
displayNames 외부에 표시되는 서블릿 이름
initParams @WebInitParam 어노테이션들 추가
largelcon 서블릿에 사용되는 큰 크기 아이콘 위치
loadOnStartup 서블릿이 컨테이너에 로드되는 순서 지정
name 서블릿 이름
smalllcon 서블릿에서 사용하는 작은 크기 아이콘 위치
urlPatterns 해당 서블릿을 호출할 URL 패턴
value urlPatterns와 같은 용도, 속성 이름 생략 가능

 

 

728x90

관련글 더보기