본문 바로가기

개발/Java

[JAVA - WEB] 서블릿이란?

728x90
반응형
서블릿이란?

 

서블릿은 서버 쪽에서 실행되면서  클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스입니다.

서블릿은 자바의 일반적인 특징을 모두 가집니다. 

서블릿은 일반 자바 프로그램과 다르게 독자적으로 실행되지 못하고 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다는 점에서 일반 자바 프로그램과 차이가 있습니다.

 

서블릿은 여러가지 특징이 있습니다.

 

- 서버 쪽에서 실행되면서 기능 수행

- 기존의 정적인 웹 프로그램의 문제점을 보완하여 동적인 여러가지 기능을 제공

- 스레드 방식으로 실행

- 컨테이너에서 실행되며 컨테이너 종류는 상관없음(플랫폼 독립적)

- 보안 기능 적용 우수

- 웹 브라우저에서 요청 시 기능 수행

 

 

서블릿 API

 

서블릿은 자바로 만들어졌으므로 클래스들 간의 계층 구조를 가집니다.

 

 

서블릿 API 는 Servlet 과 ServletConfig 인터페이스를 구현해 제공하며, GenericServlet 추상 클래스가 이 두 인터페이스의 추상 메서드를 구현합니다. 그리고 이 GenericServlet 을 다시 HttpServlet 이 상속 받습니다.

 

 

서블릿 API 구성요소 특징

구성요소 기능
Servlet 인터페이스 javax.servlet 패키지에 선언되어 있습니다.
Servlet 관련 추상메서드를 선언합니다.
init(), service(), destroy(), getServletInfo(), getServletConfig() 를 선언합니다.
ServletConfig 인터페이스 javax.servlet 패키지에 선언되어 있습니다.
Servlet 기능 관련 추상 메서드가 선언되어 있습니다.
getInitPaarmeter(), getInitParameterNames(), getServletContext(), getServiceName() 이 선언되어 있습니다.
GenericServlet 클래스 javax.servlet 패키지에 선언되어 있습니다.
상위 두 인터페이스를 구현하여 일반적인 서블릿 기능을 구현한 클래스입니다.
GenericServlet 을 상속받아 구현한 사용자 서블릿은 사용되는 프로토콜에 따라 각각 service() 를 오버라이딩해서 구현합니다.
HttpServlet 클래스 javax.servlet.http 패키지에 선언되어 있습니다.
GenericServlet 을 상속받아 HTTP 프로토콜을 사용하는 웹 브라우저에서 서블릿 기능을 수행합니다.
웹 브라우저 기반 서비스를 제공하는 서블릿을 만들때 상속받아 사용합니다.
요청 시 service() 가 호출되면서 요청 방식에 따라 doGet(), doPost() 가 호출됩니다.

 

HttpServlet 은 이름에서 알 수 있듯이 HTTP 프로토콜을 사용하는 서블릿 기능을 구현하는 클래스입니다. 

여기서는 HttpServlet 을 상속받아 HTTP 프로토콜을 동작하는 웹 브라우저의 요청을 처리하는 부분을 사용할 것입니다.

 

 

HttpServlet 메서드 기능

메서드 기능
public service(HttpServletRequest req, HttpServletResponse resp) 클라이언트의 request 를 protected service() 에게 전달합니다.
protected service(HttpServletRequest req, HttpServletResponse resp) 표준 HTTP request 를 public service()에서 전달받아 do...() 메서드를 호출합니다.
protected doHead(HttpServletRequest req, HttpServletResponse resp) 서블릿이 각 메서드의 request 를 수행하기 위해 service() 를 통해서 호출됩니다.
protected doGet(HttpServletRequest req, HttpServletResponse resp)
protected doPost(HttpServletRequest req, HttpServletResponse resp)
protected doDelete(HttpServletRequest req, HttpServletResponse resp)

 

서블릿 생명주기(Life Cycle) 메서드란 서블릿 실행 단계마다 호출되어 기능을 수행하는 콜백 메서드를 말합니다.

 

서블릿 생명주기 메서드 기능

생명주기 단계 호출 메서드 특징
초기화 init() 서블릿 요청 시 맨 처음 한번만 호출됩니다.
서블릿 생성 시 초기화 작업을 수행합니다.
작업수행 doGet()
doPost()
서블릿 요청 시 호출됩니다.
실제로 클라이언트가 요청할때마다 작업을 수행합니다. 
종료 destroy() 서블릿이 기능을 수행하고 메모리에서 수멸될 때 호출됩니다.
서블릿의 마무리 작업을 주로 수행합니다.

 

doGet() 이나 doPost() 와 같은 do 로 시작하는 메서드는 서블릿의 핵심 기능을 처리하므로 반드시 구현해야 합니다.

 

 

 

서블릿 실습

 

서블릿을 만들고 실행하는 과정은 다음과 같습니다.

 

1. 사용자 정의 서블릿 클래스 만들기

2. 서블릿 생명주기 메서드 구현

3. 서블릿 매핑 작업

4. 웹 브라우저에서 서블릿 매핑 이름으로 요청하기

 

 

사용자 정의 서블릿은 HttpServlet 클래스를 상속받아 각 생명주기 메서드들을 오버라이딩 해서 기능을 구현합니다.

 

사용자 정의 서블릿 형식

package ...;

import ...;

public class FirstServlet extends HttpServlet {
	@Override
	public void init() throws ServletException {
		// TODO
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO
	}

	@Override
	public void destroy() {
		// TODO
	}
}

 

그럼 실습을 진행해보겠습니다.

 

먼저 웹 프로젝트를 생성합니다.

웹 프로젝트 생성에 대해서 궁금하신 분들은 앞서 설명했던 이클립스에서 웹 애플리케이션 실행을 참고 하시기 바랍니다.

 

https://jeusyhk.tistory.com/entry/JAVA-WEB-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4%EC%97%90%EC%84%9C-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89 

 

[JAVA - WEB] 이클립스에서 웹 애플리케이션 실행

현재 개발의 편의성을 위해 이클립스와 같은 통합 개발 환경(IDE)을 사용하여 개발하고 있습니다. 이클립스에서 웹 애플리케이션을 생성하여 톰캣 컨테이너에 등록 및 실행하는 방법에 대해서

jeusyhk.tistory.com

 

 

톰캣의 servlet-api.jar 클래스 패스 설정

 

앞의 서블릿 API 들은 톰캣의 servlet-api.jar 러이브러리로 제공되므로 이클립스의 프로젝트에서 서블릿을 사용하려면 반드시 클래스 패스를 설정해야 합니다.

 

프로젝트가 생성 되었으면 프로젝트 이름을 선택하고 마우스 오른쪽 버튼을 클릭한 후 Build Path - Configure Build Path.. 를 선택합니다.

 

 

설정 창에서 Libraries 탭을 클릭하고 Classpath 를 선택한 후 Add Exteral JARs.. 을 클릭합니다.

 

 

CATALINA_HOME(톰캣 루트 디렉터리) 의 lib 디렉터리에 있는 servlet-api.jar 을 선택합니다.

 

 

servlet-api.jar 클래스의 패스 설정을 확인한 후 Apply and Close 클릭해서 종료합니다.

 

 

 

 

서블릿 생성

Java Resources 디렉터리 하위의 src 를 선택하고 마우스 오른쪽 버튼을 클릭한 후 New - Package 를 선택합니다.

패키지 생성 창이 나타나면 이름을 입력하고 Finish 를 클릭합니다.

 

 

만든 패키지에 오른쪽 마우스 클릭하여 New - Class 를 클릭합니다.

클래스 이름을 입력한 후 Finish 를 클릭하면 클래스이름.java 가 생성된 것을 확인할 수 있습니다.

 

 

 

서블릿 매핑

 

서블릿 이름 그대로 요청을 하게 되면 보기에도 안 좋고 보안상에도 좋지 않습니다.

 

http://IP주소:포트번호/프로젝트이름/패키지이름.클래스이름

http://localhost:8090/FirstProject/FirstPackage.FirstServlet

 

그럼으로 서블릿 클래스 이름에 대응되는 서블릿 매핑 이름으로 실제 서블릿을 요청합니다.

웹 브라우저에서 서블릿을 요청하려면 web.xml 에 서블릿을 매핑을 시켜줘야 합니다.

 

	<servlet>
		<servlet-name>aaa</servlet-name>
		<servlet-class>FirstPackage.FirstServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>bbb</servlet-name>
		<servlet-class>FirstPackage.SecondServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>aaa</servlet-name>
		<url-pattern>/first</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>bbb</servlet-name>
		<url-pattern>/second</url-pattern>
	</servlet-mapping>

 

위를 보시면 servlet 와 servlet-mapping 의 동일한 servlet-name 을 통하여 servlet 의 servlet-class 와 servlet-mapping 의 url-pattern 이 연결되는 것을 보실 수 있습니다.

 

매핑된 서블릿을 요청하시려면 이전 게시물을 참고하여 톰캣에 프로젝트를 추가하고 실행한 후 웹 브라우저에 다음과 같이 요청하시면 됩니다.

 

http://127.0.0.1:8090/FirstProject/first

http://localhost:8090/FirstProject/second

 

IP 주소 127.0.0.1 이 localhost 와 같다는건 아시죠? 

 

 

 

애너테이션을 이용한 서블릿 매핑

 

서블릿의 개수가 많아짐에 따라 각 서블릿을 web.xml 에 설정하게 되면 매우 복잡해진다는 단점이 있습니다. 

애너테이션은 각 서블릿 클래스의 소스 코드에 직접 기호(@)를 이용해서 서블릿 기능을 설정하는 방법입니다.

애너테이션을 이용하는 방법이 보다 편하고 효율적일 것입니다.

 

패키지를 선택하고 마우스 오른쪽 버튼을 클릭한 후 New - Servlet 를 선택합니다.

 

 

Class name 을 입력하고 Next 를 클릭합니다.

 

 

URL mappings 의 /TestServlet 를 선택하고 Edit 를 클릭합니다.

/TestServlet 를 /test 로 변경한 후 OK 를 누릅니다.

 

변경된 매핑 이름을 확인한 후 Next 를 클릭합니다.

 

 

생명주기 메소드를 선택한 후 Finish 를 클릭합니다.( init(), destroy(), doGet(), doPost() )

 

 

서블릿이 생성된 것을 확인하실 수 있습니다.

웹 브라우저에서 URL mapping 에서 입력한 /test 로 요청을 하시면 해당 서블릿의 메서드가 호출됩니다.

호출이 되지 않을 경우에는 톰캣을 정지 시켰다가 다시 실행해주시던지 아니면 재시작을 해주시면 됩니다.

 

애너테이션을 사용할때 주의할 점은 반드시 매핑 이름이 이미 사용된 매핑 이름과 중복되지 않도록 해야 합니다.

중복해서 사용하게 된다면 ... 반드시 에러가 발생하겠죠?

 

 

여기까지 임미다.

 

 

728x90